ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCA0Y2M2NjI5Li4zN2Q0MTU4IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0yLDYgKzIsMTAgQEAKIENoYW5nZXMgc2luY2UgVS1Cb290IDEuMS40OgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisqIE1lcmdlIHRoZSBuZXcgTkFORCBjb2RlICh0ZXN0aW5nLU5BTkQgYnJhY2gpOyBzZWUgZG9jL1JFQURNRS5uYW5kCisgIFJld3JpdGUgb2YgTkFORCBjb2RlIGJhc2VkIG9uIHdoYXQgaXMgaW4gMi42LjEyIExpbnV4IGtlcm5lbAorICBQYXRjaCBieSBMYWRpc2xhdiBNaWNobCwgMjkgSnVuIDIwMDUKKwogKiBBZGQgbG93Ym9vdCB0YXJnZXQgdG8gbWNjMjAwIGJvYXJkCiAgIFBhdGNoIGJ5IFN0ZWZhbiBSb2VzZSwgNCBNYXIgMjAwNgogCmRpZmYgLS1naXQgYS9NQUtFQUxMIGIvTUFLRUFMTAppbmRleCBjYTY2NDU2Li5kNDQwMGZlIDEwMDc1NQotLS0gYS9NQUtFQUxMCisrKyBiL01BS0VBTEwKQEAgLTE3NywxMCArMTc3LDEwIEBACiAJYXA5MjB0CQlhcDkyMl9YQTEwCWFwOTI2ZWpzCWFwOTQ2ZXMJCVwKIAlhcDk2NgkJY3A5MjB0CQljcDkyMl9YQTEwCWNwOTI2ZWpzCVwKIAljcDk0NmVzCQljcDk2NgkJbHBkN2E0MDAJbXAydXNiCQlcCi0JbXgxYWRzCQlteDFmczIJCW9tYXAxNTEwaW5uCW9tYXAxNjEwaDIJXAotCW9tYXAxNjEwaW5uCW9tYXA3MzBwMglzY2I5MzI4CQlzbWRrMjQwMAlcCi0Jc21kazI0MTAJdHJhYgkJVkNNQTkJCXZlcnNhdGlsZQlcCi0JdmVyc2F0aWxlYWIJdmVyc2F0aWxlcGIJdm9pY2VibHVlCisJbXgxYWRzCQlteDFmczIJCW5ldHN0YXIJCW9tYXAxNTEwaW5uCVwKKwlvbWFwMTYxMGgyCW9tYXAxNjEwaW5uCW9tYXA3MzBwMglzY2I5MzI4CQlcCisJc21kazI0MDAJc21kazI0MTAJdHJhYgkJVkNNQTkJCVwKKwl2ZXJzYXRpbGUJdmVyc2F0aWxlYWIJdmVyc2F0aWxlcGIJdm9pY2VibHVlCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMzBhMWQxZi4uNDg1YzRjMyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEyOCw2ICsxMjgsNyBAQAogTElCUyArPSBkcml2ZXJzL3NrOThsaW4vbGlic2s5OGxpbi5hCiBMSUJTICs9IHBvc3QvbGlicG9zdC5hIHBvc3QvY3B1L2xpYmNwdS5hCiBMSUJTICs9IGNvbW1vbi9saWJjb21tb24uYQorTElCUyArPSAkKEJPQVJETElCUykKIC5QSE9OWSA6ICQoTElCUykKIAogIyBBZGQgR0NDIGxpYgpAQCAtMTQ4NSw2ICsxNDg2LDE3IEBACiBteDFmczJfY29uZmlnCToJdW5jb25maWcKIAlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIGFybSBhcm05MjB0IG14MWZzMiBOVUxMIGlteAogCituZXRzdGFyXzMyX2NvbmZpZwlcCituZXRzdGFyX2NvbmZpZzoJCXVuY29uZmlnCisJQGlmIFsgIiQoZmluZHN0cmluZyBfMzJfLCRAKSIgXSA7IHRoZW4gXAorCQllY2hvICIuLi4gMzJNQiBTRFJBTSIgOyBcCisJCWVjaG8gIiNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUgU1pfMzJNIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJZWxzZSBcCisJCWVjaG8gIi4uLiA2NE1CIFNEUkFNIiA7IFwKKwkJZWNobyAiI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRSBTWl82NE0iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwlmaQorCUAuL21rY29uZmlnIC1hIG5ldHN0YXIgYXJtIGFybTkyNXQgbmV0c3RhcgorCiBvbWFwMTUxMGlubl9jb25maWcgOgl1bmNvbmZpZwogCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgYXJtIGFybTkyNXQgb21hcDE1MTBpbm4KIApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMgYi9ib2FyZC9hbWNjL2JhbWJvby9iYW1ib28uYwppbmRleCA4MDM5OTVhLi43Yzk4OTIwIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL2JhbWJvby9iYW1ib28uYworKysgYi9ib2FyZC9hbWNjL2JhbWJvby9iYW1ib28uYwpAQCAtMjc3LDcgKzI3Nyw3IEBACiB9CiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2JhbWJvby9jb25maWcubWsgYi9ib2FyZC9hbWNjL2JhbWJvby9jb25maWcubWsKaW5kZXggMzVjYjY1NS4uYjY0OTVkZSAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9iYW1ib28vY29uZmlnLm1rCisrKyBiL2JvYXJkL2FtY2MvYmFtYm9vL2NvbmZpZy5tawpAQCAtMzIsMyArMzIsNyBAQAogaWZlcSAoJChkYmNyKSwxKQogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDRkdfSU5JVF9EQkNSPTB4OGNmZjAwMDAKIGVuZGlmCisKKyMgbGVnYWN5IG5hbmQgc3VwcG9ydAorQk9BUkRMSUJTID0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCisKZGlmZiAtLWdpdCBhL2JvYXJkL2Jtdy9jb25maWcubWsgYi9ib2FyZC9ibXcvY29uZmlnLm1rCmluZGV4IGY5OTE1NDkuLjEwYjdhOWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Jtdy9jb25maWcubWsKKysrIGIvYm9hcmQvYm13L2NvbmZpZy5tawpAQCAtMzAsMyArMzAsNCBAQAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURFTUJFRERFRCAtREJJR19FTkRJQU5fSE9TVCAtRElOQ0xVREVfNTcwMV9BWF9GSVg9MVwKIAkJICAgICAtRERCRz0wIC1EVDNfSlVNQk9fUkNWX1JDQl9FTlRSWV9DT1VOVD0yNTZcCiAJCSAgICAgLURURVhUX0JBU0U9JChURVhUX0JBU0UpCisKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvTWFrZWZpbGUgYi9ib2FyZC9kYXZlL1BQQ2hhbWVsZW9uRVZCL01ha2VmaWxlCmluZGV4IDM5ZDJmZWMuLjU4MWE1ODAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvTWFrZWZpbGUKKysrIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogCiBMSUIJPSBsaWIkKEJPQVJEKS5hCiAKLU9CSlMJPSAkKEJPQVJEKS5vIGZsYXNoLm8KK09CSlMJPSAkKEJPQVJEKS5vIGZsYXNoLm8gbmFuZC5vCiAKICQoTElCKToJJChPQkpTKSAkKFNPQkpTKQogCSQoQVIpIGNydiAkQCAkXgpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9QUENoYW1lbGVvbkVWQi5jIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9QUENoYW1lbGVvbkVWQi5jCmluZGV4IDVmMmM3MDUuLjUyMDU1YjggMTAwNjQ0Ci0tLSBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvUFBDaGFtZWxlb25FVkIuYworKysgYi9ib2FyZC9kYXZlL1BQQ2hhbWVsZW9uRVZCL1BQQ2hhbWVsZW9uRVZCLmMKQEAgLTIzOCwzMyArMjM4LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLWV4dGVybiB1bG9uZwotbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKLQotdm9pZAotbmFuZF9pbml0KHZvaWQpCi17Ci0JdWxvbmcgdG90bGVuID0gMDsKLQotLyoKLQlUaGUgSEkgbW9kZWwgaXMgZXF1aXBwZWQgd2l0aCBhIGxhcmdlIGJsb2NrIE5BTkQgY2hpcCBub3Qgc3VwcG9ydGVkIHlldAotCWJ5IFUtQm9vdAotICAgIChDT05GSUdfUFBDSEFNRUxFT05fTU9EVUxFX01PREVMID09IENPTkZJR19QUENIQU1FTEVPTl9NT0RVTEVfSEkpCi0qLwotCi0jaWYgKENPTkZJR19QUENIQU1FTEVPTl9NT0RVTEVfTU9ERUwgPT0gQ09ORklHX1BQQ0hBTUVMRU9OX01PRFVMRV9NRSkKLQlkZWJ1ZyAoIlByb2JpbmcgYXQgMHglLjh4XG4iLCBDRkdfTkFORDBfQkFTRSk7Ci0JdG90bGVuICs9IG5hbmRfcHJvYmUgKENGR19OQU5EMF9CQVNFKTsKLSNlbmRpZgkvKiBDT05GSUdfUFBDSEFNRUxFT05fTU9EVUxFX01FLCBDT05GSUdfUFBDSEFNRUxFT05fTU9EVUxFX0hJICovCi0KLQlkZWJ1ZyAoIlByb2JpbmcgYXQgMHglLjh4XG4iLCBDRkdfTkFORDFfQkFTRSk7Ci0JdG90bGVuICs9IG5hbmRfcHJvYmUgKENGR19OQU5EMV9CQVNFKTsKLQotCXByaW50ZiAoIiUzbHUgTUJcbiIsIHRvdGxlbiA+PjIwKTsKLX0KLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0NGQl9DT05TT0xFCiAjIGlmZGVmIENPTkZJR19DT05TT0xFX0VYVFJBX0lORk8KICMgaW5jbHVkZSA8dmlkZW9fZmIuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvY29uZmlnLm1rIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKaW5kZXggNTg1NmFlYy4uNWQzZGYwYyAxMDA2NDQKLS0tIGEvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKKysrIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIChDKSBDb3B5cmlnaHQgMjAwMAorIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYKICMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICMKICMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKQEAgLTIyLDcgKzIyLDE0IEBACiAjCiAKICMgUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IKLVRFWFRfQkFTRSA9IDB4RkZGQzAwMDAKKyNURVhUX0JBU0UgPSAweEZGRkMwMDAwCiAKICMgUmVzZXJ2ZSAzMjAga0IgZm9yIE1vbml0b3IKLSNURVhUX0JBU0UgPSAweEZGRkIwMDAwCitURVhUX0JBU0UgPSAweEZGRkIwMDAwCisKKyMgQ29tcGlsZSB0aGUgbmV3IE5BTkQgY29kZSAoQ0ZHX05BTkRfTEVHQUNZIG11c3RuJ3QgYmUgZGVmaW5lZCkKK0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZC9saWJuYW5kLmEKKworIyBDb21waWxlIHRoZSBsZWdhY3kgTkFORCBjb2RlIChDRkdfTkFORF9MRUdBQ1kgbXVzdCBiZSBkZWZpbmVkKQorI0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZF9sZWdhY3kvbGlibmFuZF9sZWdhY3kuYQorCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZlL1BQQ2hhbWVsZW9uRVZCL25hbmQuYyBiL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZWRjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZlL1BQQ2hhbWVsZW9uRVZCL25hbmQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCisjaW5jbHVkZSA8bmFuZC5oPgorCisvKgorICogaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKKyAqIGZ1bmN0aW9uIGJvcnJvd2VkIGZyb20gTGludXggMi42IChkcml2ZXJzL210ZC9uYW5kL3BwY2hhbWVsZW9uZXZiLmMpCisgKi8KK3N0YXRpYyB2b2lkIHBwY2hhbWVsZW9uZXZiX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZGluZm8sIGludCBjbWQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZGluZm8tPnByaXY7CisJdWxvbmcgYmFzZSA9ICh1bG9uZykgdGhpcy0+SU9fQUREUl9XOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgTkFORF9DVExfU0VUQ0xFOgorCQlNQUNST19OQU5EX0NUTF9TRVRDTEUoKHVuc2lnbmVkIGxvbmcpYmFzZSk7CisJCWJyZWFrOworCWNhc2UgTkFORF9DVExfQ0xSQ0xFOgorCQlNQUNST19OQU5EX0NUTF9DTFJDTEUoKHVuc2lnbmVkIGxvbmcpYmFzZSk7CisJCWJyZWFrOworCWNhc2UgTkFORF9DVExfU0VUQUxFOgorCQlNQUNST19OQU5EX0NUTF9TRVRBTEUoKHVuc2lnbmVkIGxvbmcpYmFzZSk7CisJCWJyZWFrOworCWNhc2UgTkFORF9DVExfQ0xSQUxFOgorCQlNQUNST19OQU5EX0NUTF9DTFJBTEUoKHVuc2lnbmVkIGxvbmcpYmFzZSk7CisJCWJyZWFrOworCWNhc2UgTkFORF9DVExfU0VUTkNFOgorCQlNQUNST19OQU5EX0VOQUJMRV9DRSgodW5zaWduZWQgbG9uZyliYXNlKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6CisJCU1BQ1JPX05BTkRfRElTQUJMRV9DRSgodW5zaWduZWQgbG9uZyliYXNlKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiByZWFkIGRldmljZSByZWFkeSBwaW4KKyAqIGZ1bmN0aW9uICsvLSBib3Jyb3dlZCBmcm9tIExpbnV4IDIuNiAoZHJpdmVycy9tdGQvbmFuZC9wcGNoYW1lbGVvbmV2Yi5jKQorICovCitzdGF0aWMgaW50IHBwY2hhbWVsZW9uZXZiX2RldmljZV9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZGluZm8pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZGluZm8tPnByaXY7CisJdWxvbmcgcmJfZ3Bpb19waW47CisKKwkvKiB1c2UgdGhlIGJhc2UgYWRkciB0byBmaW5kIG91dCB3aGljaCBjaGlwIGFyZSB3ZSBkZWFsaW5nIHdpdGggKi8KKwlzd2l0Y2goKHVsb25nKSB0aGlzLT5JT19BRERSX1cpIHsKKwljYXNlIENGR19OQU5EMF9CQVNFOgorCQlyYl9ncGlvX3BpbiA9IENGR19OQU5EMF9SRFk7CisJCWJyZWFrOworCWNhc2UgQ0ZHX05BTkQxX0JBU0U6CisJCXJiX2dwaW9fcGluID0gQ0ZHX05BTkQxX1JEWTsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXJldHVybiAwOworCQlicmVhazsKKwl9CisKKyAgICAgICAgaWYgKGluMzIoR1BJTzBfSVIpICYgcmJfZ3Bpb19waW4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBOQU5EIGluaXRpYWxpemF0aW9uLiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgb2YgdGhlCisgKiBhcmd1bWVudCBhcmUgYm9hcmQtc3BlY2lmaWMgKHBlciBpbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgpOgorICogLSBJT19BRERSX1I/OiBhZGRyZXNzIHRvIHJlYWQgdGhlIDggSS9PIGxpbmVzIG9mIHRoZSBmbGFzaCBkZXZpY2UKKyAqIC0gSU9fQUREUl9XPzogYWRkcmVzcyB0byB3cml0ZSB0aGUgOCBJL08gbGluZXMgb2YgdGhlIGZsYXNoIGRldmljZQorICogLSBod2NvbnRyb2w6IGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFjY2VzaW5nIGNvbnRyb2wtbGluZXMKKyAqIC0gZGV2X3JlYWR5OiBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciAgYWNjZXNpbmcgZGV2aWNlIHJlYWR5L2J1c3kgbGluZQorICogLSBlbmFibGVfaHdlY2M/OiBmdW5jdGlvbiB0byBlbmFibGUgKHJlc2V0KSAgaGFyZHdhcmUgZWNjIGdlbmVyYXRvci4gTXVzdAorICogICBvbmx5IGJlIHByb3ZpZGVkIGlmIGEgaGFyZHdhcmUgRUNDIGlzIGF2YWlsYWJsZQorICogLSBlY2Ntb2RlOiBtb2RlIG9mIGVjYywgc2VlIGRlZmluZXMKKyAqIC0gY2hpcF9kZWxheTogY2hpcCBkZXBlbmRlbnQgZGVsYXkgZm9yIHRyYW5zZmVyaW5nIGRhdGEgZnJvbSBhcnJheSB0bworICogICByZWFkIHJlZ3MgKHRSKQorICogLSBvcHRpb25zOiB2YXJpb3VzIGNoaXAgb3B0aW9ucy4gVGhleSBjYW4gcGFydGx5IGJlIHNldCB0byBpbmZvcm0KKyAqICAgbmFuZF9zY2FuIGFib3V0IHNwZWNpYWwgZnVuY3Rpb25hbGl0eS4gU2VlIHRoZSBkZWZpbmVzIGZvciBmdXJ0aGVyCisgKiAgIGV4cGxhbmF0aW9uCisgKiBNZW1iZXJzIHdpdGggYSAiPyIgd2VyZSBub3Qgc2V0IGluIHRoZSBtZXJnZWQgdGVzdGluZy1OQU5EIGJyYW5jaCwKKyAqIHNvIHRoZXkgYXJlIG5vdCBzZXQgaGVyZSBlaXRoZXIuCisgKi8KK3ZvaWQgYm9hcmRfbmFuZF9pbml0KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCit7CisKKwluYW5kLT5od2NvbnRyb2wgPSBwcGNoYW1lbGVvbmV2Yl9od2NvbnRyb2w7CisJbmFuZC0+ZGV2X3JlYWR5ID0gcHBjaGFtZWxlb25ldmJfZGV2aWNlX3JlYWR5OworCW5hbmQtPmVjY21vZGUgPSBOQU5EX0VDQ19TT0ZUOworCW5hbmQtPmNoaXBfZGVsYXkgPSBOQU5EX0JJR19ERUxBWV9VUzsKKwluYW5kLT5vcHRpb25zID0gTkFORF9TQU1TVU5HX0xQX09QVElPTlM7Cit9CisjZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMgYi9ib2FyZC9lc2QvYXNoNDA1L2FzaDQwNS5jCmluZGV4IDAzYWU3ZmQuLjg0ZmMzYTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMKKysrIGIvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCiB2b2lkIG5hbmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2FzaDQwNS9jb25maWcubWsgYi9ib2FyZC9lc2QvYXNoNDA1L2NvbmZpZy5tawppbmRleCAxZDc0M2E5Li4zY2Y1ZGQ4IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvYXNoNDA1L2NvbmZpZy5taworKysgYi9ib2FyZC9lc2QvYXNoNDA1L2NvbmZpZy5tawpAQCAtMjYsMyArMjYsNiBAQAogIwogCiBURVhUX0JBU0UgPSAweEZGRkMwMDAwCisKKyMgQ29tcGlsZSB0aGUgbGVnYWN5IE5BTkQgY29kZSAoQ0ZHX05BTkRfTEVHQUNZIG11c3QgYmUgZGVmaW5lZCkKK0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZF9sZWdhY3kvbGlibmFuZF9sZWdhY3kuYQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NtczcwMC9jbXM3MDAuYyBiL2JvYXJkL2VzZC9jbXM3MDAvY21zNzAwLmMKaW5kZXggZTRjZmUxNC4uZTI4M2E5MiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NtczcwMC9jbXM3MDAuYworKysgYi9ib2FyZC9lc2QvY21zNzAwL2NtczcwMC5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKIHZvaWQgbmFuZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY21zNzAwL2NvbmZpZy5tayBiL2JvYXJkL2VzZC9jbXM3MDAvY29uZmlnLm1rCmluZGV4IDVjM2MwMWMuLjBjNTZjNDAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jbXM3MDAvY29uZmlnLm1rCisrKyBiL2JvYXJkL2VzZC9jbXM3MDAvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw2IEBACiAjCiAKIFRFWFRfQkFTRSA9IDB4RkZGQzAwMDAKKworIyBDb21waWxlIHRoZSBsZWdhY3kgTkFORCBjb2RlIChDRkdfTkFORF9MRUdBQ1kgbXVzdCBiZSBkZWZpbmVkKQorQk9BUkRMSUJTID0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMgYi9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMKaW5kZXggMWRlY2MwZS4uNWE3MDE3NiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NvbW1vbi9hdXRvX3VwZGF0ZS5jCisrKyBiL2JvYXJkL2VzZC9jb21tb24vYXV0b191cGRhdGUuYwpAQCAtMjMsMTAgKzIzLDE1IEBACiAgKi8KIAogI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZuZGVmIENGR19OQU5EX0xFR0FDWQorI2Vycm9yIENGR19OQU5EX0xFR0FDWSBub3QgZGVmaW5lZCBpbiBhIGZpbGUgdXNpbmcgdGhlIGxlZ2FjeSBOQU5EIHN1cHBvcnQhCisjZW5kaWYKKwogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxpbWFnZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGZhdC5oPgogCiAjaW5jbHVkZSAiYXV0b191cGRhdGUuaCIKQEAgLTM3LDYgKzQyLDkgQEAKICNlcnJvciAibXVzdCBkZWZpbmUgQ0ZHX0NNRF9GQVQiCiAjZW5kaWYKIAorCisKKwogZXh0ZXJuIGF1X2ltYWdlX3QgYXVfaW1hZ2VbXTsKIGV4dGVybiBpbnQgTl9BVV9JTUFHRVM7CiAKQEAgLTc2LDkgKzg0LDkgQEAKICNkZWZpbmUgTkFORFJXX0pGRlMyCTB4MDIKICNkZWZpbmUgTkFORFJXX0pGRlMyX1NLSVAJMHgwNAogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tdOwotZXh0ZXJuIGludCBuYW5kX3J3KHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKK2V4dGVybiBpbnQgbmFuZF9sZWdhY3lfcncoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgaW50IGNtZCwgc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuLAogCQkgICBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1Zik7Ci1leHRlcm4gaW50IG5hbmRfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKK2V4dGVybiBpbnQgbmFuZF9sZWdhY3lfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKICNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLwogCiBleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCBpZGVfZGV2X2Rlc2NbQ0ZHX0lERV9NQVhERVZJQ0VdOwpAQCAtMjU5LDkgKzI2Nyw5IEBACiAJCX0gZWxzZSB7CiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKIAkJCXByaW50ZigiVXBkYXRpbmcgTkFORCBGTEFTSCB3aXRoIGltYWdlICVzXG4iLCBhdV9pbWFnZVtpXS5uYW1lKTsKLQkJCWRlYnVnICgibmFuZF9lcmFzZSglbHgsICVseCk7XG4iLCBzdGFydCwgZW5kKTsKLQkJCXJjID0gbmFuZF9lcmFzZSAobmFuZF9kZXZfZGVzYywgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSwgMCk7Ci0JCQlkZWJ1ZyAoIm5hbmRfZXJhc2UgcmV0dXJuZWQgJXhcbiIsIHJjKTsKKwkJCWRlYnVnICgibmFuZF9sZWdhY3lfZXJhc2UoJWx4LCAlbHgpO1xuIiwgc3RhcnQsIGVuZCk7CisJCQlyYyA9IG5hbmRfbGVnYWN5X2VyYXNlIChuYW5kX2Rldl9kZXNjLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxLCAwKTsKKwkJCWRlYnVnICgibmFuZF9sZWdhY3lfZXJhc2UgcmV0dXJuZWQgJXhcbiIsIHJjKTsKICNlbmRpZgogCQl9CiAKQEAgLTI4NiwxMCArMjk0LDEwIEBACiAJCQlyYyA9IGZsYXNoX3dyaXRlKChjaGFyICopYWRkciwgc3RhcnQsIG5ieXRlcyk7CiAJCX0gZWxzZSB7CiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLQkJCWRlYnVnICgibmFuZF9ydyglcCwgJWx4ICV4KVxuIiwgYWRkciwgc3RhcnQsIG5ieXRlcyk7Ci0JCQlyYyA9IG5hbmRfcncobmFuZF9kZXZfZGVzYywgTkFORFJXX1dSSVRFIHwgTkFORFJXX0pGRlMyLAorCQkJZGVidWcgKCJuYW5kX2xlZ2FjeV9ydyglcCwgJWx4ICV4KVxuIiwgYWRkciwgc3RhcnQsIG5ieXRlcyk7CisJCQlyYyA9IG5hbmRfbGVnYWN5X3J3KG5hbmRfZGV2X2Rlc2MsIE5BTkRSV19XUklURSB8IE5BTkRSV19KRkZTMiwKIAkJCQkgICAgIHN0YXJ0LCBuYnl0ZXMsIChzaXplX3QgKikmdG90YWwsICh1Y2hhciAqKWFkZHIpOwotCQkJZGVidWcgKCJuYW5kX3J3OiByZXQ9JXggdG90YWw9JWQgbmJ5dGVzPSVkXG4iLCByYywgdG90YWwsIG5ieXRlcyk7CisJCQlkZWJ1ZyAoIm5hbmRfbGVnYWN5X3J3OiByZXQ9JXggdG90YWw9JWQgbmJ5dGVzPSVkXG4iLCByYywgdG90YWwsIG5ieXRlcyk7CiAjZW5kaWYKIAkJfQogCQlpZiAocmMgIT0gMCkgewpAQCAtMzA0LDcgKzMxMiw3IEBACiAJCQlyYyA9IGNyYzMyICgwLCAodWNoYXIgKikoc3RhcnQgKyBvZmYpLCBudG9obChoZHItPmloX3NpemUpKTsKIAkJfSBlbHNlIHsKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQotCQkJcmMgPSBuYW5kX3J3KG5hbmRfZGV2X2Rlc2MsIE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyIHwgTkFORFJXX0pGRlMyX1NLSVAsCisJCQlyYyA9IG5hbmRfbGVnYWN5X3J3KG5hbmRfZGV2X2Rlc2MsIE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyIHwgTkFORFJXX0pGRlMyX1NLSVAsCiAJCQkJICAgICBzdGFydCwgbmJ5dGVzLCAoc2l6ZV90ICopJnRvdGFsLCAodWNoYXIgKilhZGRyKTsKIAkJCXJjID0gY3JjMzIgKDAsICh1Y2hhciAqKShhZGRyICsgb2ZmKSwgbnRvaGwoaGRyLT5paF9zaXplKSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNDA1L2NvbmZpZy5tayBiL2JvYXJkL2VzZC9jcGNpNDA1L2NvbmZpZy5tawppbmRleCAwYmU0NWM3Li4zMjAzNDZmIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTQwNS9jb25maWcubWsKKysrIGIvYm9hcmQvZXNkL2NwY2k0MDUvY29uZmlnLm1rCkBAIC0zOCwzICszOCw3IEBACiBlbmRpZgogZW5kaWYKIGVuZGlmCisKKyMgQ29tcGlsZSB0aGUgbGVnYWN5IE5BTkQgY29kZSAoQ0ZHX05BTkRfTEVHQUNZIG11c3QgYmUgZGVmaW5lZCkKK0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZF9sZWdhY3kvbGlibmFuZF9sZWdhY3kuYQorCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvaGg0MDUvY29uZmlnLm1rIGIvYm9hcmQvZXNkL2hoNDA1L2NvbmZpZy5tawppbmRleCA3MTI5YWQ1Li5jYTFmNTc1IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvaGg0MDUvY29uZmlnLm1rCisrKyBiL2JvYXJkL2VzZC9oaDQwNS9jb25maWcubWsKQEAgLTI5LDMgKzI5LDcgQEAKIFRFWFRfQkFTRSA9IDB4RkZGODAwMDAKICNURVhUX0JBU0UgPSAweEZGRkMwMDAwCiAjVEVYVF9CQVNFID0gMHgwMEZDMDAwMAorCisjIENvbXBpbGUgdGhlIGxlZ2FjeSBOQU5EIGNvZGUgKENGR19OQU5EX0xFR0FDWSBtdXN0IGJlIGRlZmluZWQpCitCT0FSRExJQlMgPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2hoNDA1L2hoNDA1LmMgYi9ib2FyZC9lc2QvaGg0MDUvaGg0MDUuYwppbmRleCA5NThhZjhmLi45OWZkNTU2IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvaGg0MDUvaGg0MDUuYworKysgYi9ib2FyZC9lc2QvaGg0MDUvaGg0MDUuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKIHZvaWQgbmFuZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvaHViNDA1L2NvbmZpZy5tayBiL2JvYXJkL2VzZC9odWI0MDUvY29uZmlnLm1rCmluZGV4IGE2ZDMxYWEuLjIyZmYxMjIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9odWI0MDUvY29uZmlnLm1rCisrKyBiL2JvYXJkL2VzZC9odWI0MDUvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw3IEBACiAjCiAKIFRFWFRfQkFTRSA9IDB4RkZGQzAwMDAKKworIyBDb21waWxlIHRoZSBsZWdhY3kgTkFORCBjb2RlIChDRkdfTkFORF9MRUdBQ1kgbXVzdCBiZSBkZWZpbmVkKQorQk9BUkRMSUJTID0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCisKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9odWI0MDUvaHViNDA1LmMgYi9ib2FyZC9lc2QvaHViNDA1L2h1YjQwNS5jCmluZGV4IGU3N2RiYTguLjBjNjc3MWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9odWI0MDUvaHViNDA1LmMKKysrIGIvYm9hcmQvZXNkL2h1YjQwNS9odWI0MDUuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKIHZvaWQgbmFuZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGx1NDA1L2NvbmZpZy5tayBiL2JvYXJkL2VzZC9wbHU0MDUvY29uZmlnLm1rCmluZGV4IDI1YjIxMDUuLjkxNmIyODUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wbHU0MDUvY29uZmlnLm1rCisrKyBiL2JvYXJkL2VzZC9wbHU0MDUvY29uZmlnLm1rCkBAIC0yNywzICsyNyw2IEBACiAKIFRFWFRfQkFTRSA9IDB4RkZGQzAwMDAKICNURVhUX0JBU0UgPSAweDAwRkMwMDAwCisKKyMgQ29tcGlsZSB0aGUgbGVnYWN5IE5BTkQgY29kZSAoQ0ZHX05BTkRfTEVHQUNZIG11c3QgYmUgZGVmaW5lZCkKK0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZF9sZWdhY3kvbGlibmFuZF9sZWdhY3kuYQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BsdTQwNS9wbHU0MDUuYyBiL2JvYXJkL2VzZC9wbHU0MDUvcGx1NDA1LmMKaW5kZXggNWI5ZDA2My4uMzdiOTJmYiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3BsdTQwNS9wbHU0MDUuYworKysgYi9ib2FyZC9lc2QvcGx1NDA1L3BsdTQwNS5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAogCiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIAogdm9pZCBuYW5kX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC92b2g0MDUvY29uZmlnLm1rIGIvYm9hcmQvZXNkL3ZvaDQwNS9jb25maWcubWsKaW5kZXggMjE5YTRlYi4uNzJlODEwMyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3ZvaDQwNS9jb25maWcubWsKKysrIGIvYm9hcmQvZXNkL3ZvaDQwNS9jb25maWcubWsKQEAgLTI2LDMgKzI2LDYgQEAKICMKIAogVEVYVF9CQVNFID0gMHhGRkY4MDAwMAorCisjIENvbXBpbGUgdGhlIGxlZ2FjeSBOQU5EIGNvZGUgKENGR19OQU5EX0xFR0FDWSBtdXN0IGJlIGRlZmluZWQpCitCT0FSRExJQlMgPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC92b2g0MDUvdm9oNDA1LmMgYi9ib2FyZC9lc2Qvdm9oNDA1L3ZvaDQwNS5jCmluZGV4IGVkYTNmZDkuLjIyOTk1YjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC92b2g0MDUvdm9oNDA1LmMKKysrIGIvYm9hcmQvZXNkL3ZvaDQwNS92b2g0MDUuYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKIHZvaWQgbmFuZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9lc2Qvd3VoNDA1L2NvbmZpZy5tayBiL2JvYXJkL2VzZC93dWg0MDUvY29uZmlnLm1rCmluZGV4IDFkNzQzYTkuLjNjZjVkZDggMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC93dWg0MDUvY29uZmlnLm1rCisrKyBiL2JvYXJkL2VzZC93dWg0MDUvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw2IEBACiAjCiAKIFRFWFRfQkFTRSA9IDB4RkZGQzAwMDAKKworIyBDb21waWxlIHRoZSBsZWdhY3kgTkFORCBjb2RlIChDRkdfTkFORF9MRUdBQ1kgbXVzdCBiZSBkZWZpbmVkKQorQk9BUkRMSUJTID0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCmRpZmYgLS1naXQgYS9ib2FyZC9lc2Qvd3VoNDA1L3d1aDQwNS5jIGIvYm9hcmQvZXNkL3d1aDQwNS93dWg0MDUuYwppbmRleCBkYjI0MTIyLi41YTFhM2YzIDEwMDY0NAotLS0gYS9ib2FyZC9lc2Qvd3VoNDA1L3d1aDQwNS5jCisrKyBiL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMKQEAgLTIzOSw3ICsyMzksNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIAogdm9pZCBuYW5kX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2JvYXJkL2cyMDAwL2cyMDAwLmMgYi9ib2FyZC9nMjAwMC9nMjAwMC5jCmluZGV4IDNmNzg3NTMuLjM5YjVjNzAxIDEwMDY0NAotLS0gYS9ib2FyZC9nMjAwMC9nMjAwMC5jCisrKyBiL2JvYXJkL2cyMDAwL2cyMDAwLmMKQEAgLTE4NSw3ICsxODUsNyBAQAogCiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCiB2b2lkIG5hbmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0cGhvbmUvY29uZmlnLm1rIGIvYm9hcmQvbmV0cGhvbmUvY29uZmlnLm1rCmluZGV4IDg0OTdlYmMuLmRlMTc5YzIgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHBob25lL2NvbmZpZy5taworKysgYi9ib2FyZC9uZXRwaG9uZS9jb25maWcubWsKQEAgLTI2LDMgKzI2LDYgQEAKICMKIAogVEVYVF9CQVNFID0gMHg0MDAwMDAwMAorCisjIENvbXBpbGUgdGhlIGxlZ2FjeSBOQU5EIGNvZGUgKENGR19OQU5EX0xFR0FDWSBtdXN0IGJlIGRlZmluZWQpCitCT0FSRExJQlMgPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMgYi9ib2FyZC9uZXRwaG9uZS9uZXRwaG9uZS5jCmluZGV4IGRkMDNlNGIuLjI5N2RlOTcgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHBob25lL25ldHBob25lLmMKKysrIGIvYm9hcmQvbmV0cGhvbmUvbmV0cGhvbmUuYwpAQCAtNTk5LDcgKzU5OSw3IEBACiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQogCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIAogZXh0ZXJuIHVsb25nIG5hbmRfcHJvYmUodWxvbmcgcGh5c2Fkcik7CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9NYWtlZmlsZSBiL2JvYXJkL25ldHN0YXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmMjE4OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvTWFrZWZpbGUKQEAgLTAsMCArMSw4NSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDUKKyMgTGFkaXNsYXYgTWljaGwsIDJOIFRlbGVrb211bmlrYWNlLCBtaWNobEAybi5jegorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG5ldHN0YXIubyBmbGFzaC5vIG5hbmQubworU09CSlMJOj0gc2V0dXAubyBjcmNlay5vCisKK2djY2xpYmRpciA6PSAkKHNoZWxsIGRpcm5hbWUgYCQoQ0MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lYCkKKworTE9BRF9BRERSID0gMHgxMDQwMDAwMAorTERTQ1JJUFQgPSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikvZWVwcm9tLmxkcworCitIT1NUX0NGTEFHUyA9IC1XYWxsIC1wZWRhbnRpYyAtSSQoVE9QRElSKS9pbmNsdWRlCisKK2FsbDoJJChMSUIpIGVlcHJvbS5zcmVjIGVlcHJvbS5iaW4gY3JjZWsuc3JlYyBjcmNlay5iaW4gY3JjaXQKKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICReCisKK2VlcHJvbS5zcmVjOgllZXByb20ubyBlZXByb21fc3RhcnQubworCSQoTEQpIC1UICQoTERTQ1JJUFQpIC1nIC1UdGV4dCAkKExPQURfQUREUikgXAorCQktbyAkKDw6Lm89KSAtZSAkKDw6Lm89KSAkXiBcCisJCS1MLi4vLi4vZXhhbXBsZXMgLWxzdHVicyBcCisJCS1MLi4vLi4vbGliX2dlbmVyaWMgLWxnZW5lcmljIFwKKwkJLUwkKGdjY2xpYmRpcikgLWxnY2MKKwkkKE9CSkNPUFkpIC1PIHNyZWMgJCg8Oi5vPSkgJEAKKworZWVwcm9tLmJpbjoJZWVwcm9tLnNyZWMKKwkkKE9CSkNPUFkpIC1JIHNyZWMgLU8gYmluYXJ5ICQ8ICRAIDI+L2Rldi9udWxsCisKK2NyY2VrLnNyZWM6CWNyY2VrLm8KKwkkKExEKSAtZyAtVHRleHQgMHgwMDAwMDAwMCBcCisJCS1vICQoPDoubz0pIC1lICQoPDoubz0pICReCisJJChPQkpDT1BZKSAtTyBzcmVjICQoPDoubz0pICRACisKK2NyY2VrLmJpbjoJY3JjZWsuc3JlYworCSQoT0JKQ09QWSkgLUkgc3JlYyAtTyBiaW5hcnkgJDwgJEAgMj4vZGV2L251bGwKKworY3JjaXQ6CQljcmNpdC5vIGNyYzMyLm8KKwkkKEhPU1RDQykgJChIT1NUX0NGTEFHUykgLW8gJEAgJF4KKworY3JjaXQubzoJY3JjaXQuYworCSQoSE9TVENDKSAkKEhPU1RfQ0ZMQUdTKSAtYyAkPAorCitjcmMzMi5vOgkkKFRPUERJUikvdG9vbHMvY3JjMzIuYworCSQoSE9TVENDKSAkKEhPU1RfQ0ZMQUdTKSAtRFVTRV9IT1NUQ0MgLWMgJDwKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKSBlZXByb20gZWVwcm9tLnNyZWMgZWVwcm9tLmJpbiBcCisJCWNyY2VrIGNyY2VrLnNyZWMgY3JjZWsuYmluCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENQUEZMQUdTKSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpID4gJEAKKworLWluY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFyL2NvbmZpZy5tayBiL2JvYXJkL25ldHN0YXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzkyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFyL2NvbmZpZy5tawpAQCAtMCwwICsxLDE1IEBACisjCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCAxMDAwJzgwMDAsCisjIGVudHJ5IDEwMDAnODAwMCAobWVtIGJhc2UgKyByZXNlcnZlZCkKKyMKKyMgV2UgbG9hZCBvdXJzZWxmIHRvIGludGVybmFsIFJBTSBhdCAyMDAxJzIwMDAKKyMgQ2hlY2sgbWFwIGZpbGUgd2hlbiBjaGFuZ2luZyBURVhUX0JBU0UuCisjIEV2ZXJ5dGhpbmcgaGFzIGZpdCBpbnRvIDE5MmtCIGludGVybmFsIFNSQU0hCisjCisKKyMgWFhYIFRFWFRfQkFTRSA9IDB4MjAwMTIwMDAKK1RFWFRfQkFTRSA9IDB4MTNGQzAwMDAKKworIyBDb21waWxlIHRoZSBuZXcgTkFORCBjb2RlCitCT0FSRExJQlMgPSBkcml2ZXJzL25hbmQvbGlibmFuZC5hCisKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvY3JjZWsgYi9ib2FyZC9uZXRzdGFyL2NyY2VrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1OTNmODkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFyL2NyY2VrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvY3JjZWsuUyBiL2JvYXJkL25ldHN0YXIvY3JjZWsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E0ZDExCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3Rhci9jcmNlay5TCkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogMk4gVGVsZWtvbXVuaWthY2UsIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLgorICoKKyAqIEltYWdlIGxheW91dCBsb29rcyBsaWtlIGZvbGxvd2luZzoKKyAqCXUzMiAtIHNpemUKKyAqCXUzMiAtIHZlcnNpb24KKyAqCS4uLiAtIGRhdGEKKyAqCXUzMiAtIGNyYzMyCisgKi8KKworI2luY2x1ZGUgImNyY2VrLmgiCisKKy8qKgorICogZG9fY3JjMzIgLSBjYWxjdWxhdGUgQ1JDMzIgb2YgZ2l2ZW4gYnVmZmVyCisgKiByMCAtIGNyYworICogcjEgLSBwb2ludGVyIHRvIGJ1ZmZlcgorICogcjIgLSBidWZmZXIgbGVuCisgKi8KKwkubWFjcm8JZG9fY3JjMzIKKwlsZHIJcjUsIEZGRkZGRkZGCisJZW9yCXIwLCByMCwgcjUKKwlhZHIJcjMsIENSQzMyX1RBQkxFCisxOgorCWxkcmIgICAgcjQsIFtyMV0sICMxCisJZW9yCXI0LCByNCwgcjAKKwlhbmQJcjQsIHI0LCAjMHhmZgorCWxkcglyNCwgW3IzLCByNCwgbHNsIzJdCisJZW9yCXIwLCByNCwgcjAsIGxzciM4CisJc3VicwlyMiwgcjIsICMweDEKKwlibmUgCTFiCisJZW9yCXIwLCByMCwgcjUKKwkuZW5kbQorCisJLm1hY3JvIGNyY3VqLCBvZmZzZXQsIHNpemUKKwltb3YJcjAsICMwCisJbGRyCXIxLCBcb2Zmc2V0CisJbGRyCXIyLCBbcjFdCisJY21wCXIyLCByMAkJQCBubyBkYXRhLCBubyBwcm9ibGVtCisJYmVxCTJmCisJdHN0CXIyLCAjMwkJQCB1bmFsaWduZWQgc2l6ZQorCWJuZQkyZgorCWxkcglyMywgXHNpemUKKwljbXAJcjIsIHIzCQlAIGJvZ3VzIHNpemUKKwliaGkJMmYKKwlhZGQJcjEsIHIxLCAjNAorCWRvX2NyYzMyCisJbGRyCXIxLCBbcjFdCisyOgorCWNtcAlyMCwgcjEKKwkuZW5kbQorCisJLm1hY3JvIHdhaXQsIHJlZworCW1vdglccmVnLCAjMHgxMDAwCiszOgorCXN1YnMJXHJlZywgXHJlZywgIzB4MQorCWJuZSAJM2IKKworCS5lbmRtCisudGV4dAorLmdsb2JsIGNyY2VrCitjcmNlazoKKwliCWNyYzJfYmFkCisJbW92CXI2LCAjMAorCWNyY3VqCV9MT0FERVIxX09GRlNFVCwgX0xPQURFUl9TSVpFCisJYm5lCWNyYzFfYmFkCisJb3JyCXI2LCByNiwgIzEKK2NyYzFfYmFkOgorCWNyY3VqCV9MT0FERVIyX09GRlNFVCwgX0xPQURFUl9TSVpFCisJYm5lCWNyYzJfYmFkCisJb3JyCXI2LCByNiwgIzIKK2NyYzJfYmFkOgorCWxkcglyMywgX0xPQURFUjFfT0ZGU0VUCisJbGRyCXI0LCBfTE9BREVSMl9PRkZTRVQKKwliCWJvb3RfMm5kCisJdHN0CXI2LCAjMworCWJlcQlvbmVfaXNfYmFkCUAgb25lIG9mIHRoZW0gKG9yIGJvdGgpIGhhcyBiYWQgY3JjCisJbGRyCXIxLCBbcjMsICM0XQorCWxkcglyMiwgW3I0LCAjNF0KKwljbXAJcjEsIHIyCQlAIGJvb3QgMm5kIGxvYWRlciBpZiB2ZXJzaW9ucyBkaWZmZXIKKwliZXEJYm9vdF8xc3QKKwliCWJvb3RfMm5kCitvbmVfaXNfYmFkOgorCXRzdAlyNiwgIzEKKwlibmUJYm9vdF8xc3QKKwl0c3QJcjYsICMyCisJYm5lCWJvb3RfMm5kCitAIFdlIGFyZSBkb29tZWQsIHNvIGxldCB1c2VyIGtub3cuCisJbGRyCXIwLCBHUElPX0JBU0UJQCBjb25maWd1cmUgR1BJTyBwaW5zCisJbGRyCXIxLCBHUElPX0RJUkVDVElPTgorCXN0cmgJcjEsIFtyMCwgIzB4MDhdCitibGlua19sb29wOgorCW1vdglyMSwgIzB4MDgKKwlzdHJoICAgIHIxLCBbcjAsICMweDA0XQorCXdhaXQJcjMKKwltb3YJcjEsICMweDEwCisJc3RyaCAgICByMSwgW3IwLCAjMHgwNF0KKwl3YWl0CXIzCisJYiBibGlua19sb29wCitib290XzFzdDoKKwlhZGQJcGMsIHIzLCAjOAorYm9vdF8ybmQ6CisJYWRkCXBjLCByNCwgIzgKKworX0xPQURFUl9TSVpFOgorCS53b3JkIExPQURFUl9TSVpFIC0gOAlAIG1pbnVzIHNpemUgYW5kIGNyYzMyCitfTE9BREVSMV9PRkZTRVQ6CisJLndvcmQgTE9BREVSMV9PRkZTRVQKK19MT0FERVIyX09GRlNFVDoKKwkud29yZCBMT0FERVIyX09GRlNFVAorCitGRkZGRkZGRjoKKwkud29yZCAweGZmZmZmZmZmCitDUkMzMl9UQUJMRToKKwkud29yZCAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5CisJLndvcmQgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywgMHgwZWRiODgzMiwgMHg3OWRjYjhhNAorCS53b3JkIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcKKwkud29yZCAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlCisJLndvcmQgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NgorCS53b3JkIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDkKKwkud29yZCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0CisJLndvcmQgMHhhMjY3NzE3MiwgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YgorCS53b3JkIDB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMKKwkud29yZCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LCAweDI2ZDkzMGFjLCAweDUxZGUwMDNhCisJLndvcmQgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OQorCS53b3JkIDB4YjhiZGE1MGYsIDB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQKKwkud29yZCAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwCisJLndvcmQgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZgorCS53b3JkIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsIDB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUKKwkud29yZCAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxCisJLndvcmQgMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwgMHg2YzA2OTVlZAorCS53b3JkIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAKKwkud29yZCAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzCisJLndvcmQgMHhmYmQ0NGM2NSwgMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMgorCS53b3JkIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEKKwkud29yZCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLCAweDQ0MDQyZDczLCAweDMzMDMxZGU1CisJLndvcmQgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMAorCS53b3JkIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYKKwkud29yZCAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3CisJLndvcmQgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNgorCS53b3JkIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUKKwkud29yZCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4CisJLndvcmQgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwgMHhmMDBmOTM0NAorCS53b3JkIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IKKwkud29yZCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhCisJLndvcmQgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNQorCS53b3JkIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsIDB4ZDFiYjY3ZjEKKwkud29yZCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLCAweGQ4MGQyYmRhLCAweGFmMGExYjRjCisJLndvcmQgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwgMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZgorCS53b3JkIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYKKwkud29yZCAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlCisJLndvcmQgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMQorCS53b3JkIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMKKwkud29yZCAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzCisJLndvcmQgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwgMHg5MmQyOGU5YgorCS53b3JkIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsIDB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIKKwkud29yZCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxCisJLndvcmQgMHgxOGI3NDc3NywgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YworCS53b3JkIDB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsIDB4YTAwYWUyNzgKKwkud29yZCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLCAweGE3NjcyNjYxLCAweGQwNjAxNmY3CisJLndvcmQgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NgorCS53b3JkIDB4MzdkODNiZjAsIDB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTkKKwkud29yZCAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1CisJLndvcmQgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOAorCS53b3JkIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIKKwkud29yZCAweDJkMDJlZjhkCisKK0dQSU9fQkFTRToKKwkud29yZCAweGZmZmNlMDAwCitHUElPX0RJUkVDVElPTjoKKwkud29yZCAweDAwMDBmZmU3CisKKy5lbmQKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvY3JjZWsuaCBiL2JvYXJkL25ldHN0YXIvY3JjZWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMwODYwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3Rhci9jcmNlay5oCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBMT0FERVJfU0laRQkoNDQ4ICogMTAyNCkKKyNkZWZpbmUgTE9BREVSMV9PRkZTRVQJKDEyOCAqIDEwMjQpCisjZGVmaW5lIExPQURFUjJfT0ZGU0VUCShMT0FERVIxX09GRlNFVCArIExPQURFUl9TSVpFKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9jcmNpdCBiL2JvYXJkL25ldHN0YXIvY3JjaXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThhZTQyZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvY3JjaXQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9jcmNpdC5jIGIvYm9hcmQvbmV0c3Rhci9jcmNpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDMwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFyL2NyY2l0LmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogMk4gVGVsZWtvbXVuaWthY2UsIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiY3JjZWsuaCIKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3JjMzIodW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpOworCit1aW50MzJfdCBkYXRhW0xPQURFUl9TSVpFLzQgKyAzXTsKKworaW50IGRvaXQoY2hhciAqcGF0aCwgdW5zaWduZWQgdmVyc2lvbikKK3sKKwl1aW50MzJfdCAqcDsKKwlzc2l6ZV90IHNpemU7CisJaW50IGZkOworCisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJcGVycm9yKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJcCA9IGRhdGEgKyAyOworCXNpemUgPSByZWFkKGZkLCBwLCBMT0FERVJfU0laRSArIDQpOworCWlmIChzaXplID09IC0xKSB7CisJCXBlcnJvcigiRXJyb3IgcmVhZGluZyBmaWxlIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWlmIChzaXplID4gTE9BREVSX1NJWkUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGaWxlIHRvbyBsYXJnZVxuIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCXNpemUgPSAoKChzaXplIC0gMSkgPj4gMikgKyAxKSA8PCAyOworCWRhdGFbMF0gPSBzaXplICsgNDsJLyogYWRkIHNpemUgb2YgdmVyc2lvbiBmaWVsZCAqLworCWRhdGFbMV0gPSB2ZXJzaW9uOworCWRhdGFbKHNpemUgPj4gMikgKyAyXSA9IGNyYzMyKDAsICh1bnNpZ25lZCBjaGFyICopKGRhdGEgKyAxKSwgZGF0YVswXSk7CisJY2xvc2UoZmQpOworCisJaWYgKHdyaXRlKFNURE9VVF9GSUxFTk8sIGRhdGEsIHNpemUgKyAzKjQpID09IC0xKSB7CisJCXBlcnJvcigiRXJyb3Igd3JpdGluZyBmaWxlIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjID09IDIpIHsKKwkJcmV0dXJuIGRvaXQoYXJndlsxXSwgMCk7CisJfSBlbHNlIGlmICgoYXJnYyA9PSA0KSAmJiAoc3RyY21wKGFyZ3ZbMV0sICItdiIpID09IDApKSB7CisJCWNoYXIgKmVuZHB0ciwgKm5wdHIgPSBhcmd2WzJdOworCQl1bnNpZ25lZCB2ZXIgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDApOworCQlpZiAobnB0ciAhPSAnXDAnICYmIGVuZHB0ciA9PSAnXDAnKQorCQkJcmV0dXJuIGRvaXQoYXJndlszXSwgdmVyKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogY3JjaXQgWy12IHZlcnNpb25dIDxpbWFnZT5cbiIpOworCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvZWVwcm9tIGIvYm9hcmQvbmV0c3Rhci9lZXByb20KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzMwYzk4YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvZWVwcm9tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvZWVwcm9tLmMgYi9ib2FyZC9uZXRzdGFyL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjM4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9uZXRzdGFyL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1CisgKiBMYWRpc2xhdiBNaWNobCwgMk4gVGVsZWtvbXVuaWthY2UsIG1pY2hsQDJuLmN6CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogU29tZSBjb2RlIHNoYW1lbGVzc2x5IHN0b2xlbiBiYWNrIGZyb20gUm9iaW4gR2V0ei4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxleHBvcnRzLmg+CisjaW5jbHVkZSAiLi4vZHJpdmVycy9zbWM5MTExMS5oIgorCisjZGVmaW5lIFNNQ19CQVNFX0FERFJFU1MgQ09ORklHX1NNQzkxMTExX0JBU0UKKworc3RhdGljIHUxNiByZWFkX2VlcHJvbV9yZWcodTE2IHJlZykKK3sKKwlpbnQgdGltZW91dDsKKworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlTTUNfb3V0dyhyZWcsIFBUUl9SRUcpOworCisJU01DX1NFTEVDVF9CQU5LKDEpOworCVNNQ19vdXR3KFNNQ19pbncgKENUTF9SRUcpIHwgQ1RMX0VFUFJPTV9TRUxFQ1QgfCBDVExfUkVMT0FELAorCQkgQ1RMX1JFRyk7CisJdGltZW91dCA9IDEwMDsKKwl3aGlsZSgoU01DX2ludyAoQ1RMX1JFRykgJiBDVExfUkVMT0FEKSAmJiAtLXRpbWVvdXQpCisJCXVkZWxheSgxMDApOworCWlmICh0aW1lb3V0ID09IDApIHsKKwkJcHJpbnRmKCJUaW1lb3V0IFJlYWRpbmcgRUVQUk9NIHJlZ2lzdGVyICUwMnhcbiIsIHJlZyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBTTUNfaW53IChHUF9SRUcpOworfQorCitzdGF0aWMgaW50IHdyaXRlX2VlcHJvbV9yZWcodTE2IHZhbHVlLCB1MTYgcmVnKQoreworCWludCB0aW1lb3V0OworCisJU01DX1NFTEVDVF9CQU5LKDIpOworCVNNQ19vdXR3KHJlZywgUFRSX1JFRyk7CisKKwlTTUNfU0VMRUNUX0JBTksoMSk7CisJU01DX291dHcodmFsdWUsIEdQX1JFRyk7CisJU01DX291dHcoU01DX2ludyAoQ1RMX1JFRykgfCBDVExfRUVQUk9NX1NFTEVDVCB8IENUTF9TVE9SRSwgQ1RMX1JFRyk7CisJdGltZW91dCA9IDEwMDsKKwl3aGlsZSAoKFNNQ19pbncoQ1RMX1JFRykgJiBDVExfU1RPUkUpICYmIC0tdGltZW91dCkKKwkJdWRlbGF5ICgxMDApOworCWlmICh0aW1lb3V0ID09IDApIHsKKwkJcHJpbnRmKCJUaW1lb3V0IFdyaXRpbmcgRUVQUk9NIHJlZ2lzdGVyICUwMnhcbiIsIHJlZyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdyaXRlX2RhdGEodTE2ICpidWYsIGludCBsZW4pCit7CisJdTE2IHJlZyA9IDB4MjM7CisKKwl3aGlsZSAobGVuLS0pCisJCXdyaXRlX2VlcHJvbV9yZWcoKmJ1ZisrLCByZWcrKyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfbWFjYWRkcihjaGFyICpzKQoreworCXUxNiByZWc7CisJaW50IGksIGVyciA9IDA7CisKKwlwcmludGYoIk1BQyBBZGRyZXNzOiAiKTsKKwllcnIgPSBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJlZyA9IHJlYWRfZWVwcm9tX3JlZygweDIwICsgaSk7CisJCXByaW50ZigiJTAyeDolMDJ4JWMiLCByZWcgJiAweGZmLCByZWcgPj4gOCwgaSAhPSAyID8gJzonIDogJ1xuJyk7CisJCWlmIChzKQorCQkJZXJyIHw9IHJlZyAhPSAoKHUxNiAqKXMpW2ldOworCX0KKworCXJldHVybiBlcnIgPyAwIDogMTsKK30KKworc3RhdGljIGludCBzZXRfbWFjKGNoYXIgKnMpCit7CisJaW50IGk7CisJY2hhciAqZSwgZWFkZHJbNl07CisKKwkvKiB0dXJuIHN0cmluZyBpbnRvIG1hYyB2YWx1ZSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZWFkZHJbaV0gPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTYpOworCQlzID0gKCplKSA/IGUrMSA6IGU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJd3JpdGVfZWVwcm9tX3JlZygqKCgodTE2ICopZWFkZHIpICsgaSksIDB4MjAgKyBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2VsZW1lbnQoY2hhciAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBjbnQ7CisJY2hhciAqcCwgbnVtWzNdOworCXVuc2lnbmVkIGNoYXIgaWQ7CisKKwlpZCA9IHNpbXBsZV9zdHJ0b3VsKHMsICZwLCAxNik7CisJaWYgKCpwKysgIT0gJzonKQorCQlyZXR1cm4gLTE7CisJY250ID0gMjsKKwludW1bMl0gPSAwOworCWZvciAoOyAqcDsgcCArPSAyKSB7CisJCWlmIChwWzFdID09IDApCisJCQlyZXR1cm4gLTI7CisJCWlmIChjbnQgKyAzID4gbGVuKQorCQkJcmV0dXJuIC0zOworCQludW1bMF0gPSBwWzBdOworCQludW1bMV0gPSBwWzFdOworCQlidWZbY250KytdID0gc2ltcGxlX3N0cnRvdWwobnVtLCBOVUxMLCAxNik7CisJfQorCWJ1ZlswXSA9IGlkOworCWJ1ZlsxXSA9IGNudCAtIDI7CisKKwlyZXR1cm4gY250OworfQorCitleHRlcm4gaW50IGNyY2VrKHZvaWQpOworCitpbnQgZWVwcm9tKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGksIGxlbiwgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmWzU4XSwgKnA7CisKKwlhcHBfc3RhcnR1cChhcmd2KTsKKwlpZiAoZ2V0X3ZlcnNpb24oKSAhPSBYRl9WRVJTSU9OKSB7CisJCXByaW50ZigiV3JvbmcgWEZfVkVSU0lPTi5cbiIpOworCQlwcmludGYoIkFwcGxpY2F0aW9uIGV4cGVjdHMgQUJJIHZlcnNpb24gJWRcbiIsIFhGX1ZFUlNJT04pOworCQlwcmludGYoIkFjdHVhbCBVLUJvb3QgQUJJIHZlcnNpb24gJWRcbiIsIChpbnQpZ2V0X3ZlcnNpb24oKSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiBjcmNlaygpOworCisJaWYgKChTTUNfaW53IChCQU5LX1NFTEVDVCkgJiAweEZGMDApICE9IDB4MzMwMCkgeworCQlwcmludGYoIlNNU0M5MTExMSBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogQ2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycyAtIHByaW50IE1BQyBhZGRyZXNzICovCisJaWYgKGFyZ2MgPCAyKSB7CisJCXZlcmlmeV9tYWNhZGRyKE5VTEwpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBQcmludCBoZWxwIG1lc3NhZ2UgKi8KKwlpZiAoYXJndlsxXVsxXSA9PSAnaCcpIHsKKwkJcHJpbnRmKCJWb2ljZUJsdWUgRUVQUk9NIHdyaXRlclxuIik7CisJCXByaW50ZigiQnVpbHQ6ICVzIGF0ICVzXG4iLCBfX0RBVEVfXyAsIF9fVElNRV9fICk7CisJCXByaW50ZigiVXNhZ2U6XG5cdDxtYWNfYWRkcmVzcz4gWzxlbGVtZW50XzE+XSBbPC4uLj5dXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IHRvIHBhcnNlIGluZm9ybWF0aW9uIGVsZW1lbnRzICovCisJbGVuID0gc2l6ZW9mKGJ1Zik7CisJcCA9IGJ1ZjsKKwlmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKSB7CisJCXJldCA9IHBhcnNlX2VsZW1lbnQoYXJndltpXSwgcCwgbGVuKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAtMToKKwkJCXByaW50ZigiRWxlbWVudCAlZDogbWFsZm9ybWVkXG4iLCBpIC0gMSk7CisJCQlyZXR1cm4gMzsKKwkJY2FzZSAtMjoKKwkJCXByaW50ZigiRWxlbWVudCAlZDogb2RkIGNoYXJhY3RlciBjb3VudFxuIiwgaSAtIDEpOworCQkJcmV0dXJuIDM7CisJCWNhc2UgLTM6CisJCQlwcmludGYoIk91dCBvZiBFRVBST00gbWVtb3J5XG4iKTsKKwkJCXJldHVybiAzOworCQlkZWZhdWx0OgorCQkJcCArPSByZXQ7CisJCQlsZW4gLT0gcmV0OworCQl9CisJfQorCisJLyogRmlyc3QgYXJndW1lbnQgKE1BQykgaXMgbWFuZGF0b3J5ICovCisJc2V0X21hYyhhcmd2WzFdKTsKKwlpZiAodmVyaWZ5X21hY2FkZHIoYXJndlsxXSkpIHsKKwkJcHJpbnRmKCIqKiogTUFDIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ghICoqKlxuIik7CisJCXJldHVybiA0OworCX0KKworCXdoaWxlIChsZW4tLSkKKwkJKnArKyA9IDA7CisKKwl3cml0ZV9kYXRhKCh1MTYgKilidWYsIHNpemVvZihidWYpID4+IDEpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFyL2VlcHJvbS5sZHMgYi9ib2FyZC9uZXRzdGFyL2VlcHJvbS5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NTUwZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvZWVwcm9tLmxkcwpAQCAtMCwwICsxLDUxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKiAoQykgQ29weXJpZ2h0IDIwMDUKKyAqIExhZGlzbGF2IE1pY2hsLCAyTiBUZWxla29tdW5pa2FjZSwgPG1pY2hsQDJuLmN6PgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGVlcHJvbV9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9lZXByb21fc3RhcnQuUyBiL2JvYXJkL25ldHN0YXIvZWVwcm9tX3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkOWYwNQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvZWVwcm9tX3N0YXJ0LlMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgIDJOIFRlbGVrb211bmlrYWNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgliICAgICAgIGVlcHJvbQorCisjaW5jbHVkZSAiY3JjZWsuaCIKKworLyoqCisgKiBkb19jcmMzMiAtIGNhbGN1bGF0ZSBDUkMzMiBvZiBnaXZlbiBidWZmZXIKKyAqIHIwIC0gY3JjCisgKiByMSAtIHBvaW50ZXIgdG8gYnVmZmVyCisgKiByMiAtIGJ1ZmZlciBsZW4KKyAqLworCS5tYWNybwlkb19jcmMzMgorCWxkcglyNSwgRkZGRkZGRkYKKwllb3IJcjAsIHIwLCByNQorCWFkcglyMywgQ1JDMzJfVEFCTEUKKzE6CisJbGRyYiAgICByNCwgW3IxXSwgIzEKKwllb3IJcjQsIHI0LCByMAorCWFuZAlyNCwgcjQsICMweGZmCisJbGRyCXI0LCBbcjMsIHI0LCBsc2wjMl0KKwllb3IJcjAsIHI0LCByMCwgbHNyIzgKKwlzdWJzCXIyLCByMiwgIzB4MQorCWJuZSAJMWIKKwllb3IJcjAsIHIwLCByNQorCS5lbmRtCisKKwkubWFjcm8gY3JjdWosIG9mZnNldCwgc2l6ZQorCWxkcglyMSwgXG9mZnNldAorCWxkcglyMiwgW3IxXQorCWNtcAlyMiwgIzAJCUAgbm8gZGF0YSwgbm8gcHJvYmxlbQorCWJlcQkyZgorCW1vdiAgICAgcjcsICMxCisJdHN0CXIyLCAjMwkJQCB1bmFsaWduZWQgc2l6ZQorCWJuZQkyZgorCW1vdiAgICAgcjcsICMyCisJbGRyCXIwLCBcc2l6ZQorCWNtcAlyMiwgcjAJCUAgYm9ndXMgc2l6ZQorCWJoaQkyZgorCW1vdiAgICAgcjcsICMzCisJYWRkCXIxLCByMSwgIzQKKwltb3YJcjAsICMwCisJZG9fY3JjMzIKKwlsZHIJcjEsIFtyMV0KKzI6CisJY21wCXIwLCByMQorCS5lbmRtCisKKwkubWFjcm8gd2FpdCwgcmVnCisJbW92CVxyZWcsICMweDEwMDAKKzM6CisJc3VicwlccmVnLCBccmVnLCAjMHgxCisJYm5lIAkzYgorCisJLmVuZG0KKy50ZXh0CisuZ2xvYmwgY3JjZWsKK2NyY2VrOgorCW1vdglyNiwgIzAKK0AJY3JjdWoJX0xPQURFUjFfT0ZGU0VULCBfTE9BREVSX1NJWkUKK0AJYm5lCWNyYzFfYmFkCitACW9ycglyNiwgcjYsICMxCitjcmMxX2JhZDoKKwljcmN1aglfTE9BREVSMl9PRkZTRVQsIF9MT0FERVJfU0laRQorCWJuZQljcmMyX2JhZAorCW9ycglyNiwgcjYsICMyCitjcmMyX2JhZDoKK0AJbW92CXIwLCByNgorCW1vdiAgICAgcGMsIGxyCisJbGRyCXIzLCBfTE9BREVSMV9PRkZTRVQKKwlsZHIJcjQsIF9MT0FERVIyX09GRlNFVAorCXRzdAlyNiwgIzMKKwliZXEJb25lX2lzX2JhZAlAIG9uZSBvZiB0aGVtIChvciBib3RoKSBoYXMgYmFkIGNyYworCWxkcglyMSwgW3IzLCAjNF0KKwlsZHIJcjIsIFtyNCwgIzRdCisJY21wCXIxLCByMgkJQCBib290IDJuZCBsb2FkZXIgaWYgdmVyc2lvbnMgZGlmZmVyCisJYmVxCWJvb3RfMXN0CisJYglib290XzJuZAorb25lX2lzX2JhZDoKKwl0c3QJcjYsICMxCisJYm5lCWJvb3RfMXN0CisJdHN0CXI2LCAjMgorCWJuZQlib290XzJuZAorQCBXZSBhcmUgZG9vbWVkLCBzbyBsZXQgdXNlciBrbm93LgorCWxkcglyMCwgR1BJT19CQVNFCUAgY29uZmlndXJlIEdQSU8gcGlucworCWxkcglyMSwgR1BJT19ESVJFQ1RJT04KKwlzdHJoCXIxLCBbcjAsICMweDA4XQorYmxpbmtfbG9vcDoKKwltb3YJcjEsICMweDA4CisJc3RyaCAgICByMSwgW3IwLCAjMHgwNF0KKwl3YWl0CXIzCisJbW92CXIxLCAjMHgxMAorCXN0cmggICAgcjEsIFtyMCwgIzB4MDRdCisJd2FpdAlyMworCWIgYmxpbmtfbG9vcAorYm9vdF8xc3Q6CisJYWRkCXBjLCByMywgIzgKK2Jvb3RfMm5kOgorCWFkZAlwYywgcjQsICM4CisKK19MT0FERVJfU0laRToKKwkud29yZCBMT0FERVJfU0laRSAtIDgJQCBtaW51cyBzaXplIGFuZCBjcmMzMgorX0xPQURFUjFfT0ZGU0VUOgorCS53b3JkIExPQURFUjFfT0ZGU0VUCitfTE9BREVSMl9PRkZTRVQ6CisJLndvcmQgTE9BREVSMl9PRkZTRVQKKworRkZGRkZGRkY6CisJLndvcmQgMHhmZmZmZmZmZgorQ1JDMzJfVEFCTEU6CisJLndvcmQgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOQorCS53b3JkIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQKKwkud29yZCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LCAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3CisJLndvcmQgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZQorCS53b3JkIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsIDB4MTM2Yzk4NTYKKwkud29yZCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5CisJLndvcmQgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNAorCS53b3JkIDB4YTI2NzcxNzIsIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIKKwkud29yZCAweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzCisJLndvcmQgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYQorCS53b3JkIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTkKKwkud29yZCAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0CisJLndvcmQgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MAorCS53b3JkIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYKKwkud29yZCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLCAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlCisJLndvcmQgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMQorCS53b3JkIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsIDB4NmMwNjk1ZWQKKwkud29yZCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwCisJLndvcmQgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMworCS53b3JkIDB4ZmJkNDRjNjUsIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIKKwkud29yZCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhCisJLndvcmQgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNQorCS53b3JkIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksIDB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAKKwkud29yZCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmCisJLndvcmQgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNworCS53b3JkIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsIDB4ZWRiODgzMjAsIDB4OWFiZmIzYjYKKwkud29yZCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLCAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1CisJLndvcmQgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOAorCS53b3JkIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsIDB4ZjAwZjkzNDQKKwkud29yZCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiCisJLndvcmQgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YQorCS53b3JkIDB4NjdkZDRhY2MsIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUKKwkud29yZCAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxCisJLndvcmQgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YworCS53b3JkIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYKKwkud29yZCAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2CisJLndvcmQgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZQorCS53b3JkIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEKKwkud29yZCAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljCisJLndvcmQgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMworCS53b3JkIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsIDB4OTJkMjhlOWIKKwkud29yZCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyCisJLndvcmQgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMQorCS53b3JkIDB4MThiNzQ3NzcsIDB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMKKwkud29yZCAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4CisJLndvcmQgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNworCS53b3JkIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYKKwkud29yZCAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5CisJLndvcmQgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNQorCS53b3JkIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgKKwkud29yZCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LCAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiCisJLndvcmQgMHgyZDAyZWY4ZAorCitHUElPX0JBU0U6CisJLndvcmQgMHhmZmZjZTAwMAorR1BJT19ESVJFQ1RJT046CisJLndvcmQgMHgwMDAwZmZlNworCisuZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFyL2ZsYXNoLmMgYi9ib2FyZC9uZXRzdGFyL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvZmxhc2guYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogMk4gVGVsZWtvbXVuaWthY2UsIGEucy4gPHd3dy4ybi5jej4KKyAqIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qI2lmIDAgKi8KKyNpZiAoUEhZU19TRFJBTV8xX1NJWkUgIT0gU1pfMzJNKQorCisjaW5jbHVkZSAiY3JjZWsuaCIKKworI2lmIChDRkdfTUFYX0ZMQVNIX0JBTktTID4gMSkKKyNlcnJvciBUaGVyZSBpcyBhbHdheXMgb25seSBfb25lXyBmbGFzaCBjaGlwCisjZW5kaWYKKworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKyNkZWZpbmUgQ01EX1JFQURfQVJSQVkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgQ01EX1VOTE9DSzEJCTB4MDAwMDAwYWEKKyNkZWZpbmUgQ01EX1VOTE9DSzIJCTB4MDAwMDAwNTUKKyNkZWZpbmUgQ01EX0VSQVNFX1NFVFVQCQkweDAwMDAwMDgwCisjZGVmaW5lIENNRF9FUkFTRV9DT05GSVJNCTB4MDAwMDAwMzAKKyNkZWZpbmUgQ01EX1BST0dSQU0JCTB4MDAwMDAwYTAKKyNkZWZpbmUgQ01EX1VOTE9DS19CWVBBU1MJMHgwMDAwMDAyMAorCisjZGVmaW5lIE1FTV9GTEFTSF9BRERSMQkJKCoodm9sYXRpbGUgdTE2ICopKENGR19GTEFTSF9CQVNFICsgKDB4MDAwMDA1NTUgPDwgMSkpKQorI2RlZmluZSBNRU1fRkxBU0hfQUREUjIJCSgqKHZvbGF0aWxlIHUxNiAqKShDRkdfRkxBU0hfQkFTRSArICgweDAwMDAwMmFhIDw8IDEpKSkKKworI2RlZmluZSBCSVRfRVJBU0VfRE9ORQkJMHgwMDAwMDA4MAorI2RlZmluZSBCSVRfUkRZX01BU0sJCTB4MDAwMDAwODAKKyNkZWZpbmUgQklUX1BST0dSQU1fRVJST1IJMHgwMDAwMDAyMAorI2RlZmluZSBCSVRfVElNRU9VVAkJMHg4MDAwMDAwMAkvKiBvdXIgZmxhZyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9IChBTURfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSykgfAorCQkJCSAoQU1EX0lEX0xWODAwQiAmIEZMQVNIX1RZUEVNQVNLKTsKKwlmbGFzaF9pbmZvWzBdLnNpemUgPSBQSFlTX0ZMQVNIXzFfU0laRTsKKwlmbGFzaF9pbmZvWzBdLnNlY3Rvcl9jb3VudCA9IENGR19NQVhfRkxBU0hfU0VDVDsKKwltZW1zZXQoZmxhc2hfaW5mb1swXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCisJZm9yIChpID0gMDsgaSA8IGZsYXNoX2luZm9bMF0uc2VjdG9yX2NvdW50OyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDogLyogMTZrQiAqLworCQkJZmxhc2hfaW5mb1swXS5zdGFydFswXSA9IENGR19GTEFTSF9CQVNFOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogOGtCICovCisJCQlmbGFzaF9pbmZvWzBdLnN0YXJ0WzFdID0gQ0ZHX0ZMQVNIX0JBU0UgKyAweDQwMDA7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiA4a0IgKi8KKwkJCWZsYXNoX2luZm9bMF0uc3RhcnRbMl0gPSBDRkdfRkxBU0hfQkFTRSArIDB4NDAwMCArCisJCQkJCQkgMHgyMDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogMzIgS0IgKi8KKwkJCWZsYXNoX2luZm9bMF0uc3RhcnRbM10gPSBDRkdfRkxBU0hfQkFTRSArIDB4NDAwMCArCisJCQkJCQkgMiAqIDB4MjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlmbGFzaF9pbmZvWzBdLnN0YXJ0WzRdID0gQ0ZHX0ZMQVNIX0JBU0UgKyAweDQwMDAgKworCQkJCQkJIDIgKiAweDIwMDAgKyAweDgwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogNjRrQiAqLworCQkJZmxhc2hfaW5mb1swXS5zdGFydFtpXSA9IGZsYXNoX2luZm9bMF0uc3RhcnRbaS0xXSArCisJCQkJCQkgMHgxMDAwMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVS1Cb290ICovCisJZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICBMT0FERVIxX09GRlNFVCwKKwkJICAgICAgTE9BREVSMV9PRkZTRVQgKyBMT0FERVJfU0laRSAtIDEsIGZsYXNoX2luZm8pOworCS8qIFByb3RlY3QgY3JjZWssIGVudiBhbmQgcl9lbnYgYXMgd2VsbCAqLworCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwgMCwgMHg4MDAwIC0gMSwgZmxhc2hfaW5mbyk7CisKKwlyZXR1cm4gZmxhc2hfaW5mb1swXS5zaXplOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyhmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKKwljYXNlIChBTURfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSyk6CisJCXB1dHMoIkFNRDogIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMoIlVua25vd24gdmVuZG9yICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIChBTURfSURfTFY4MDBCICYgRkxBU0hfVFlQRU1BU0spOgorCQlwdXRzKCJBTTI5TFY4MDBCQiAoOE1iKVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMoIlVua25vd24gY2hpcCB0eXBlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiICBTaXplOiAlbGQgTUIgaW4gJWQgc2VjdG9yc1xuIiwKKwkgICAgICAgaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKworCXB1dHMoIiAgU2VjdG9yIHN0YXJ0IGFkZHJlc3NlczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXB1dHMoIlxuICAgIik7CisKKwkJcHJpbnRmKCIgJTA4bFglcyIsIGluZm8tPnN0YXJ0W2ldLAorCQkgICAgICAgaW5mby0+cHJvdGVjdFtpXSA/ICIgKFJPKSIgOiAiICAgICAiKTsKKwl9CisJcHV0cygiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCXVzaG9ydCByZXN1bHQ7CisJaW50IHByb3QsIHNlY3Q7CisJaW50IHJjID0gRVJSX09LOworCisJLyogZmlyc3QgbG9vayBmb3IgcHJvdGVjdGlvbiBiaXRzICovCisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikKKwkJcmV0dXJuIEVSUl9VTktOT1dOX0ZMQVNIX1RZUEU7CisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpCisJCXJldHVybiBFUlJfSU5WQUw7CisKKwlpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spICE9CisJICAgIChBTURfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSykpCisJCXJldHVybiBFUlJfVU5LTk9XTl9GTEFTSF9WRU5ET1I7CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgKytzZWN0KQorCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkKKwkJCXByb3QrKzsKKworCWlmIChwcm90KQorCQlwcmludGYoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwKKwkJICAgICAgIHByb3QpOworCWVsc2UKKwkJcHV0YygnXG4nKTsKKworCS8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdCAmJiAhY3RybGMgKCk7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCXZ1X3Nob3J0ICphZGRyID0gKHZ1X3Nob3J0ICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisKKwkJCS8qIGFybSBzaW1wbGUsIG5vbiBpbnRlcnJ1cHQgZGVwZW5kZW50IHRpbWVyICovCisJCQlyZXNldF90aW1lcl9tYXNrZWQoKTsKKworCQkJTUVNX0ZMQVNIX0FERFIxID0gQ01EX1VOTE9DSzE7CisJCQlNRU1fRkxBU0hfQUREUjIgPSBDTURfVU5MT0NLMjsKKwkJCU1FTV9GTEFTSF9BRERSMSA9IENNRF9FUkFTRV9TRVRVUDsKKworCQkJTUVNX0ZMQVNIX0FERFIxID0gQ01EX1VOTE9DSzE7CisJCQlNRU1fRkxBU0hfQUREUjIgPSBDTURfVU5MT0NLMjsKKwkJCSphZGRyID0gQ01EX0VSQVNFX0NPTkZJUk07CisKKwkJCS8qIHdhaXQgdW50aWwgZmxhc2ggaXMgcmVhZHkgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJcmVzdWx0ID0gKmFkZHI7CisKKwkJCQkvKiBjaGVjayB0aW1lb3V0ICovCisJCQkJaWYgKGdldF90aW1lcl9tYXNrZWQoKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJCU1FTV9GTEFTSF9BRERSMSA9IENNRF9SRUFEX0FSUkFZOworCQkJCQlyYyA9IEVSUl9USU1PVVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgocmVzdWx0ICYgMHhmZmYpICYgQklUX0VSQVNFX0RPTkUpCisJCQkJCWJyZWFrOworCisJCQkJaWYgKChyZXN1bHQgJiAweGZmZmYpICYgQklUX1BST0dSQU1fRVJST1IpIHsKKwkJCQkJcmMgPSBFUlJfUFJPR19FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlNRU1fRkxBU0hfQUREUjEgPSBDTURfUkVBRF9BUlJBWTsKKworCQkJaWYgKHJjICE9IEVSUl9PSykKKwkJCQlnb3RvIG91dDsKKworCQkJcHV0YygnLicpOworCQl9CisJfQorb3V0OgorCS8qIGFsbG93IGZsYXNoIHRvIHNldHRsZSAtIHdhaXQgMTAgbXMgKi8KKwl1ZGVsYXlfbWFza2VkKDEwMDAwKTsKKworCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gKKyAqLworCit2b2xhdGlsZSBzdGF0aWMgaW50IHdyaXRlX2h3b3JkKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdXNob3J0IGRhdGEpCit7CisJdnVfc2hvcnQgKmFkZHIgPSAodnVfc2hvcnQgKikgZGVzdDsKKwl1c2hvcnQgcmVzdWx0OworCWludCByYyA9IEVSUl9PSzsKKworCS8qIGNoZWNrIGlmIGZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCXJlc3VsdCA9ICphZGRyOworCWlmICgocmVzdWx0ICYgZGF0YSkgIT0gZGF0YSkKKwkJcmV0dXJuIEVSUl9OT1RfRVJBU0VEOworCisJTUVNX0ZMQVNIX0FERFIxID0gQ01EX1VOTE9DSzE7CisJTUVNX0ZMQVNIX0FERFIyID0gQ01EX1VOTE9DSzI7CisJTUVNX0ZMQVNIX0FERFIxID0gQ01EX1BST0dSQU07CisJKmFkZHIgPSBkYXRhOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKworCS8qIHdhaXQgdW50aWwgZmxhc2ggaXMgcmVhZHkgKi8KKwl3aGlsZSAoMSkgeworCQlyZXN1bHQgPSAqYWRkcjsKKworCQkvKiBjaGVjayB0aW1lb3V0ICovCisJCWlmIChnZXRfdGltZXJfbWFza2VkICgpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCXJjID0gRVJSX1RJTU9VVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChyZXN1bHQgJiAweDgwKSA9PSAoZGF0YSAmIDB4ODApKQorCQkJYnJlYWs7CisKKwkJaWYgKChyZXN1bHQgJiAweGZmZmYpICYgQklUX1BST0dSQU1fRVJST1IpIHsKKwkJCXJlc3VsdCA9ICphZGRyOworCisJCQlpZiAoKHJlc3VsdCAmIDB4ODApICE9IChkYXRhICYgMHg4MCkpCisJCQkJcmMgPSBFUlJfUFJPR19FUlJPUjsKKwkJfQorCX0KKworCSphZGRyID0gQ01EX1JFQURfQVJSQVk7CisKKwlpZiAoKmFkZHIgIT0gZGF0YSkKKwkJcmMgPSBFUlJfUFJPR19FUlJPUjsKKworCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2guCisgKi8KKworaW50IHdyaXRlX2J1ZmYoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwOworCWludCBsOworCWludCBpLCByYzsKKwl1c2hvcnQgZGF0YTsKKworCXdwID0gKGFkZHIgJiB+MSk7CS8qIGdldCBsb3dlciB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLworCisJLyoKKwkgKiBoYW5kbGUgdW5hbGlnbmVkIHN0YXJ0IGJ5dGVzCisJICovCisJaWYgKChsID0gYWRkciAtIHdwKSAhPSAwKSB7CisJCWRhdGEgPSAwOworCQlmb3IgKGkgPSAwLCBjcCA9IHdwOyBpIDwgbDsgKytpLCArK2NwKQorCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKikgY3AgPDwgOCk7CisJCWZvciAoOyBpIDwgMiAmJiBjbnQgPiAwOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudCA9PSAwICYmIGkgPCAyOyArK2ksICsrY3ApCisJCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKih1Y2hhciAqKSBjcCA8PCA4KTsKKworCQlpZiAoKHJjID0gd3JpdGVfaHdvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKQorCQkJcmV0dXJuIChyYyk7CisJCXdwICs9IDI7CisJfQorCisJLyoKKwkgKiBoYW5kbGUgd29yZCBhbGlnbmVkIHBhcnQKKwkgKi8KKwl3aGlsZSAoY250ID49IDIpIHsKKwkJZGF0YSA9ICooKHZ1X3Nob3J0ICopIHNyYyk7CisJCWlmICgocmMgPSB3cml0ZV9od29yZChpbmZvLCB3cCwgZGF0YSkpICE9IDApCisJCQlyZXR1cm4gKHJjKTsKKwkJc3JjICs9IDI7CisJCXdwICs9IDI7CisJCWNudCAtPSAyOworCX0KKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIEVSUl9PSzsKKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IDIgJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCS0tY250OworCX0KKwlmb3IgKDsgaSA8IDI7ICsraSwgKytjcCkKKwkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKikgY3AgPDwgOCk7CisKKwlyZXR1cm4gd3JpdGVfaHdvcmQoaW5mbywgd3AsIGRhdGEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvbmFuZC5jIGIvYm9hcmQvbmV0c3Rhci9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViN2YzMwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvbmFuZC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUgMk4gVEVMRUtPTVVOSUtBQ0UsIExhZGlzbGF2IE1pY2hsCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKworI2luY2x1ZGUgPG5hbmQuaD4KKworLyoKKyAqCWhhcmR3YXJlIHNwZWNpZmljIGFjY2VzcyB0byBjb250cm9sLWxpbmVzCisgKi8KKyNkZWZpbmUJTUFTS19DTEUJMHgwMgorI2RlZmluZQlNQVNLX0FMRQkweDA0CisKK3N0YXRpYyB2b2lkIG5ldHN0YXJfbmFuZF9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1bG9uZyBJT19BRERSX1cgPSAodWxvbmcpIHRoaXMtPklPX0FERFJfVzsKKworCUlPX0FERFJfVyAmPSB+KE1BU0tfQUxFfE1BU0tfQ0xFKTsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIE5BTkRfQ1RMX1NFVENMRTogSU9fQUREUl9XIHw9IE1BU0tfQ0xFOyBicmVhazsKKwkJY2FzZSBOQU5EX0NUTF9TRVRBTEU6IElPX0FERFJfVyB8PSBNQVNLX0FMRTsgYnJlYWs7CisJfQorCXRoaXMtPklPX0FERFJfVyA9ICh2b2lkICopIElPX0FERFJfVzsKK30KKworLyoKKyAqCWNoaXAgUi9CIGRldGVjdGlvbgorICovCitzdGF0aWMgaW50IG5ldHN0YXJfbmFuZF9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlyZXR1cm4gKCoodm9sYXRpbGUgdXNob3J0ICopR1BJT19EQVRBX0lOUFVUX1JFRykgJiAweDAyOworfQorCit2b2lkIGJvYXJkX25hbmRfaW5pdChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQoreworCW5hbmQtPm9wdGlvbnMgPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsKKwluYW5kLT5lY2Ntb2RlID0gTkFORF9FQ0NfU09GVDsKKwluYW5kLT5od2NvbnRyb2wgPSBuZXRzdGFyX25hbmRfaHdjb250cm9sOworLyoJbmFuZC0+ZGV2X3JlYWR5ID0gbmV0c3Rhcl9uYW5kX3JlYWR5OyAqLworCW5hbmQtPmNoaXBfZGVsYXkgPSAxODsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0c3Rhci9uZXRzdGFyLmMgYi9ib2FyZC9uZXRzdGFyL25ldHN0YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjYxNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3Rhci9uZXRzdGFyLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSAyTiBURUxFS09NVU5JS0FDRSwgTGFkaXNsYXYgTWljaGwKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK2ludCBib2FyZF9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwkvKiBhcmNoIG51bWJlciBvZiBOZXRTdGFyIGJvYXJkICovCisJLyogVE9ETzogdXNlIGRlZmluZSBmcm9tIGFzbS9tYWNoLXR5cGVzLmggKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gNjkyOworCisJLyogYWRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSAweDEwMDAwMTAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJLyogVGFrZSB0aGUgRXRoZXJuZXQgY29udHJvbGxlciBvdXQgb2YgcmVzZXQgYW5kIHdhaXQKKwkgKiBmb3IgdGhlIEVFUFJPTSBsb2FkIHRvIGNvbXBsZXRlLiAqLworCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIEdQSU9fREFUQV9PVVRQVVRfUkVHKSB8PSAweDgwOworCXVkZWxheSgxMCk7CS8qIGRvZXNuJ3Qgd29yayBiZWZvcmUgaW50ZXJydXB0X2luaXQgY2FsbCAqLworCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIEdQSU9fREFUQV9PVVRQVVRfUkVHKSAmPSB+MHg4MDsKKwl1ZGVsYXkoNTAwKTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBwYXJ0aXRpb25fZmxhc2godm9pZCk7CisKK2ludCBtaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBuYW5kX2luaXQodm9pZCk7CisKK2ludCBib2FyZF9sYXRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL25ldHN0YXIvc2V0dXAuUyBiL2JvYXJkL25ldHN0YXIvc2V0dXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc3ODZkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbmV0c3Rhci9zZXR1cC5TCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBBbGVzIEppbmRyYSA8amluZHJhQDJuLmN6PgorICogKEMpIENvcHlyaWdodCAyMDA1IExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBTRFJBTSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworT01BUDU5MTBfTFBHMV9CQVNFOgkJLndvcmQgMHhmZmZiZDAwMAorT01BUDU5MTBfVElQQl9TV0lUQ0hFU19CQVNFOgkud29yZCAweGZmZmJjODAwCitPTUFQNTkxMF9NUFVfVENfQkFTRToJCS53b3JkIDB4ZmZmZWNjMDAKK09NQVA1OTEwX01QVV9DTEtNX0JBU0U6CQkud29yZCAweGZmZmVjZTAwCitPTUFQNTkxMF9VTFBEX1BXUl9NTkdfQkFTRToJLndvcmQgMHhmZmZlMDgwMAorT01BUDU5MTBfRFBMTDFfQkFTRToJCS53b3JkIDB4ZmZmZWNmMDAKK09NQVA1OTEwX0dQSU9fQkFTRToJCS53b3JkIDB4ZmZmY2UwMDAKK09NQVA1OTEwX01QVV9XRF9USU1FUl9CQVNFOgkud29yZCAweGZmZmVjODAwCitPTUFQNTkxMF9NUFVJX0JBU0U6CQkud29yZCAweGZmZmVjOTAwCisKK19PTUFQNTkxMF9BUk1fQ0tDVEw6CQkud29yZCBPTUFQNTkxMF9BUk1fQ0tDVEwKK19PTUFQNTkxMF9BUk1fRU5fQ0xLOgkJLndvcmQgT01BUDU5MTBfQVJNX0VOX0NMSworCitPTUFQNTkxMF9NUFVJX0NUUkw6CQkud29yZCAweDAwMDBmZjFiCisKK1ZBTF9FTUlGU19DUzBfQ09ORklHOgkJLndvcmQgMHgwMDAwOTA5MAorVkFMX0VNSUZTX0NTMV9DT05GSUc6CQkud29yZCAweDAwMDAzMDMxCitWQUxfRU1JRlNfQ1MyX0NPTkZJRzoJCS53b3JkIDB4MDAwMGEwYTEKK1ZBTF9FTUlGU19DUzNfQ09ORklHOgkJLndvcmQgMHgwMDAwYzBjMAorVkFMX0VNSUZTX0RZTl9XQUlUOgkJLndvcmQgMHgwMDAwMDAwMAorLyogYXV0b3JlZnJlc2ggY291bnRlciAweDI0NiAoKDY0MDAwMDAwLzEzLjQpLTQwMCkvODE5MikgKi8KKwkJCQkvKiAgICAgU0xSRiAgICAgICBTRF9SRVQgICAgIEFSRSAgICAgICAgU0RSQU1fVFlQRSAgIEFSQ1YgICAgICAgICAgIFNEUkFNX0ZSRVFVRU5DWSBQV0QgICAgIENMSyAqLworCisjaWYgKFBIWVNfU0RSQU1fMV9TSVpFID09IFNaXzMyTSkKK1ZBTF9FTUlGRl9TRFJBTV9DT05GSUc6CQkud29yZCAoKDAgPDwgMCkgfCAoMCA8PCAxKSB8ICgzIDw8IDIpIHwgKDB4ZiA8PCA0KSB8ICgweDI0NiA8PCA4KSB8ICgwIDw8IDI0KSB8ICgwIDw8IDI2KSB8ICgwIDw8IDI3KSkKKyNlbHNlCitWQUxfRU1JRkZfU0RSQU1fQ09ORklHOgkJLndvcmQgKCgwIDw8IDApIHwgKDAgPDwgMSkgfCAoMyA8PCAyKSB8ICgweGQgPDwgNCkgfCAoMHgyNDYgPDwgOCkgfCAoMCA8PCAyNCkgfCAoMCA8PCAyNikgfCAoMCA8PCAyNykpCisjZW5kaWYKKworVkFMX0VNSUZGX1NEUkFNX0NPTkZJRzI6CS53b3JkIDB4MDAwMDAwMDMKK1ZBTF9FTUlGRl9NUlM6CQkJLndvcmQgMHgwMDAwMDAzNworCisvKgorICogR1BJTzA0IC0gR3JlZW4gTEVEIChSZWQgTEVEIGlzIGNvbm5lY3RlZCB0byBMRUQgUHVsc2UgR2VuZXJhdG9yKQorICogR1BJTzA3IC0gTEFOOTFDMTExIHJlc2V0CisgKi8KK0dQSU9fRElSRUNUSU9OOgorCS53b3JkIDB4MDAwMGZmNmYKKy8qCisgKiBEaXNhYmxlIGV2ZXJ5dGhpbmcgKGdyZWVuIExFRCBpcyBjb25uZWN0ZWQgdmlhIGludmVydG9yKQorICovCitHUElPX09VVFBVVDoKKwkud29yZCAweDAwMDAwMDEwCisKK01VWF9DT05GSUdfQkFTRToKKwkud29yZCAweGZmZmUxMDAwCisKK01VWF9DT05GSUdfVkFMVUVTOgorCS5hbGlnbiA0CisJLndvcmQgMHgwMDAwMDAwMAlAIEZVTkNfTVVYX0NUUkxfMAorCS53b3JkIDB4MDAwMDAwMDAJQCBGVU5DX01VWF9DVFJMXzEKKwkud29yZCAweDAwMDAwMDAwCUAgRlVOQ19NVVhfQ1RSTF8yCisJLndvcmQgMHgwMDAwMDAwMAlAIEZVTkNfTVVYX0NUUkxfMworCS53b3JkIDB4MDAwMDAwMDAJQCBGVU5DX01VWF9DVFJMXzQKKwkud29yZCAweDAyMDgwNDgwCUAgRlVOQ19NVVhfQ1RSTF81CisJLndvcmQgMHgwMTAwMDAxYwlAIEZVTkNfTVVYX0NUUkxfNgorCS53b3JkIDB4MDAwNDgwMGIJQCBGVU5DX01VWF9DVFJMXzcKKwkud29yZCAweDEwMDAxMjAwCUAgRlVOQ19NVVhfQ1RSTF84CisJLndvcmQgMHgwMTIwMTAxMglAIEZVTkNfTVVYX0NUUkxfOQorCS53b3JkIDB4MDIwODIyNDgJQCBGVU5DX01VWF9DVFJMX0EKKwkud29yZCAweDAwMDAwMjQ4CUAgRlVOQ19NVVhfQ1RSTF9CCisJLndvcmQgMHgxMjI0MDAwMAlAIEZVTkNfTVVYX0NUUkxfQworCS53b3JkIDB4MDAwMDIwMDAJQCBGVU5DX01VWF9DVFJMX0QKKwkud29yZCAweDAwMDAwMDAwCUAgUFVMTF9EV05fQ1RSTF8wCisJLndvcmQgMHgwMDAwMDgwMAlAIFBVTExfRFdOX0NUUkxfMQorCS53b3JkIDB4MDE4MDEwMDAJQCBQVUxMX0RXTl9DVFJMXzIKKwkud29yZCAweDAwMDAwMDAwCUAgUFVMTF9EV05fQ1RSTF8zCisJLndvcmQgMHgwMDAwMDAwMAlAIEdBVEVfSU5IX0NUUkxfMAorCS53b3JkIDB4MDAwMDAwMDAJQCBWT0xUQUdFX0NUUkxfMAorCS53b3JkIDB4MDAwMDAwMDAJQCBURVNUX0RCR19DVFJMXzAKKwkud29yZCAweDAwMDAwMDA2CUAgTU9EX0NPTkZfQ1RSTF8wCisJLndvcmQgMHgwMDAwZWFlZglAIENPTVBfTU9ERV9DVFJMXzAKKworTVVYX0NPTkZJR19PRkZTRVRTOgorCS5hbGlnbiAxCisJLmJ5dGUgMHgwMAkJQCBGVU5DX01VWF9DVFJMXzAKKwkuYnl0ZSAweDA0CQlAIEZVTkNfTVVYX0NUUkxfMQorCS5ieXRlIDB4MDgJCUAgRlVOQ19NVVhfQ1RSTF8yCisJLmJ5dGUgMHgxMAkJQCBGVU5DX01VWF9DVFJMXzMKKwkuYnl0ZSAweDE0CQlAIEZVTkNfTVVYX0NUUkxfNAorCS5ieXRlIDB4MTgJCUAgRlVOQ19NVVhfQ1RSTF81CisJLmJ5dGUgMHgxYwkJQCBGVU5DX01VWF9DVFJMXzYKKwkuYnl0ZSAweDIwCQlAIEZVTkNfTVVYX0NUUkxfNworCS5ieXRlIDB4MjQJCUAgRlVOQ19NVVhfQ1RSTF84CisJLmJ5dGUgMHgyOAkJQCBGVU5DX01VWF9DVFJMXzkKKwkuYnl0ZSAweDJjCQlAIEZVTkNfTVVYX0NUUkxfQQorCS5ieXRlIDB4MzAJCUAgRlVOQ19NVVhfQ1RSTF9CCisJLmJ5dGUgMHgzNAkJQCBGVU5DX01VWF9DVFJMX0MKKwkuYnl0ZSAweDM4CQlAIEZVTkNfTVVYX0NUUkxfRAorCS5ieXRlIDB4NDAJCUAgUFVMTF9EV05fQ1RSTF8wCisJLmJ5dGUgMHg0NAkJQCBQVUxMX0RXTl9DVFJMXzEKKwkuYnl0ZSAweDQ4CQlAIFBVTExfRFdOX0NUUkxfMgorCS5ieXRlIDB4NGMJCUAgUFVMTF9EV05fQ1RSTF8zCisJLmJ5dGUgMHg1MAkJQCBHQVRFX0lOSF9DVFJMXzAKKwkuYnl0ZSAweDYwCQlAIFZPTFRBR0VfQ1RSTF8wCisJLmJ5dGUgMHg3MAkJQCBURVNUX0RCR19DVFJMXzAKKwkuYnl0ZSAweDgwCQlAIE1PRF9DT05GX0NUUkxfMAorCS5ieXRlIDB4MGMJCUAgQ09NUF9NT0RFX0NUUkxfMAorCS5ieXRlIDB4ZmYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJLyogSW1wcm92ZSBwZXJmb3JtYW5jZSBhIGJpdC4uLiAqLworCW1yYwlwMTUsIDAsIHIxLCBjMCwgYzAsIDAJCUAgcmVhZCBDMTUgSUQgcmVnaXN0ZXIKKwltcmMJcDE1LCAwLCByMSwgYzAsIGMwLCAxCQlAIHJlYWQgQzE1IENhY2hlIGluZm9ybWF0aW9uIHJlZ2lzdGVyCisJbXJjCXAxNSwgMCwgcjEsIGMxLCBjMCwgMAkJQCByZWFkIEMxNSBDb250cm9sIHJlZ2lzdGVyCisJb3JyCXIxLCByMSwgIzB4MTAwMAkJCUAgZW5hYmxlIEktY2FjaGUsIG1hcCBpbnRlcnJ1cHQgdmVjdG9yIDB4ZmZmZjAwMDAKKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIHdyaXRlIEMxNSBDb250cm9sIHJlZ2lzdGVyCisJbW92CXIxLCAjMHgwMAorCW1jcglwMTUsIDAsIHIxLCBjNywgYzUsIDAJCUAgRmx1c2ggSS1jYWNoZQorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCisJLyogU2V0dXAgY2xvY2tpbmcgbW9kZSAqLworCWxkcglyMCwgT01BUDU5MTBfTVBVX0NMS01fQkFTRQlAIHByZXBhcmUgYmFzZSBvZiBDTE9DSyB1bml0CisJbGRyaAlyMSwgW3IwLCAjMHgxOF0JCQlAIGdldCByZXNldCBzdGF0dXMKKwliaWMJcjEsIHIxLCAjKDcgPDwgMTEpCQlAIGNsZWFyIGNsb2NrIHNlbGVjdAorCW9ycglyMSwgcjEsICMoMiA8PCAxMSkJCUAgc2V0IHN5bmNocm9ub3VzIHNjYWxhYmxlCisJbW92CXIyLCAjMAkJCQlAIHNldCB3YWl0IGNvdW50ZXIgdG8gMTAwIGNsb2NrIGN5Y2xlcworCitpY2FjaGVfbG9vcDoKKwljbXAJcjIsICMweDAxCisJc3RyZXFoCXIxLCBbcjAsICMweDE4XQorCWFkZAlyMiwgcjIsICMweDAxCisJY21wCXIyLCAjMHgxMAorCWJuZQlpY2FjaGVfbG9vcAorCW5vcAorCisJLyogU2V0dXAgY2xvY2sgZGl2aXNvcnMgKi8KKwlsZHIJcjAsIE9NQVA1OTEwX01QVV9DTEtNX0JBU0UJQCBiYXNlIG9mIENMT0NLIHVuaXQKKwlsZHIJcjEsIF9PTUFQNTkxMF9BUk1fQ0tDVEwKKwlvcnIJcjEsIHIxLCAjMHgyMDAwCQkJQCBlbmFibGUgRFNQIGNsb2NrCisJc3RyaAlyMSwgW3IwLCAjMHgwMF0JCQlAIHNldHVwIGNsb2NrIGRpdmlzb3JzCisKKwkvKiBTZXR1cCBEUExMIHRvIGdlbmVyYXRlIHJlcXVlc3RlZCBmcmVxICovCisJbGRyCXIwLCBPTUFQNTkxMF9EUExMMV9CQVNFCQlAIGJhc2Ugb2YgRFBMTDEgcmVnaXN0ZXIKKwltb3YJcjEsICMweDAwMTAJCQlAIHNldCBQTExfRU5BQkxFCisJb3JyCXIxLCByMSwgIzB4MjAwMAkJCUAgc2V0IElPQiB0byBuZXcgbG9ja2luZworCW9ycglyMSwgcjEsICMoT01BUDU5MTBfRFBMTF9NVUwgPDwgNykgQCBzZXR1cCBtdWx0aXBsaWVyIENMS1JFRgorCW9ycglyMSwgcjEsICMoT01BUDU5MTBfRFBMTF9ESVYgPDwgNSkgQCBzZXR1cCBkaXZpZGVyIENMS1JFRgorCXN0cmgJcjEsIFtyMF0JCQlAIHdyaXRlCisKK2xvY2tpbmc6CisJbGRyaAlyMSwgW3IwXQkJCUAgZ2V0IERQTEwgdmFsdWUKKwl0c3QJcjEsICMweDAxCisJYmVxCWxvY2tpbmcJCQkJQCB3aGlsZSBMT0NLIG5vdCBzZXQKKworCS8qIEVuYWJsZSBjbG9jayAqLworCWxkcglyMCwgT01BUDU5MTBfTVBVX0NMS01fQkFTRQlAIGJhc2Ugb2YgQ0xPQ0sgdW5pdAorCW1vdglyMSwgIygxIDw8IDEwKQkJCUAgZGlzYWJsZSBpZGxlIG1vZGUgZG8gbm90IGNoZWNrCisJCQkJCQlAIG5XQUtFVVAgcGluLCBvdGhlciByZW1haW4gYWN0aXZlCisJc3RyaAlyMSwgW3IwLCAjMHgwNF0KKwlsZHIJcjEsIF9PTUFQNTkxMF9BUk1fRU5fQ0xLCisJc3RyaAlyMSwgW3IwLCAjMHgwOF0KKwltb3YJcjEsICMweDAwM2YJCQlAIEZMQVNILlJQIG5vdCBlbmFibGVkIGluIGlkbGUgYW5kCisJCQkJCQlAIG1heCBkZWxheWVkICggMzIgeCBDTEtJTiApCisJc3RyaAlyMSwgW3IwLCAjMHgwY10KKworCS8qIENvbmZpZ3VyZSA1OTEwIHBpbnMgZnVuY3Rpb25zIHRvIG1hdGNoIG91ciBib2FyZC4gKi8KKwlsZHIgICAgIHIwLCBNVVhfQ09ORklHX0JBU0UKKwlhZHIJcjEsIE1VWF9DT05GSUdfVkFMVUVTCisJYWRyCXIyLCBNVVhfQ09ORklHX09GRlNFVFMKK25leHRfbXV4X2NmZzoKKwlsZHJiCXIzLCBbcjJdLCAjMQorCWxkcglyNCwgW3IxXSwgIzQKKwljbXAJcjMsICMweGZmCisJc3RybmUJcjQsIFtyMCwgcjNdCisJYm5lCW5leHRfbXV4X2NmZworCisJLyogQ29uZmlndXJlIEdQSU8gcGlucyAoYWxzbyBkaXNhYmxlcyBHcmVlbiBMRUQpICovCisJbGRyCXIwLCBPTUFQNTkxMF9HUElPX0JBU0UKKwlsZHIJcjEsIEdQSU9fT1VUUFVUCisJc3RyaCAgICByMSwgW3IwLCAjMHgwNF0KKwlsZHIJcjEsIEdQSU9fRElSRUNUSU9OCisJc3RyaAlyMSwgW3IwLCAjMHgwOF0KKworCS8qIEVuYWJsZVBlcmlwaGVyYWxzICovCisJbGRyCXIwLCBPTUFQNTkxMF9NUFVfQ0xLTV9CQVNFCUAgQ0xPQ0sgdW5pdAorCW1vdglyMSwgIzB4MDAwMQkJCUAgUGVyaXBoZXJhbCBlbmFibGUKKwlzdHJoCXIxLCBbcjAsICMweDE0XQorCisJLyogUHJvZ3JhbSBMRUQgUHVsc2UgR2VuZXJhdG9yICovCisJbGRyCXIwLCBPTUFQNTkxMF9MUEcxX0JBU0UJCUAgMXN0IExFRCBQdWxzZSBHZW5lcmF0b3IKKwltb3YJcjEsICMweDdGCQkJQCBTZXQgb2JzY3VyZSBmcmVxdWVuY3kgaW4KKwlzdHJiCXIxLCBbcjAsICMweDAwXQkJCUAgTENSCisJbW92CXIxLCAjMHgwMQkJCUAgRW5hYmxlIGNsb2NrIChDTEtfRU4pIGluCisJc3RyYiAgICByMSwgW3IwLCAjMHgwNF0JCQlAIFBNUgorCisJLyogVElQQiBMb2NrIFVBUlQxICovCisJbGRyCXIwLCBPTUFQNTkxMF9USVBCX1NXSVRDSEVTX0JBU0UJQCBwcmVwYXJlIGJhc2Ugb2YgVElQQiBzd2l0Y2hlcworCW1vdglyMSwgIzEJCQkJQCBBUk0gYWxsb2NhdGVkCisJc3RyaAlyMSwgW3IwLCMweDA0XQkJCUAgY2xlYXIgSVJRIGxpbmUgYW5kIHN0YXR1cyBiaXRzCisJc3RyaAlyMSwgW3IwLCMweDAwXQorCWxkcmgJcjEsIFtyMCwjMHgwNF0KKworCS8qIERpc2FibGUgd2F0Y2hkb2cgKi8KKwlsZHIJcjAsIE9NQVA1OTEwX01QVV9XRF9USU1FUl9CQVNFCisJbW92CXIxLCAjMHhmNQorCXN0cmgJcjEsIFtyMCwgIzB4OF0KKwltb3YJcjEsICMweGEwCisJc3RyaAlyMSwgW3IwLCAjMHg4XQorCisJLyogRW5hYmxlIE1DTEsgKi8KKwlsZHIJcjAsIE9NQVA1OTEwX1VMUERfUFdSX01OR19CQVNFCisJbW92CXIxLCAjMHg2CisJc3RyaAlyMSwgW3IwLCAjMHgzNF0KKwlzdHJoCXIxLCBbcjAsICMweDM0XQorCisJLyogU2V0dXAgY2xvY2sgZGl2aXNvcnMgKi8KKwlsZHIJcjAsIE9NQVA1OTEwX1VMUERfUFdSX01OR19CQVNFCUAgYmFzZSBvZiBVTERQTCBEUExMMSByZWdpc3RlcgorCisJbW92CXIxLCAjMHgwMDEwCQkJQCBzZXQgUExMX0VOQUJMRQorCW9ycglyMSwgcjEsICMweDIwMDAJCQlAIHNldCBJT0IgdG8gbmV3IGxvY2tpbmcKKwlzdHJoCXIxLCBbcjBdCQkJQCB3cml0ZQorCit1bG9ja2luZzoKKwlsZHJoCXIxLCBbcjBdCQkJQCBnZXQgRFBMTCB2YWx1ZQorCXRzdAlyMSwgIzEKKwliZXEJdWxvY2tpbmcJCQlAIHdoaWxlIExPQ0sgbm90IHNldAorCisJLyogRU1JRiBpbml0ICovCisJbGRyCXIwLCBPTUFQNTkxMF9NUFVfVENfQkFTRQorCWxkcmgJcjEsIFtyMCwgIzB4MGNdCQkJQCBFTUlGU19DT05GSUdfUkVHCisJYmljCXIxLCByMSwgIzB4MGMJCQlAIHB3ciBkb3duIGRpc2FibGVkLCBmbGFzaCBXUAorCW9ycglyMSwgcjEsICMweDAxCisJc3RyCXIxLCBbcjAsICMweDBjXQorCisJbGRyCXIxLCBWQUxfRU1JRlNfQ1MwX0NPTkZJRworCXN0cglyMSwgW3IwLCAjMHgxMF0JCQlAIEVNSUZTX0NTMF9DT05GSUcKKwlsZHIJcjEsIFZBTF9FTUlGU19DUzFfQ09ORklHCisJc3RyCXIxLCBbcjAsICMweDE0XQkJCUAgRU1JRlNfQ1MxX0NPTkZJRworCWxkcglyMSwgVkFMX0VNSUZTX0NTMl9DT05GSUcKKwlzdHIJcjEsIFtyMCwgIzB4MThdCQkJQCBFTUlGU19DUzJfQ09ORklHCisJbGRyCXIxLCBWQUxfRU1JRlNfQ1MzX0NPTkZJRworCXN0cglyMSwgW3IwLCAjMHgxY10JCQlAIEVNSUZTX0NTM19DT05GSUcKKwlsZHIJcjEsIFZBTF9FTUlGU19EWU5fV0FJVAorCXN0cglyMSwgW3IwLCAjMHg0MF0JCQlAIEVNSUZTX0NGR19EWU5fV0FJVAorCisJLyogU2V0dXAgU0RSQU0gKi8KKwlsZHIJcjEsIFZBTF9FTUlGRl9TRFJBTV9DT05GSUcKKwlzdHIJcjEsIFtyMCwgIzB4MjBdCQkJQCBFTUlGRl9TRFJBTV9DT05GSUcKKwlsZHIJcjEsIFZBTF9FTUlGRl9TRFJBTV9DT05GSUcyCisJc3RyCXIxLCBbcjAsICMweDNjXQkJCUAgRU1JRkZfU0RSQU1fQ09ORklHMgorCWxkcglyMSwgVkFMX0VNSUZGX01SUworCXN0cglyMSwgW3IwLCAjMHgyNF0JCQlAIEVNSUZGX01SUworCS8qIFNEUkFNIG5lZWRzIDEwMHVzIHRvIHN0YWJpbGl6ZSAqLworCW1vdglyMCwgIzB4NDAwMAorc2RlbGF5OgorCXN1YnMJcjAsIHIwLCAjMHgxCisJYm5lIAlzZGVsYXkKKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsIGxyCisuZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFyL3UtYm9vdC5sZHMgYi9ib2FyZC9uZXRzdGFyL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxN2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL25ldHN0YXIvdS1ib290LmxkcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtOTI1dC9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwlfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisJX191X2Jvb3RfY21kX2VuZCA9IC47CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmV0dGEyL2NvbmZpZy5tayBiL2JvYXJkL25ldHRhMi9jb25maWcubWsKaW5kZXggODQ5N2ViYy4uNGI2MzZlZCAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0dGEyL2NvbmZpZy5taworKysgYi9ib2FyZC9uZXR0YTIvY29uZmlnLm1rCkBAIC0yNiwzICsyNiw3IEBACiAjCiAKIFRFWFRfQkFTRSA9IDB4NDAwMDAwMDAKKworIyBDb21waWxlIHRoZSBsZWdhY3kgTkFORCBjb2RlIChDRkdfTkFORF9MRUdBQ1kgbXVzdCBiZSBkZWZpbmVkKQorQk9BUkRMSUJTID0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCisKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHRhMi9uZXR0YTIuYyBiL2JvYXJkL25ldHRhMi9uZXR0YTIuYwppbmRleCBjOWI0MDUxLi4zY2E3YmQzIDEwMDY0NAotLS0gYS9ib2FyZC9uZXR0YTIvbmV0dGEyLmMKKysrIGIvYm9hcmQvbmV0dGEyL25ldHRhMi5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCiAKLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCiBleHRlcm4gdWxvbmcgbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CmRpZmYgLS1naXQgYS9ib2FyZC9uZXR2aWEvY29uZmlnLm1rIGIvYm9hcmQvbmV0dmlhL2NvbmZpZy5tawppbmRleCA5ZGRkYWFkLi41ODMxNzRhIDEwMDY0NAotLS0gYS9ib2FyZC9uZXR2aWEvY29uZmlnLm1rCisrKyBiL2JvYXJkL25ldHZpYS9jb25maWcubWsKQEAgLTI2LDMgKzI2LDYgQEAKICMKIAogVEVYVF9CQVNFID0gMHg0MDAwMDAwMAorCisjIENvbXBpbGUgdGhlIGxlZ2FjeSBOQU5EIGNvZGUgKENGR19OQU5EX0xFR0FDWSBtdXN0IGJlIGRlZmluZWQpCitCT0FSRExJQlMgPSBkcml2ZXJzL25hbmRfbGVnYWN5L2xpYm5hbmRfbGVnYWN5LmEKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHZpYS9uZXR2aWEuYyBiL2JvYXJkL25ldHZpYS9uZXR2aWEuYwppbmRleCBmYjdmNzcwLi4zZTZjNjE2IDEwMDY0NAotLS0gYS9ib2FyZC9uZXR2aWEvbmV0dmlhLmMKKysrIGIvYm9hcmQvbmV0dmlhL25ldHZpYS5jCkBAIC00MTgsNyArNDE4LDcgQEAKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCiAKLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCiBleHRlcm4gdWxvbmcgbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CmRpZmYgLS1naXQgYS9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYyBiL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCmluZGV4IDZhZTFhNDkuLjIzODcxNzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCisrKyBiL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JvYXJkL3NpeG5ldC9jb25maWcubWsgYi9ib2FyZC9zaXhuZXQvY29uZmlnLm1rCmluZGV4IDBjZDhmNDQuLjhlNzNkMmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NpeG5ldC9jb25maWcubWsKKysrIGIvYm9hcmQvc2l4bmV0L2NvbmZpZy5tawpAQCAtMjYsMyArMjYsNiBAQAogIwogCiBURVhUX0JBU0UgPSAweEY4MDAwMDAwCisKKyMgQ29tcGlsZSB0aGUgbGVnYWN5IE5BTkQgY29kZSAoQ0ZHX05BTkRfTEVHQUNZIG11c3QgYmUgZGVmaW5lZCkKK0JPQVJETElCUyA9IGRyaXZlcnMvbmFuZF9sZWdhY3kvbGlibmFuZF9sZWdhY3kuYQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2l4bmV0L3NpeG5ldC5jIGIvYm9hcmQvc2l4bmV0L3NpeG5ldC5jCmluZGV4IDg2NzU4OWYuLmEyNWRmZmQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NpeG5ldC9zaXhuZXQuYworKysgYi9ib2FyZC9zaXhuZXQvc2l4bmV0LmMKQEAgLTM0LDcgKzM0LDcgQEAKICNlbmRpZgogCiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9ib2FyZC9zdHh4dGMvc3R4eHRjLmMgYi9ib2FyZC9zdHh4dGMvc3R4eHRjLmMKaW5kZXggYWEzZDEyOS4uN2NhZjA2YSAxMDA2NDQKLS0tIGEvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jCisrKyBiL2JvYXJkL3N0eHh0Yy9zdHh4dGMuYwpAQCAtNTc2LDcgKzU3Niw3IEBACiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQogCi0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIAogZXh0ZXJuIHVsb25nIG5hbmRfcHJvYmUodWxvbmcgcGh5c2Fkcik7CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kb2MuYyBiL2NvbW1vbi9jbWRfZG9jLmMKaW5kZXggNWU5YmVhMy4uYzcyNjk1NyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kb2MuYworKysgYi9jb21tb24vY21kX2RvYy5jCkBAIC0yMiw4ICsyMiw5IEBACiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25mdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2lkcy5oPgorCiAjaW5jbHVkZSA8bGludXgvbXRkL2RvYzIwMDAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmZ0bC5oPgogCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2pmZnMyLmMgYi9jb21tb24vY21kX2pmZnMyLmMKaW5kZXggMzQ5MjBiMS4uMjAxYzNjMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9qZmZzMi5jCisrKyBiL2NvbW1vbi9jbWRfamZmczIuYwpAQCAtOTEsNyArOTEsNiBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKQEAgLTk5LDExICs5OCwxOSBAQAogCiAjaW5jbHVkZSA8Y3JhbWZzL2NyYW1mc19mcy5oPgogCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KKyNlbHNlIC8qICFDRkdfTkFORF9MRUdBQ1kgKi8KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPG5hbmQuaD4KKyNlbmRpZiAvKiAhQ0ZHX05BTkRfTEVHQUNZICovCisjZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KIC8qIGVuYWJsZS9kaXNhYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwotI2RlZmluZQlERUJVRwotI3VuZGVmCURFQlVHCisjZGVmaW5lCURFQlVHX0pGRlMKKyN1bmRlZglERUJVR19KRkZTCiAKLSNpZmRlZiAgREVCVUcKKyNpZmRlZiAgREVCVUdfSkZGUwogIyBkZWZpbmUgREVCVUdGKGZtdCwgYXJncy4uLikJcHJpbnRmKGZtdCAsIyNhcmdzKQogI2Vsc2UKICMgZGVmaW5lIERFQlVHRihmbXQsIGFyZ3MuLi4pCkBAIC0xMjMsNyArMTMwLDcgQEAKIAogLyogdGhpcyBmbGFnIG5lZWRzIHRvIGJlIHNldCBpbiBwYXJ0X2luZm8gc3RydWN0IG1hc2tfZmxhZ3MKICAqIGZpZWxkIGZvciByZWFkLW9ubHkgcGFydGl0aW9ucyAqLwotI2RlZmluZSBNVERfV1JJVEVBQkxFCQkxCisjZGVmaW5lIE1URF9XUklURUFCTEVfQ01ECQkxCiAKICNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQogLyogZGVmYXVsdCB2YWx1ZXMgZm9yIG10ZGlkcyBhbmQgbXRkcGFydHMgdmFyaWFibGVzICovCkBAIC0zNjUsMTAgKzM3Miw5IEBACiB7CiAjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKIAkvKiBpbmZvIGZvciBOQU5EIGNoaXBzICovCi0JZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kOworCW5hbmRfaW5mb190ICpuYW5kOwogCi0JbmFuZCA9ICZuYW5kX2Rldl9kZXNjW2lkLT5udW1dOworCW5hbmQgPSAmbmFuZF9pbmZvW2lkLT5udW1dOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKShwYXJ0LT5vZmZzZXQpICUgbmFuZC0+ZXJhc2VzaXplKSB7CiAJCXByaW50ZigiJXMlZDogcGFydGl0aW9uICglcykgc3RhcnQgb2Zmc2V0IGFsaWdubWVudCBpbmNvcnJlY3RcbiIsCkBAIC00NjQsNyArNDcwLDkgQEAKIAkJfQogCX0KIAorI2lmZGVmIENGR19OQU5EX0xFR0FDWQogCWpmZnMyX2ZyZWVfY2FjaGUocGFydCk7CisjZW5kaWYKIAlsaXN0X2RlbCgmcGFydC0+bGluayk7CiAJZnJlZShwYXJ0KTsKIAlkZXYtPm51bV9wYXJ0cy0tOwpAQCAtNDkxLDcgKzQ5OSw5IEBACiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCBuLCBoZWFkKSB7CiAJCXBhcnRfdG1wID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CiAKKyNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKIAkJamZmczJfZnJlZV9jYWNoZShwYXJ0X3RtcCk7CisjZW5kaWYKIAkJbGlzdF9kZWwoZW50cnkpOwogCQlmcmVlKHBhcnRfdG1wKTsKIAl9CkBAIC02NDYsNyArNjU2LDcgQEAKIAkvKiB0ZXN0IGZvciBvcHRpb25zICovCiAJbWFza19mbGFncyA9IDA7CiAJaWYgKHN0cm5jbXAocCwgInJvIiwgMikgPT0gMCkgewotCQltYXNrX2ZsYWdzIHw9IE1URF9XUklURUFCTEU7CisJCW1hc2tfZmxhZ3MgfD0gTVREX1dSSVRFQUJMRV9DTUQ7CiAJCXAgKz0gMjsKIAl9CiAKQEAgLTcxMyw2ICs3MjMsNyBAQAogCQlpZiAobnVtIDwgQ0ZHX01BWF9GTEFTSF9CQU5LUykgewogCQkJZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CiAJCQkqc2l6ZSA9IGZsYXNoX2luZm9bbnVtXS5zaXplOworCiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC03MjQsOCArNzM1LDEyIEBACiAJfSBlbHNlIGlmICh0eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKSB7CiAjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKIAkJaWYgKG51bSA8IENGR19NQVhfTkFORF9ERVZJQ0UpIHsKKyNpZm5kZWYgQ0ZHX05BTkRfTEVHQUNZCisJCQkqc2l6ZSA9IG5hbmRfaW5mb1tudW1dLnNpemU7CisjZWxzZQogCQkJZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIAkJCSpzaXplID0gbmFuZF9kZXZfZGVzY1tudW1dLnRvdGxlbjsKKyNlbmRpZgogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMTE2OSw3ICsxMTg0LDcgQEAKIAkJCX0KIAogCQkJLyogcm8gbWFzayBmbGFnICovCi0JCQlpZiAocGFydC0+bWFza19mbGFncyAmJiBNVERfV1JJVEVBQkxFKSB7CisJCQlpZiAocGFydC0+bWFza19mbGFncyAmJiBNVERfV1JJVEVBQkxFX0NNRCkgewogCQkJCWxlbiA9IDI7CiAJCQkJaWYgKGxlbiA+IG1heGxlbikKIAkJCQkJZ290byBjbGVhbnVwOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9uYW5kLmMgYi9jb21tb24vY21kX25hbmQuYwppbmRleCBiMGMwMWQxLi5lNDZlZDFkIDEwMDY0NAotLS0gYS9jb21tb24vY21kX25hbmQuYworKysgYi9jb21tb24vY21kX25hbmQuYwpAQCAtOSw2ICs5LDM4NyBAQAogICovCiAKICNpbmNsdWRlIDxjb21tb24uaD4KKworCisjaWZuZGVmIENGR19OQU5EX0xFR0FDWQorLyoKKyAqCisgKiBOZXcgTkFORCBzdXBwb3J0CisgKgorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUworIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CisjIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQorI2Vsc2UKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCisjZW5kaWYKKworI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CisjaW5jbHVkZSA8bmFuZC5oPgorCitleHRlcm4gbmFuZF9pbmZvX3QgbmFuZF9pbmZvW107ICAgICAgIC8qIGluZm8gZm9yIE5BTkQgY2hpcHMgKi8KKworc3RhdGljIGludCBuYW5kX2R1bXBfb29iKG5hbmRfaW5mb190ICpuYW5kLCB1bG9uZyBvZmYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9kdW1wKG5hbmRfaW5mb190ICpuYW5kLCB1bG9uZyBvZmYpCit7CisJaW50IGk7CisJdV9jaGFyICpidWYsICpwOworCisJYnVmID0gbWFsbG9jKG5hbmQtPm9vYmJsb2NrICsgbmFuZC0+b29ic2l6ZSk7CisJaWYgKCFidWYpIHsKKwkJcHV0cygiTm8gbWVtb3J5IGZvciBwYWdlIGJ1ZmZlclxuIik7CisJCXJldHVybiAxOworCX0KKwlvZmYgJj0gfihuYW5kLT5vb2JibG9jayAtIDEpOworCWkgPSBuYW5kX3JlYWRfcmF3KG5hbmQsIGJ1Ziwgb2ZmLCBuYW5kLT5vb2JibG9jaywgbmFuZC0+b29ic2l6ZSk7CisJaWYgKGkgPCAwKSB7CisJCXByaW50ZigiRXJyb3IgKCVkKSByZWFkaW5nIHBhZ2UgJTA4eFxuIiwgaSwgb2ZmKTsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCJQYWdlICUwOHggZHVtcDpcbiIsIG9mZik7CisJaSA9IG5hbmQtPm9vYmJsb2NrID4+IDQ7IHAgPSBidWY7CisJd2hpbGUgKGktLSkgeworCQlwcmludGYoICJcdCUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIKKwkJCSIgICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIHBbNl0sIHBbN10sCisJCQlwWzhdLCBwWzldLCBwWzEwXSwgcFsxMV0sIHBbMTJdLCBwWzEzXSwgcFsxNF0sIHBbMTVdKTsKKwkJcCArPSAxNjsKKwl9CisJcHV0cygiT09COlxuIik7CisJaSA9IG5hbmQtPm9vYnNpemUgPj4gMzsKKwl3aGlsZSAoaS0tKSB7CisJCXByaW50ZiggIlx0JTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgcFs3XSk7CisJCXAgKz0gODsKKwl9CisJZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK2FyZ19vZmZfc2l6ZShpbnQgYXJnYywgY2hhciAqYXJndltdLCB1bG9uZyAqb2ZmLCB1bG9uZyAqc2l6ZSwgdWxvbmcgdG90c2l6ZSkKK3sKKwkqb2ZmID0gMDsKKwkqc2l6ZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBkZWZpbmVkKENGR19KRkZTX0NVU1RPTV9QQVJUKQorCWlmIChhcmdjID49IDEgJiYgc3RyY21wKGFyZ3ZbMF0sICJwYXJ0aXRpb24iKSA9PSAwKSB7CisJCWludCBwYXJ0X251bTsKKwkJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKKwkJY29uc3QgY2hhciAqcGFydHN0cjsKKworCQlpZiAoYXJnYyA+PSAyKQorCQkJcGFydHN0ciA9IGFyZ3ZbMV07CisJCWVsc2UKKwkJCXBhcnRzdHIgPSBnZXRlbnYoInBhcnRpdGlvbiIpOworCisJCWlmIChwYXJ0c3RyKQorCQkJcGFydF9udW0gPSAoaW50KXNpbXBsZV9zdHJ0b3VsKHBhcnRzdHIsIE5VTEwsIDEwKTsKKwkJZWxzZQorCQkJcGFydF9udW0gPSAwOworCisJCXBhcnQgPSBqZmZzMl9wYXJ0X2luZm8ocGFydF9udW0pOworCQlpZiAocGFydCA9PSBOVUxMKSB7CisJCQlwcmludGYoIlxuSW52YWxpZCBwYXJ0aXRpb24gJWRcbiIsIHBhcnRfbnVtKTsKKwkJCXJldHVybjsKKwkJfQorCQkqc2l6ZSA9IHBhcnQtPnNpemU7CisJCSpvZmYgPSAodWxvbmcpcGFydC0+b2Zmc2V0OworCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoYXJnYyA+PSAxKQorCQkJKm9mZiA9ICh1bG9uZylzaW1wbGVfc3RydG91bChhcmd2WzBdLCBOVUxMLCAxNik7CisJCWVsc2UKKwkJCSpvZmYgPSAwOworCisJCWlmIChhcmdjID49IDIpCisJCQkqc2l6ZSA9ICh1bG9uZylzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJCWVsc2UKKwkJCSpzaXplID0gdG90c2l6ZSAtICpvZmY7CisKKwl9CisKK30KKworaW50IGRvX25hbmQoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpLCBkZXYsIHJldDsKKwl1bG9uZyBhZGRyLCBvZmYsIHNpemU7CisJY2hhciAqY21kLCAqczsKKwluYW5kX2luZm9fdCAqbmFuZDsKKworCS8qIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgcGxlYXNlICovCisJaWYgKGFyZ2MgPCAyKQorCQlnb3RvIHVzYWdlOworCisJY21kID0gYXJndlsxXTsKKworCWlmIChzdHJjbXAoY21kLCAiaW5mbyIpID09IDApIHsKKworCQlwdXRjKCdcbicpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHX01BWF9OQU5EX0RFVklDRTsgaSsrKSB7CisJCQlpZiAobmFuZF9pbmZvW2ldLm5hbWUpCisJCQkJcHJpbnRmKCJEZXZpY2UgJWQ6ICVzLCBzZWN0b3Igc2l6ZSAlbHUgS2lCXG4iLAorCQkJCQlpLCBuYW5kX2luZm9baV0ubmFtZSwKKwkJCQkJbmFuZF9pbmZvW2ldLmVyYXNlc2l6ZSA+PiAxMCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcChjbWQsICJkZXZpY2UiKSA9PSAwKSB7CisKKwkJaWYgKGFyZ2MgPCAzKSB7CisJCQlpZiAoKG5hbmRfY3Vycl9kZXZpY2UgPCAwKSB8fAorCQkJICAgIChuYW5kX2N1cnJfZGV2aWNlID49IENGR19NQVhfTkFORF9ERVZJQ0UpKQorCQkJCXB1dHMoIlxubm8gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCQkJZWxzZQorCQkJCXByaW50ZigiXG5EZXZpY2UgJWQ6ICVzXG4iLCBuYW5kX2N1cnJfZGV2aWNlLAorCQkJCQluYW5kX2luZm9bbmFuZF9jdXJyX2RldmljZV0ubmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZXYgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKKwkJaWYgKGRldiA8IDAgfHwgZGV2ID49IENGR19NQVhfTkFORF9ERVZJQ0UgfHwgIW5hbmRfaW5mb1tkZXZdLm5hbWUpIHsKKwkJCXB1dHMoIk5vIHN1Y2ggZGV2aWNlXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXByaW50ZigiRGV2aWNlICVkOiAlcyIsIGRldiwgbmFuZF9pbmZvW2Rldl0ubmFtZSk7CisJCXB1dHMoIi4uLiBpcyBub3cgY3VycmVudCBkZXZpY2VcbiIpOworCQluYW5kX2N1cnJfZGV2aWNlID0gZGV2OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGNtZCwgImJhZCIpICE9IDAgJiYgc3RyY21wKGNtZCwgImVyYXNlIikgIT0gMCAmJgorCSAgICBzdHJuY21wKGNtZCwgImR1bXAiLCA0KSAhPSAwICYmCisJICAgIHN0cm5jbXAoY21kLCAicmVhZCIsIDQpICE9IDAgJiYgc3RybmNtcChjbWQsICJ3cml0ZSIsIDUpICE9IDApCisJCWdvdG8gdXNhZ2U7CisKKwkvKiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIG9wZXJhdGUgb24gdGhlIGN1cnJlbnQgZGV2aWNlICovCisJaWYgKG5hbmRfY3Vycl9kZXZpY2UgPCAwIHx8IG5hbmRfY3Vycl9kZXZpY2UgPj0gQ0ZHX01BWF9OQU5EX0RFVklDRSB8fAorCSAgICAhbmFuZF9pbmZvW25hbmRfY3Vycl9kZXZpY2VdLm5hbWUpIHsKKwkJcHV0cygiXG5ubyBkZXZpY2VzIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAxOworCX0KKwluYW5kID0gJm5hbmRfaW5mb1tuYW5kX2N1cnJfZGV2aWNlXTsKKworCWlmIChzdHJjbXAoY21kLCAiYmFkIikgPT0gMCkgeworCQlwcmludGYoIlxuRGV2aWNlICVkIGJhZCBibG9ja3M6XG4iLCBuYW5kX2N1cnJfZGV2aWNlKTsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPCBuYW5kLT5zaXplOyBvZmYgKz0gbmFuZC0+ZXJhc2VzaXplKQorCQkJaWYgKG5hbmRfYmxvY2tfaXNiYWQobmFuZCwgb2ZmKSkKKwkJCQlwcmludGYoIiAgJTA4eFxuIiwgb2ZmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcChjbWQsICJlcmFzZSIpID09IDApIHsKKwkJYXJnX29mZl9zaXplKGFyZ2MgLSAyLCBhcmd2ICsgMiwgJm9mZiwgJnNpemUsIG5hbmQtPnNpemUpOworCQlpZiAob2ZmID09IDAgJiYgc2l6ZSA9PSAwKQorCQkJcmV0dXJuIDE7CisKKwkJcHJpbnRmKCJcbk5BTkQgZXJhc2U6IGRldmljZSAlZCBvZmZzZXQgMHgleCwgc2l6ZSAweCV4ICIsCisJCSAgICAgICBuYW5kX2N1cnJfZGV2aWNlLCBvZmYsIHNpemUpOworCQlyZXQgPSBuYW5kX2VyYXNlKG5hbmQsIG9mZiwgc2l6ZSk7CisJCXByaW50ZigiJXNcbiIsIHJldCA/ICJFUlJPUiIgOiAiT0siKTsKKworCQlyZXR1cm4gcmV0ID09IDAgPyAwIDogMTsKKwl9CisKKwlpZiAoc3RybmNtcChjbWQsICJkdW1wIiwgNCkgPT0gMCkgeworCQlpZiAoYXJnYyA8IDMpCisJCQlnb3RvIHVzYWdlOworCisJCXMgPSBzdHJjaHIoY21kLCAnLicpOworCQlvZmYgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCQlpZiAocyAhPSBOVUxMICYmIHN0cmNtcChzLCAiLm9vYiIpID09IDApCisJCQlyZXQgPSBuYW5kX2R1bXBfb29iKG5hbmQsIG9mZik7CisJCWVsc2UKKwkJCXJldCA9IG5hbmRfZHVtcChuYW5kLCBvZmYpOworCisJCXJldHVybiByZXQgPT0gMCA/IDEgOiAwOworCisJfQorCisJLyogcmVhZCB3cml0ZSAqLworCWlmIChzdHJuY21wKGNtZCwgInJlYWQiLCA0KSA9PSAwIHx8IHN0cm5jbXAoY21kLCAid3JpdGUiLCA1KSA9PSAwKSB7CisJCWlmIChhcmdjIDwgNCkKKwkJCWdvdG8gdXNhZ2U7CisvKgorCQlzID0gc3RyY2hyKGNtZCwgJy4nKTsKKwkJY2xlYW4gPSBDTEVBTl9OT05FOworCQlpZiAocyAhPSBOVUxMKSB7CisJCQlpZiAoc3RyY21wKHMsICIuamZmczIiKSA9PSAwIHx8IHN0cmNtcChzLCAiLmUiKSA9PSAwCisJCQkgICAgfHwgc3RyY21wKHMsICIuaSIpKQorCQkJCWNsZWFuID0gQ0xFQU5fSkZGUzI7CisJCX0KKyovCisJCWFkZHIgPSAodWxvbmcpc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJCWFyZ19vZmZfc2l6ZShhcmdjIC0gMywgYXJndiArIDMsICZvZmYsICZzaXplLCBuYW5kLT5zaXplKTsKKwkJaWYgKG9mZiA9PSAwICYmIHNpemUgPT0gMCkKKwkJCXJldHVybiAxOworCisJCWkgPSBzdHJuY21wKGNtZCwgInJlYWQiLCA0KSA9PSAwOwkvKiAxID0gcmVhZCwgMCA9IHdyaXRlICovCisJCXByaW50ZigiXG5OQU5EICVzOiBkZXZpY2UgJWQgb2Zmc2V0ICV1LCBzaXplICV1IC4uLiAiLAorCQkgICAgICAgaSA/ICJyZWFkIiA6ICJ3cml0ZSIsIG5hbmRfY3Vycl9kZXZpY2UsIG9mZiwgc2l6ZSk7CisKKwkJaWYgKGkpCisJCQlyZXQgPSBuYW5kX3JlYWQobmFuZCwgb2ZmLCAmc2l6ZSwgKHVfY2hhciAqKWFkZHIpOworCQllbHNlCisJCQlyZXQgPSBuYW5kX3dyaXRlKG5hbmQsIG9mZiwgJnNpemUsICh1X2NoYXIgKilhZGRyKTsKKworCQlwcmludGYoIiAlZCBieXRlcyAlczogJXNcbiIsIHNpemUsCisJCSAgICAgICBpID8gInJlYWQiIDogIndyaXR0ZW4iLCByZXQgPyAiRVJST1IiIDogIk9LIik7CisKKwkJcmV0dXJuIHJldCA9PSAwID8gMCA6IDE7CisJfQordXNhZ2U6CisJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorCitVX0JPT1RfQ01EKG5hbmQsIDUsIDEsIGRvX25hbmQsCisJIm5hbmQgICAgLSBOQU5EIHN1Yi1zeXN0ZW1cbiIsCisJImluZm8gICAgICAgICAgICAgICAgICAtIHNob3cgYXZhaWxhYmxlIE5BTkQgZGV2aWNlc1xuIgorCSJuYW5kIGRldmljZSBbZGV2XSAgICAgLSBzaG93IG9yIHNldCBjdXJyZW50IGRldmljZVxuIgorCSJuYW5kIHJlYWRbLmpmZnMyXSAgICAgLSBhZGRyIG9mZiBzaXplXG4iCisJIm5hbmQgd3JpdGVbLmpmZnMyXSAgICAtIGFkZHIgb2ZmIHNpemUgLSByZWFkL3dyaXRlIGBzaXplJyBieXRlcyBzdGFydGluZ1xuIgorCSIgICAgYXQgb2Zmc2V0IGBvZmYnIHRvL2Zyb20gbWVtb3J5IGFkZHJlc3MgYGFkZHInXG4iCisJIm5hbmQgZXJhc2UgW2NsZWFuXSBbb2ZmIHNpemVdIC0gZXJhc2UgYHNpemUnIGJ5dGVzIGZyb21cbiIKKwkiICAgIG9mZnNldCBgb2ZmJyAoZW50aXJlIGRldmljZSBpZiBub3Qgc3BlY2lmaWVkKVxuIgorCSJuYW5kIGJhZCAtIHNob3cgYmFkIGJsb2Nrc1xuIgorCSJuYW5kIGR1bXBbLm9vYl0gb2ZmIC0gZHVtcCBwYWdlXG4iCisJIm5hbmQgc2NydWIgLSByZWFsbHkgY2xlYW4gTkFORCBlcmFzaW5nIGJhZCBibG9ja3MgKFVOU0FGRSlcbiIKKwkibmFuZCBtYXJrYmFkIG9mZiAtIG1hcmsgYmFkIGJsb2NrIGF0IG9mZnNldCAoVU5TQUZFKVxuIgorCSJuYW5kIGJpdGVyciBvZmYgLSBtYWtlIGEgYml0IGVycm9yIGF0IG9mZnNldCAoVU5TQUZFKVxuIik7CisKK2ludCBkb19uYW5kYm9vdChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciAqYm9vdF9kZXZpY2UgPSBOVUxMOworCWNoYXIgKmVwOworCWludCBkZXY7CisJaW50IHI7CisJdWxvbmcgYWRkciwgY250LCBvZmZzZXQgPSAwOworCWltYWdlX2hlYWRlcl90ICpoZHI7CisJbmFuZF9pbmZvX3QgKm5hbmQ7CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDE6CisJCWFkZHIgPSBDRkdfTE9BRF9BRERSOworCQlib290X2RldmljZSA9IGdldGVudigiYm9vdGRldmljZSIpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJCWJvb3RfZGV2aWNlID0gZ2V0ZW52KCJib290ZGV2aWNlIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJYm9vdF9kZXZpY2UgPSBhcmd2WzJdOworCQlicmVhazsKKwljYXNlIDQ6CisJCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJCWJvb3RfZGV2aWNlID0gYXJndlsyXTsKKwkJb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghYm9vdF9kZXZpY2UpIHsKKwkJcHV0cygiXG4qKiBObyBib290IGRldmljZSAqKlxuIik7CisJCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXJldHVybiAxOworCX0KKworCWRldiA9IHNpbXBsZV9zdHJ0b3VsKGJvb3RfZGV2aWNlLCAmZXAsIDE2KTsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBDRkdfTUFYX05BTkRfREVWSUNFIHx8ICFuYW5kX2luZm9bZGV2XS5uYW1lKSB7CisJCXByaW50ZigiXG4qKiBEZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgZGV2KTsKKwkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbmFuZCA9ICZuYW5kX2luZm9bZGV2XTsKKwlwcmludGYoIlxuTG9hZGluZyBmcm9tIGRldmljZSAlZDogJXMgKG9mZnNldCAweCVseClcbiIsCisJICAgICAgIGRldiwgbmFuZC0+bmFtZSwgb2Zmc2V0KTsKKworCWNudCA9IG5hbmQtPm9vYmJsb2NrOworCXIgPSBuYW5kX3JlYWQobmFuZCwgb2Zmc2V0LCAmY250LCAodV9jaGFyICopIGFkZHIpOworCWlmIChyKSB7CisJCXByaW50ZigiKiogUmVhZCBlcnJvciBvbiAlZFxuIiwgZGV2KTsKKwkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaGRyID0gKGltYWdlX2hlYWRlcl90ICopIGFkZHI7CisKKwlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKKwkJcHJpbnRmKCJcbioqIEJhZCBNYWdpYyBOdW1iZXIgMHgleCAqKlxuIiwgaGRyLT5paF9tYWdpYyk7CisJCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXJldHVybiAxOworCX0KKworCXByaW50X2ltYWdlX2hkcihoZHIpOworCisJY250ID0gKG50b2hsKGhkci0+aWhfc2l6ZSkgKyBzaXplb2YgKGltYWdlX2hlYWRlcl90KSk7CisKKwlyID0gbmFuZF9yZWFkKG5hbmQsIG9mZnNldCwgJmNudCwgKHVfY2hhciAqKSBhZGRyKTsKKwlpZiAocikgeworCQlwcmludGYoIioqIFJlYWQgZXJyb3Igb24gJWRcbiIsIGRldik7CisJCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXJldHVybiAxOworCX0KKworCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisJbG9hZF9hZGRyID0gYWRkcjsKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCBhdHRlbXB0IGFuIGF1dG8tc3RhcnQgKi8KKwlpZiAoKChlcCA9IGdldGVudigiYXV0b3N0YXJ0IikpICE9IE5VTEwpICYmIChzdHJjbXAoZXAsICJ5ZXMiKSA9PSAwKSkgeworCQljaGFyICpsb2NhbF9hcmdzWzJdOworCQlleHRlcm4gaW50IGRvX2Jvb3RtKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCisJCWxvY2FsX2FyZ3NbMF0gPSBhcmd2WzBdOworCQlsb2NhbF9hcmdzWzFdID0gTlVMTDsKKworCQlwcmludGYoIkF1dG9tYXRpYyBib290IG9mIGltYWdlIGF0IGFkZHIgMHglMDhseCAuLi5cbiIsIGFkZHIpOworCisJCWRvX2Jvb3RtKGNtZHRwLCAwLCAxLCBsb2NhbF9hcmdzKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKG5ib290LCA0LCAxLCBkb19uYW5kYm9vdCwKKwkibmJvb3QgICAtIGJvb3QgZnJvbSBOQU5EIGRldmljZVxuIiwgImxvYWRBZGRyIGRldlxuIik7CisKKworI2VuZGlmCQkJCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisKKyNlbHNlIC8qIENGR19OQU5EX0xFR0FDWSAqLworLyoKKyAqCisgKiBMZWdhY3kgTkFORCBzdXBwb3J0IC0gdG8gYmUgcGhhc2VkIG91dAorICoKKyAqLwogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTIyLDEwICs0MDMsMTEgQEAKICNlbmRpZgogCiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLQotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CisjaWYgMAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2lkcy5oPgogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19PTUFQMTUxMAogdm9pZCBhcmNoZmxhc2h3cCh2b2lkICphcmNoZGF0YSwgaW50IHdwKTsKQEAgLTMzLDE1ICs0MTUsNiBAQAogCiAjZGVmaW5lIFJPVU5EX0RPV04odmFsdWUsYm91bmRhcnkpICAgICAgKCh2YWx1ZSkgJiAofigoYm91bmRhcnkpLTEpKSkKIAotLyoKLSAqIERlZmluaXRpb24gb2YgdGhlIG91dCBvZiBiYW5kIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBuYW5kX29vYl9jb25maWcgewotCWludCBlY2NfcG9zWzZdOwkJLyogcG9zaXRpb24gb2YgRUNDIGJ5dGVzIGluc2lkZSBvb2IgKi8KLQlpbnQgYmFkYmxvY2tfcG9zOwkvKiBwb3NpdGlvbiBvZiBiYWQgYmxvY2sgZmxhZyBpbnNpZGUgb29iIC0xID0gaW5hY3RpdmUgKi8KLQlpbnQgZWNjdmFsaWRfcG9zOwkvKiBwb3NpdGlvbiBvZiBFQ0MgdmFsaWQgZmxhZyBpbnNpZGUgb29iIC0xID0gaW5hY3RpdmUgKi8KLX0gb29iX2NvbmZpZyA9IHsgezB9LCAwLCAwfTsKLQogI3VuZGVmCU5BTkRfREVCVUcKICN1bmRlZglQU1lDSE9fREVCVUcKIApAQCAtNjMsNDEgKzQzNiwzMCBAQAogI2RlZmluZSBDT05GSUdfTVREX05BTkRfRUNDICAvKiBlbmFibGUgRUNDICovCiAjZGVmaW5lIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIKIAotLyogYml0cyBmb3IgbmFuZF9ydygpIGBjbWQnOyBvciB0b2dldGhlciBhcyBuZWVkZWQgKi8KKy8qIGJpdHMgZm9yIG5hbmRfbGVnYWN5X3J3KCkgYGNtZCc7IG9yIHRvZ2V0aGVyIGFzIG5lZWRlZCAqLwogI2RlZmluZSBOQU5EUldfUkVBRAkweDAxCiAjZGVmaW5lIE5BTkRSV19XUklURQkweDAwCiAjZGVmaW5lIE5BTkRSV19KRkZTMgkweDAyCiAjZGVmaW5lIE5BTkRSV19KRkZTMl9TS0lQCTB4MDQKIAorCisKIC8qCi0gKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKiBJbXBvcnRzIGZyb20gbmFuZF9sZWdhY3kuYwogICovCi1zdGF0aWMgdm9pZCBuYW5kX3ByaW50KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpOwotaW50IG5hbmRfcncgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsCi0JICAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKLQkgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpOwotaW50IG5hbmRfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKLXN0YXRpYyBpbnQgbmFuZF9yZWFkX2VjYyhzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW4sCi0JCSBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjY19jb2RlKTsKLXN0YXRpYyBpbnQgbmFuZF93cml0ZV9lY2MgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCB0bywgc2l6ZV90IGxlbiwKLQkJCSAgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBlY2NfY29kZSk7Ci1zdGF0aWMgdm9pZCBuYW5kX3ByaW50X2JhZChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKTsKLXN0YXRpYyBpbnQgbmFuZF9yZWFkX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAotCQkgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpOwotc3RhdGljIGludCBuYW5kX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAotCQkgc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKiBidWYpOwotc3RhdGljIGludCBOYW5EX1dhaXRSZWFkeShzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgYWxlX3dhaXQpOwotI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKLXN0YXRpYyBpbnQgbmFuZF9jb3JyZWN0X2RhdGEgKHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKTsKLXN0YXRpYyB2b2lkIG5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpOwotI2VuZGlmCitleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOworZXh0ZXJuIGludCBjdXJyX2RldmljZTsKK2V4dGVybiBpbnQgbmFuZF9sZWdhY3lfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgc2l6ZV90IG9mcywKKwkJCSAgICBzaXplX3QgbGVuLCBpbnQgY2xlYW4pOworZXh0ZXJuIGludCBuYW5kX2xlZ2FjeV9ydyhzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgY21kLCBzaXplX3Qgc3RhcnQsCisJCQkgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKK2V4dGVybiB2b2lkIG5hbmRfcHJpbnQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCk7CitleHRlcm4gdm9pZCBuYW5kX3ByaW50X2JhZChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKTsKK2V4dGVybiBpbnQgbmFuZF9yZWFkX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBzaXplX3Qgb2ZzLAorCQkJICAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CitleHRlcm4gaW50IG5hbmRfd3JpdGVfb29iKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHNpemVfdCBvZnMsCisJCQkJc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKIAotc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdID0ge3swfX07Ci0KLS8qIEN1cnJlbnQgTkFORCBEZXZpY2UJKi8KLXN0YXRpYyBpbnQgY3Vycl9kZXZpY2UgPSAtMTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBpbnQgZG9fbmFuZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0xNzQsNyArNTM2LDcgQEAKIAkJcHJpbnRmICgiXG5OQU5EIGVyYXNlOiBkZXZpY2UgJWQgb2Zmc2V0ICVsZCwgc2l6ZSAlbGQgLi4uICIsCiAJCQljdXJyX2RldmljZSwgb2ZmLCBzaXplKTsKIAotCQlyZXQgPSBuYW5kX2VyYXNlIChuYW5kLCBvZmYsIHNpemUsIDEpOworCQlyZXQgPSBuYW5kX2xlZ2FjeV9lcmFzZSAobmFuZCwgb2ZmLCBzaXplLCAxKTsKIAogCQlwcmludGYoIiVzXG4iLCByZXQgPyAiRVJST1IiIDogIk9LIik7CiAKQEAgLTI0MCw3ICs2MDIsNyBAQAogCQkJKGNtZCAmIE5BTkRSV19SRUFEKSA/ICJyZWFkIiA6ICJ3cml0ZSIsCiAJCQljdXJyX2RldmljZSwgb2ZmLCBzaXplKTsKIAotCQlyZXQgPSBuYW5kX3J3KG5hbmRfZGV2X2Rlc2MgKyBjdXJyX2RldmljZSwgY21kLCBvZmYsIHNpemUsCisJCXJldCA9IG5hbmRfbGVnYWN5X3J3KG5hbmRfZGV2X2Rlc2MgKyBjdXJyX2RldmljZSwgY21kLCBvZmYsIHNpemUsCiAJCQkgICAgIChzaXplX3QgKikmdG90YWwsICh1X2NoYXIqKWFkZHIpOwogCiAJCXByaW50ZiAoIiAlZCBieXRlcyAlczogJXNcbiIsIHRvdGFsLApAQCAtMjU4LDcgKzYyMCw4IEBACiAJCXByaW50ZiAoIlxuTkFORCBlcmFzZTogZGV2aWNlICVkIG9mZnNldCAlbGQsIHNpemUgJWxkIC4uLiAiLAogCQkJY3Vycl9kZXZpY2UsIG9mZiwgc2l6ZSk7CiAKLQkJcmV0ID0gbmFuZF9lcmFzZSAobmFuZF9kZXZfZGVzYyArIGN1cnJfZGV2aWNlLCBvZmYsIHNpemUsIGNsZWFuKTsKKwkJcmV0ID0gbmFuZF9sZWdhY3lfZXJhc2UgKG5hbmRfZGV2X2Rlc2MgKyBjdXJyX2RldmljZSwKKwkJCQkJb2ZmLCBzaXplLCBjbGVhbik7CiAKIAkJcHJpbnRmKCIlc1xuIiwgcmV0ID8gIkVSUk9SIiA6ICJPSyIpOwogCkBAIC0zNDAsOCArNzAzLDggQEAKIAkJZGV2LCBuYW5kX2Rldl9kZXNjW2Rldl0ubmFtZSwgbmFuZF9kZXZfZGVzY1tkZXZdLklPX0FERFIsCiAJCW9mZnNldCk7CiAKLQlpZiAobmFuZF9ydyAobmFuZF9kZXZfZGVzYyArIGRldiwgTkFORFJXX1JFQUQsIG9mZnNldCwKLQkJICAgIFNFQ1RPUlNJWkUsIE5VTEwsICh1X2NoYXIgKilhZGRyKSkgeworCWlmIChuYW5kX2xlZ2FjeV9ydyAobmFuZF9kZXZfZGVzYyArIGRldiwgTkFORFJXX1JFQUQsIG9mZnNldCwKKwkJCVNFQ1RPUlNJWkUsIE5VTEwsICh1X2NoYXIgKilhZGRyKSkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkXG4iLCBkZXYpOwogCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKIAkJcmV0dXJuIDE7CkBAIC0zNjEsOCArNzI0LDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKG5hbmRfcncgKG5hbmRfZGV2X2Rlc2MgKyBkZXYsIE5BTkRSV19SRUFELCBvZmZzZXQgKyBTRUNUT1JTSVpFLCBjbnQsCi0JCSAgICBOVUxMLCAodV9jaGFyICopKGFkZHIrU0VDVE9SU0laRSkpKSB7CisJaWYgKG5hbmRfbGVnYWN5X3J3IChuYW5kX2Rldl9kZXNjICsgZGV2LCBOQU5EUldfUkVBRCwKKwkJCW9mZnNldCArIFNFQ1RPUlNJWkUsIGNudCwgTlVMTCwKKwkJCSh1X2NoYXIgKikoYWRkcitTRUNUT1JTSVpFKSkpIHsKIAkJcHJpbnRmICgiKiogUmVhZCBlcnJvciBvbiAlZFxuIiwgZGV2KTsKIAkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CiAJCXJldHVybiAxOwpAQCAtMzk0LDE1MDUgKzc1OCw2IEBACiAJImxvYWRBZGRyIGRldlxuIgogKTsKIAotLyogcmV0dXJucyAwIGlmIGJsb2NrIGNvbnRhaW5pbmcgcG9zIGlzIE9LOgotICoJCXZhbGlkIGVyYXNlIGJsb2NrIGFuZAotICoJCW5vdCBtYXJrZWQgYmFkLCBvciBubyBiYWQgbWFyayBwb3NpdGlvbiBpcyBzcGVjaWZpZWQKLSAqIHJldHVybnMgMSBpZiBtYXJrZWQgYmFkIG9yIG90aGVyd2lzZSBpbnZhbGlkCi0gKi8KLWludCBjaGVja19ibG9jayAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgdW5zaWduZWQgbG9uZyBwb3MpCi17Ci0Jc2l6ZV90IHJldGxlbjsKLQl1aW50OF90IG9vYl9kYXRhOwotCXVpbnQxNl90IG9vYl9kYXRhMTZbNl07Ci0JaW50IHBhZ2UwID0gcG9zICYgKC1uYW5kLT5lcmFzZXNpemUpOwotCWludCBwYWdlMSA9IHBhZ2UwICsgbmFuZC0+b29iYmxvY2s7Ci0JaW50IGJhZHBvcyA9IG9vYl9jb25maWcuYmFkYmxvY2tfcG9zOwotCi0JaWYgKHBvcyA+PSBuYW5kLT50b3RsZW4pCi0JCXJldHVybiAxOwotCi0JaWYgKGJhZHBvcyA8IDApCi0JCXJldHVybiAwOwkvKiBubyB3YXkgdG8gY2hlY2ssIGFzc3VtZSBPSyAqLwotCi0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0JCWlmIChuYW5kX3JlYWRfb29iKG5hbmQsIChwYWdlMCArIDApLCAxMiwgJnJldGxlbiwgKHVpbnQ4X3QgKilvb2JfZGF0YTE2KQotCQkgICAgfHwgKG9vYl9kYXRhMTZbMl0gJiAweGZmMDApICE9IDB4ZmYwMCkKLQkJCXJldHVybiAxOwotCQlpZiAobmFuZF9yZWFkX29vYihuYW5kLCAocGFnZTEgKyAwKSwgMTIsICZyZXRsZW4sICh1aW50OF90ICopb29iX2RhdGExNikKLQkJICAgIHx8IChvb2JfZGF0YTE2WzJdICYgMHhmZjAwKSAhPSAweGZmMDApCi0JCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQkvKiBOb3RlIC0gYmFkIGJsb2NrIG1hcmtlciBjYW4gYmUgb24gZmlyc3Qgb3Igc2Vjb25kIHBhZ2UgKi8KLQkJaWYgKG5hbmRfcmVhZF9vb2IobmFuZCwgcGFnZTAgKyBiYWRwb3MsIDEsICZyZXRsZW4sICh1bnNpZ25lZCBjaGFyICopJm9vYl9kYXRhKQotCQkgICAgfHwgb29iX2RhdGEgIT0gMHhmZgotCQkgICAgfHwgbmFuZF9yZWFkX29vYiAobmFuZCwgcGFnZTEgKyBiYWRwb3MsIDEsICZyZXRsZW4sICh1bnNpZ25lZCBjaGFyICopJm9vYl9kYXRhKQotCQkgICAgfHwgb29iX2RhdGEgIT0gMHhmZikKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBwcmludCBiYWQgYmxvY2tzIGluIE5BTkQgZmxhc2ggKi8KLXN0YXRpYyB2b2lkIG5hbmRfcHJpbnRfYmFkKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBwb3M7Ci0KLQlmb3IgKHBvcyA9IDA7IHBvcyA8IG5hbmQtPnRvdGxlbjsgcG9zICs9IG5hbmQtPmVyYXNlc2l6ZSkgewotCQlpZiAoY2hlY2tfYmxvY2sobmFuZCwgcG9zKSkKLQkJCXByaW50ZigiIDB4JTguOGx4XG4iLCBwb3MpOwotCX0KLQlwdXRzKCJcbiIpOwotfQotCi0vKiBjbWQ6IDA6IE5BTkRSV19XUklURQkJCXdyaXRlLCBmYWlsIG9uIGJhZCBibG9jawotICoJMTogTkFORFJXX1JFQUQJCQlyZWFkLCBmYWlsIG9uIGJhZCBibG9jawotICoJMjogTkFORFJXX1dSSVRFIHwgTkFORFJXX0pGRlMyCXdyaXRlLCBza2lwIGJhZCBibG9ja3MKLSAqCTM6IE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyCXJlYWQsIGRhdGEgYWxsIDB4ZmYgZm9yIGJhZCBibG9ja3MKLSAqICAgICAgNzogTkFORFJXX1JFQUQgfCBOQU5EUldfSkZGUzIgfCBOQU5EUldfSkZGUzJfU0tJUCByZWFkLCBza2lwIGJhZCBibG9ja3MKLSAqLwotaW50IG5hbmRfcncgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsCi0JICAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKLQkgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCi17Ci0JaW50IHJldCA9IDAsIG4sIHRvdGFsID0gMDsKLQljaGFyIGVjY2J1Zls2XTsKLQkvKiBlYmxrIChvbmNlIHNldCkgaXMgdGhlIHN0YXJ0IG9mIHRoZSBlcmFzZSBibG9jayBjb250YWluaW5nIHRoZQotCSAqIGRhdGEgYmVpbmcgcHJvY2Vzc2VkLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgZWJsayA9IH4wOwkvKiBmb3JjZSBtaXNtYXRjaCBvbiBmaXJzdCBwYXNzICovCi0JdW5zaWduZWQgbG9uZyBlcmFzZXNpemUgPSBuYW5kLT5lcmFzZXNpemU7Ci0KLQl3aGlsZSAobGVuKSB7Ci0JCWlmICgoc3RhcnQgJiAoLWVyYXNlc2l6ZSkpICE9IGVibGspIHsKLQkJCS8qIGhhdmUgY3Jvc3NlZCBpbnRvIG5ldyBlcmFzZSBibG9jaywgZGVhbCB3aXRoCi0JCQkgKiBpdCBpZiBpdCBpcyBzdXJlIG1hcmtlZCBiYWQuCi0JCQkgKi8KLQkJCWVibGsgPSBzdGFydCAmICgtZXJhc2VzaXplKTsgLyogc3RhcnQgb2YgYmxvY2sgKi8KLQkJCWlmIChjaGVja19ibG9jayhuYW5kLCBlYmxrKSkgewotCQkJCWlmIChjbWQgPT0gKE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyKSkgewotCQkJCQl3aGlsZSAobGVuID4gMCAmJgotCQkJCQkgICAgICAgc3RhcnQgLSBlYmxrIDwgZXJhc2VzaXplKSB7Ci0JCQkJCQkqKGJ1ZisrKSA9IDB4ZmY7Ci0JCQkJCQkrK3N0YXJ0OwotCQkJCQkJKyt0b3RhbDsKLQkJCQkJCS0tbGVuOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoY21kID09IChOQU5EUldfUkVBRCB8IE5BTkRSV19KRkZTMiB8IE5BTkRSV19KRkZTMl9TS0lQKSkgewotCQkJCQlzdGFydCArPSBlcmFzZXNpemU7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoY21kID09IChOQU5EUldfV1JJVEUgfCBOQU5EUldfSkZGUzIpKSB7Ci0JCQkJCS8qIHNraXAgYmFkIGJsb2NrICovCi0JCQkJCXN0YXJ0ICs9IGVyYXNlc2l6ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0ID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIFRoZSBFQ0Mgd2lsbCBub3QgYmUgY2FsY3VsYXRlZCBjb3JyZWN0bHkgaWYKLQkJICAgbGVzcyB0aGFuIDUxMiBpcyB3cml0dGVuIG9yIHJlYWQgKi8KLQkJLyogSXMgcmVxdWVzdCBhdCBsZWFzdCA1MTIgYnl0ZXMgQU5EIGl0IHN0YXJ0cyBvbiBhIHByb3BlciBib3VuZHJ5ICovCi0JCWlmKChzdGFydCAhPSBST1VORF9ET1dOKHN0YXJ0LCAweDIwMCkpIHx8IChsZW4gPCAweDIwMCkpCi0JCQlwcmludGYoIldhcm5pbmcgYmxvY2sgd3JpdGVzIHNob3VsZCBiZSBhdCBsZWFzdCA1MTIgYnl0ZXMgYW5kIHN0YXJ0IG9uIGEgNTEyIGJ5dGUgYm91bmRyeVxuIik7Ci0KLQkJaWYgKGNtZCAmIE5BTkRSV19SRUFEKSB7Ci0JCQlyZXQgPSBuYW5kX3JlYWRfZWNjKG5hbmQsIHN0YXJ0LAotCQkJCQkgICBtaW4obGVuLCBlYmxrICsgZXJhc2VzaXplIC0gc3RhcnQpLAotCQkJCQkgICAoc2l6ZV90ICopJm4sICh1X2NoYXIqKWJ1ZiwgKHVfY2hhciAqKWVjY2J1Zik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBuYW5kX3dyaXRlX2VjYyhuYW5kLCBzdGFydCwKLQkJCQkJICAgIG1pbihsZW4sIGVibGsgKyBlcmFzZXNpemUgLSBzdGFydCksCi0JCQkJCSAgICAoc2l6ZV90ICopJm4sICh1X2NoYXIqKWJ1ZiwgKHVfY2hhciAqKWVjY2J1Zik7Ci0JCX0KLQotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0KLQkJc3RhcnQgICs9IG47Ci0JCWJ1ZiAgICs9IG47Ci0JCXRvdGFsICs9IG47Ci0JCWxlbiAgIC09IG47Ci0JfQotCWlmIChyZXRsZW4pCi0JCSpyZXRsZW4gPSB0b3RhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hbmRfcHJpbnQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKLXsKLQlpZiAobmFuZC0+bnVtY2hpcHMgPiAxKSB7Ci0JCXByaW50ZigiJXMgYXQgMHglbHgsXG4iCi0JCSAgICAgICAiXHQgICVkIGNoaXBzICVzLCBzaXplICVkIE1CLCBcbiIKLQkJICAgICAgICJcdCAgdG90YWwgc2l6ZSAlbGQgTUIsIHNlY3RvciBzaXplICVsZCBrQlxuIiwKLQkJICAgICAgIG5hbmQtPm5hbWUsIG5hbmQtPklPX0FERFIsIG5hbmQtPm51bWNoaXBzLAotCQkgICAgICAgbmFuZC0+Y2hpcHNfbmFtZSwgMSA8PCAobmFuZC0+Y2hpcHNoaWZ0IC0gMjApLAotCQkgICAgICAgbmFuZC0+dG90bGVuID4+IDIwLCBuYW5kLT5lcmFzZXNpemUgPj4gMTApOwotCX0KLQllbHNlIHsKLQkJcHJpbnRmKCIlcyBhdCAweCVseCAoIiwgbmFuZC0+Y2hpcHNfbmFtZSwgbmFuZC0+SU9fQUREUik7Ci0JCXByaW50X3NpemUobmFuZC0+dG90bGVuLCAiLCAiKTsKLQkJcHJpbnRfc2l6ZShuYW5kLT5lcmFzZXNpemUsICIgc2VjdG9yKVxuIik7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgTmFuRF9XYWl0UmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgaW50IGFsZV93YWl0KQotewotCS8qIFRoaXMgaXMgaW5saW5lLCB0byBvcHRpbWlzZSB0aGUgY29tbW9uIGNhc2UsIHdoZXJlIGl0J3MgcmVhZHkgaW5zdGFudGx5ICovCi0JaW50IHJldCA9IDA7Ci0KLSNpZmRlZiBOQU5EX05PX1JCCS8qIGluIGNvbmZpZyBmaWxlLCBzaG9ydGVyIGRlbGF5cyBjdXJyZW50bHkgd3JhcCBhY2Nlc3NlcyAqLwotCWlmKGFsZV93YWl0KQotCQlOQU5EX1dBSVRfUkVBRFkobmFuZCk7CS8qIGRvIHRoZSB3b3JzdCBjYXNlIDI1dXMgd2FpdCAqLwotCWVsc2UKLQkJdWRlbGF5KDEwKTsKLSNlbHNlCS8qIGhhcyBmdW5jdGlvbmFsIHIvYiBzaWduYWwgKi8KLQlOQU5EX1dBSVRfUkVBRFkobmFuZCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IE5hbkRfQ29tbWFuZChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBuYW5kcHRyID0gbmFuZC0+SU9fQUREUjsKLQotCS8qIEFzc2VydCB0aGUgQ0xFIChDb21tYW5kIExhdGNoIEVuYWJsZSkgbGluZSB0byB0aGUgZmxhc2ggY2hpcCAqLwotCU5BTkRfQ1RMX1NFVENMRShuYW5kcHRyKTsKLQotCS8qIFNlbmQgdGhlIGNvbW1hbmQgKi8KLQlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgbmFuZHB0cik7Ci0KLQkvKiBMb3dlciB0aGUgQ0xFIGxpbmUgKi8KLQlOQU5EX0NUTF9DTFJDTEUobmFuZHB0cik7Ci0KLSNpZmRlZiBOQU5EX05PX1JCCi0JaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7Ci0JCXVfY2hhciByZXRfdmFsOwotCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKLQkJZG8gewotCQkJcmV0X3ZhbCA9IFJFQURfTkFORChuYW5kcHRyKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KLQkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOwotCX0KLSNlbmRpZgotCXJldHVybiBOYW5EX1dhaXRSZWFkeShuYW5kLCAwKTsKLX0KLQotLyogTmFuRF9BZGRyZXNzOiBTZXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBmb3IgdGhlIGZsYXNoIGNoaXAgKi8KLQotc3RhdGljIGludCBOYW5EX0FkZHJlc3Moc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKLXsKLQl1bnNpZ25lZCBsb25nIG5hbmRwdHI7Ci0JaW50IGk7Ci0KLQluYW5kcHRyID0gbmFuZC0+SU9fQUREUjsKLQotCS8qIEFzc2VydCB0aGUgQUxFIChBZGRyZXNzIExhdGNoIEVuYWJsZSkgbGluZSB0byB0aGUgZmxhc2ggY2hpcCAqLwotCU5BTkRfQ1RMX1NFVEFMRShuYW5kcHRyKTsKLQotCS8qIFNlbmQgdGhlIGFkZHJlc3MgKi8KLQkvKiBEZXZpY2VzIHdpdGggMjU2LWJ5dGUgcGFnZSBhcmUgYWRkcmVzc2VkIGFzOgotCSAqIENvbHVtbiAoYml0cyAwLTcpLCBQYWdlIChiaXRzIDgtMTUsIDE2LTIzLCAyNC0zMSkKLQkgKiB0aGVyZSBpcyBubyBkZXZpY2Ugb24gdGhlIG1hcmtldCB3aXRoIHBhZ2UyNTYKLQkgKiBhbmQgbW9yZSB0aGFuIDI0IGJpdHMuCi0JICogRGV2aWNlcyB3aXRoIDUxMi1ieXRlIHBhZ2UgYXJlIGFkZHJlc3NlZCBhczoKLQkgKiBDb2x1bW4gKGJpdHMgMC03KSwgUGFnZSAoYml0cyA5LTE2LCAxNy0yNCwgMjUtMzEpCi0JICogMjUtMzEgaXMgc2VudCBvbmx5IGlmIHRoZSBjaGlwIHN1cHBvcnQgaXQuCi0JICogYml0IDggY2hhbmdlcyB0aGUgcmVhZCBjb21tYW5kIHRvIGJlIHNlbnQKLQkgKiAoTkFORF9DTURfUkVBRDAgb3IgTkFORF9DTURfUkVBRDEpLgotCSAqLwotCi0JaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCi0JCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIG5hbmRwdHIpOwotCi0Jb2ZzID0gb2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQ7Ci0KLQlpZiAobnVtYnl0ZXMgPT0gQUREUl9QQUdFIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5hbmQtPnBhZ2VhZHJsZW47IGkrKywgb2ZzID0gb2ZzID4+IDgpIHsKLQkJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIG5hbmRwdHIpOwotCQl9Ci0JfQotCi0JLyogTG93ZXIgdGhlIEFMRSBsaW5lICovCi0JTkFORF9DVExfQ0xSQUxFKG5hbmRwdHIpOwotCi0JLyogV2FpdCBmb3IgdGhlIGNoaXAgdG8gcmVzcG9uZCAqLwotCXJldHVybiBOYW5EX1dhaXRSZWFkeShuYW5kLCAxKTsKLX0KLQotLyogTmFuRF9TZWxlY3RDaGlwOiBTZWxlY3QgYSBnaXZlbiBmbGFzaCBjaGlwIHdpdGhpbiB0aGUgY3VycmVudCBmbG9vciAqLwotCi1zdGF0aWMgaW5saW5lIGludCBOYW5EX1NlbGVjdENoaXAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgaW50IGNoaXApCi17Ci0JLyogV2FpdCBmb3IgaXQgdG8gYmUgcmVhZHkgKi8KLQlyZXR1cm4gTmFuRF9XYWl0UmVhZHkobmFuZCwgMCk7Ci19Ci0KLS8qIE5hbkRfSWRlbnRDaGlwOiBJZGVudGlmeSBhIGdpdmVuIE5BTkQgY2hpcCBnaXZlbiB7Zmxvb3IsY2hpcH0gKi8KLQotc3RhdGljIGludCBOYW5EX0lkZW50Q2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgZmxvb3IsIGludCBjaGlwKQotewotCWludCBtZnIsIGlkLCBpOwotCi0JTkFORF9FTkFCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGxvdyAqLwotCS8qIFJlc2V0IHRoZSBjaGlwICovCi0JaWYgKE5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9SRVNFVCkpIHsKLSNpZmRlZiBOQU5EX0RFQlVHCi0JCXByaW50ZigiTmFuRF9Db21tYW5kIChyZXNldCkgZm9yICVkLCVkIHJldHVybmVkIHRydWVcbiIsCi0JCSAgICAgICBmbG9vciwgY2hpcCk7Ci0jZW5kaWYKLQkJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCi0JCXJldHVybiAwOwotCX0KLQotCS8qIFJlYWQgdGhlIE5BTkQgY2hpcCBJRDogMS4gU2VuZCBSZWFkSUQgY29tbWFuZCAqLwotCWlmIChOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRElEKSkgewotI2lmZGVmIE5BTkRfREVCVUcKLQkJcHJpbnRmKCJOYW5EX0NvbW1hbmQgKFJlYWRJRCkgZm9yICVkLCVkIHJldHVybmVkIHRydWVcbiIsCi0JCSAgICAgICBmbG9vciwgY2hpcCk7Ci0jZW5kaWYKLQkJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCi0JCXJldHVybiAwOwotCX0KLQotCS8qIFJlYWQgdGhlIE5BTkQgY2hpcCBJRDogMi4gU2VuZCBhZGRyZXNzIGJ5dGUgemVybyAqLwotCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTiwgMCk7Ci0KLQkvKiBSZWFkIHRoZSBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBpZCBjb2RlcyBmcm9tIHRoZSBkZXZpY2UgKi8KLQotCW1mciA9IFJFQURfTkFORChuYW5kLT5JT19BRERSKTsKLQotCWlkID0gUkVBRF9OQU5EKG5hbmQtPklPX0FERFIpOwotCi0JTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCi0KLSNpZmRlZiBOQU5EX0RFQlVHCi0JcHJpbnRmKCJOYW5EX0NvbW1hbmQgKFJlYWRJRCkgZ290ICV4ICV4XG4iLCBtZnIsIGlkKTsKLSNlbmRpZgotCWlmIChtZnIgPT0gMHhmZiB8fCBtZnIgPT0gMCkgewotCQkvKiBObyByZXNwb25zZSAtIHJldHVybiBmYWlsdXJlICovCi0JCXJldHVybiAwOwotCX0KLQotCS8qIENoZWNrIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGNoaXAgd2UgaWRlbnRpZmllZC4KLQkgKiBNLVN5c3RlbXMgc2F5IHRoYXQgYW55IGdpdmVuIG5hbmRfY2hpcCBkZXZpY2Ugc2hvdWxkIG9ubHkKLQkgKiBjb250YWluIF9vbmVfIHR5cGUgb2YgZmxhc2ggcGFydCwgYWx0aG91Z2ggdGhhdCdzIG5vdCBhCi0JICogaGFyZHdhcmUgcmVzdHJpY3Rpb24uICovCi0JaWYgKG5hbmQtPm1mcikgewotCQlpZiAobmFuZC0+bWZyID09IG1mciAmJiBuYW5kLT5pZCA9PSBpZCkgewotCQkJcmV0dXJuIDE7CS8qIFRoaXMgaXMgYW5vdGhlciB0aGUgc2FtZSB0aGUgZmlyc3QgKi8KLQkJfSBlbHNlIHsKLQkJCXByaW50ZigiRmxhc2ggY2hpcCBhdCBmbG9vciAlZCwgY2hpcCAlZCBpcyBkaWZmZXJlbnQ6XG4iLAotCQkJICAgICAgIGZsb29yLCBjaGlwKTsKLQkJfQotCX0KLQotCS8qIFByaW50IGFuZCBzdG9yZSB0aGUgbWFudWZhY3R1cmVyIGFuZCBJRCBjb2Rlcy4gKi8KLQlmb3IgKGkgPSAwOyBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQlpZiAobWZyID09IG5hbmRfZmxhc2hfaWRzW2ldLm1hbnVmYWN0dXJlX2lkICYmCi0JCSAgICBpZCA9PSBuYW5kX2ZsYXNoX2lkc1tpXS5tb2RlbF9pZCkgewotI2lmZGVmIE5BTkRfREVCVUcKLQkJCXByaW50ZigiRmxhc2ggY2hpcCBmb3VuZDpcblx0IE1hbnVmYWN0dXJlciBJRDogMHglMi4yWCwgIgotCQkJICAgICAgICJDaGlwIElEOiAweCUyLjJYICglcylcbiIsIG1mciwgaWQsCi0JCQkgICAgICAgbmFuZF9mbGFzaF9pZHNbaV0ubmFtZSk7Ci0jZW5kaWYKLQkJCWlmICghbmFuZC0+bWZyKSB7Ci0JCQkJbmFuZC0+bWZyID0gbWZyOwotCQkJCW5hbmQtPmlkID0gaWQ7Ci0JCQkJbmFuZC0+Y2hpcHNoaWZ0ID0KLQkJCQkgICAgbmFuZF9mbGFzaF9pZHNbaV0uY2hpcHNoaWZ0OwotCQkJCW5hbmQtPnBhZ2UyNTYgPSBuYW5kX2ZsYXNoX2lkc1tpXS5wYWdlMjU2OwotCQkJCW5hbmQtPmVjY3NpemUgPSAyNTY7Ci0JCQkJaWYgKG5hbmQtPnBhZ2UyNTYpIHsKLQkJCQkJbmFuZC0+b29iYmxvY2sgPSAyNTY7Ci0JCQkJCW5hbmQtPm9vYnNpemUgPSA4OwotCQkJCQluYW5kLT5wYWdlX3NoaWZ0ID0gODsKLQkJCQl9IGVsc2UgewotCQkJCQluYW5kLT5vb2JibG9jayA9IDUxMjsKLQkJCQkJbmFuZC0+b29ic2l6ZSA9IDE2OwotCQkJCQluYW5kLT5wYWdlX3NoaWZ0ID0gOTsKLQkJCQl9Ci0JCQkJbmFuZC0+cGFnZWFkcmxlbiA9IG5hbmRfZmxhc2hfaWRzW2ldLnBhZ2VhZHJsZW47Ci0JCQkJbmFuZC0+ZXJhc2VzaXplICA9IG5hbmRfZmxhc2hfaWRzW2ldLmVyYXNlc2l6ZTsKLQkJCQluYW5kLT5jaGlwc19uYW1lID0gbmFuZF9mbGFzaF9pZHNbaV0ubmFtZTsKLQkJCQluYW5kLT5idXMxNgkgPSBuYW5kX2ZsYXNoX2lkc1tpXS5idXMxNjsKLSAJCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCi0jaWZkZWYgTkFORF9ERUJVRwotCS8qIFdlIGhhdmVuJ3QgZnVsbHkgaWRlbnRpZmllZCB0aGUgY2hpcC4gUHJpbnQgYXMgbXVjaCBhcyB3ZSBrbm93LiAqLwotCXByaW50ZigiVW5rbm93biBmbGFzaCBjaGlwIGZvdW5kOiAlMi4yWCAlMi4yWFxuIiwKLQkgICAgICAgaWQsIG1mcik7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0vKiBOYW5EX1NjYW5DaGlwczogRmluZCBhbGwgTkFORCBjaGlwcyBwcmVzZW50IGluIGEgbmFuZF9jaGlwLCBhbmQgaWRlbnRpZnkgdGhlbSAqLwotCi1zdGF0aWMgdm9pZCBOYW5EX1NjYW5DaGlwcyhzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQotewotCWludCBmbG9vciwgY2hpcDsKLQlpbnQgbnVtY2hpcHNbTkFORF9NQVhfRkxPT1JTXTsKLQlpbnQgbWF4Y2hpcHMgPSBOQU5EX01BWF9DSElQUzsKLQlpbnQgcmV0ID0gMTsKLQotCW5hbmQtPm51bWNoaXBzID0gMDsKLQluYW5kLT5tZnIgPSAwOwotCW5hbmQtPmlkID0gMDsKLQotCi0JLyogRm9yIGVhY2ggZmxvb3IsIGZpbmQgdGhlIG51bWJlciBvZiB2YWxpZCBjaGlwcyBpdCBjb250YWlucyAqLwotCWZvciAoZmxvb3IgPSAwOyBmbG9vciA8IE5BTkRfTUFYX0ZMT09SUzsgZmxvb3IrKykgewotCQlyZXQgPSAxOwotCQludW1jaGlwc1tmbG9vcl0gPSAwOwotCQlmb3IgKGNoaXAgPSAwOyBjaGlwIDwgbWF4Y2hpcHMgJiYgcmV0ICE9IDA7IGNoaXArKykgewotCi0JCQlyZXQgPSBOYW5EX0lkZW50Q2hpcChuYW5kLCBmbG9vciwgY2hpcCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJbnVtY2hpcHNbZmxvb3JdKys7Ci0JCQkJbmFuZC0+bnVtY2hpcHMrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qIElmIHRoZXJlIGFyZSBub25lIGF0IGFsbCB0aGF0IHdlIHJlY29nbmlzZSwgYmFpbCAqLwotCWlmICghbmFuZC0+bnVtY2hpcHMpIHsKLSNpZmRlZiBOQU5EX0RFQlVHCi0JCXB1dHMgKCJObyBOQU5EIGZsYXNoIGNoaXBzIHJlY29nbmlzZWQuXG4iKTsKLSNlbmRpZgotCQlyZXR1cm47Ci0JfQotCi0JLyogQWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggY2hpcCAqLwotCW5hbmQtPmNoaXBzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgTmFuZCkgKiBuYW5kLT5udW1jaGlwcyk7Ci0JaWYgKCFuYW5kLT5jaGlwcykgewotCQlwdXRzICgiTm8gbWVtb3J5IGZvciBhbGxvY2F0aW5nIGNoaXAgaW5mbyBzdHJ1Y3R1cmVzXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IDA7Ci0KLQkvKiBGaWxsIG91dCB0aGUgY2hpcCBhcnJheSB3aXRoIHtmbG9vciwgY2hpcG5vfSBmb3IgZWFjaAotCSAqIGRldGVjdGVkIGNoaXAgaW4gdGhlIGRldmljZS4gKi8KLQlmb3IgKGZsb29yID0gMDsgZmxvb3IgPCBOQU5EX01BWF9GTE9PUlM7IGZsb29yKyspIHsKLQkJZm9yIChjaGlwID0gMDsgY2hpcCA8IG51bWNoaXBzW2Zsb29yXTsgY2hpcCsrKSB7Ci0JCQluYW5kLT5jaGlwc1tyZXRdLmZsb29yID0gZmxvb3I7Ci0JCQluYW5kLT5jaGlwc1tyZXRdLmNoaXAgPSBjaGlwOwotCQkJbmFuZC0+Y2hpcHNbcmV0XS5jdXJhZHIgPSAwOwotCQkJbmFuZC0+Y2hpcHNbcmV0XS5jdXJtb2RlID0gMHg1MDsKLQkJCXJldCsrOwotCQl9Ci0JfQotCi0JLyogQ2FsY3VsYXRlIGFuZCBwcmludCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZGV2aWNlICovCi0JbmFuZC0+dG90bGVuID0gbmFuZC0+bnVtY2hpcHMgKiAoMSA8PCBuYW5kLT5jaGlwc2hpZnQpOwotCi0jaWZkZWYgTkFORF9ERUJVRwotCXByaW50ZigiJWQgZmxhc2ggY2hpcHMgZm91bmQuIFRvdGFsIG5hbmRfY2hpcCBzaXplOiAlbGQgTUJcbiIsCi0JICAgICAgIG5hbmQtPm51bWNoaXBzLCBuYW5kLT50b3RsZW4gPj4gMjApOwotI2VuZGlmCi19Ci0KLS8qIHdlIG5lZWQgdG8gYmUgZmFzdCBoZXJlLCAxIHVzIHBlciByZWFkIHRyYW5zbGF0ZXMgdG8gMSBzZWNvbmQgcGVyIG1lZyAqLwotc3RhdGljIHZvaWQgTmFuRF9SZWFkQnVmIChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCB1X2NoYXIgKiBkYXRhX2J1ZiwgaW50IGNudHIpCi17Ci0JdW5zaWduZWQgbG9uZyBuYW5kcHRyID0gbmFuZC0+SU9fQUREUjsKLQotCU5hbkRfQ29tbWFuZCAobmFuZCwgTkFORF9DTURfUkVBRDApOwotCi0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0JCXUxNiB2YWw7Ci0KLQkJd2hpbGUgKGNudHIgPj0gMTYpIHsKLQkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OwotCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKLQkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKLQkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7Ci0JCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKLQkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OwotCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKLQkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKLQkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7Ci0JCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKLQkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7Ci0JCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OwotCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKLQkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKLQkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7Ci0JCQljbnRyIC09IDE2OwotCQl9Ci0KLQkJd2hpbGUgKGNudHIgPiAwKSB7Ci0JCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOwotCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKLQkJCWNudHIgLT0gMjsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlIChjbnRyID49IDE2KSB7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQljbnRyIC09IDE2OwotCQl9Ci0KLQkJd2hpbGUgKGNudHIgPiAwKSB7Ci0JCQkqZGF0YV9idWYrKyA9IFJFQURfTkFORCAobmFuZHB0cik7Ci0JCQljbnRyLS07Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBOQU5EIHJlYWQgd2l0aCBFQ0MKLSAqLwotc3RhdGljIGludCBuYW5kX3JlYWRfZWNjKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKLQkJIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjX2NvZGUpCi17Ci0JaW50IGNvbCwgcGFnZTsKLQlpbnQgZWNjX3N0YXR1cyA9IDA7Ci0jaWZkZWYgQ09ORklHX01URF9OQU5EX0VDQwotCWludCBqOwotCWludCBlY2NfZmFpbGVkID0gMDsKLQl1X2NoYXIgKmRhdGFfcG9pOwotCXVfY2hhciBlY2NfY2FsY1s2XTsKLSNlbmRpZgotCi0JLyogRG8gbm90IGFsbG93IHJlYWRzIHBhc3QgZW5kIG9mIGRldmljZSAqLwotCWlmICgoc3RhcnQgKyBsZW4pID4gbmFuZC0+dG90bGVuKSB7Ci0JCXByaW50ZiAoIiVzOiBBdHRlbXB0IHJlYWQgYmV5b25kIGVuZCBvZiBkZXZpY2UgJXggJXggJXhcbiIsCi0JCQlfX0ZVTkNUSU9OX18sICh1aW50KSBzdGFydCwgKHVpbnQpIGxlbiwgKHVpbnQpIG5hbmQtPnRvdGxlbik7Ci0JCSpyZXRsZW4gPSAwOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRmlyc3Qgd2UgY2FsY3VsYXRlIHRoZSBzdGFydGluZyBwYWdlICovCi0JLypwYWdlID0gc2hyKHN0YXJ0LCBuYW5kLT5wYWdlX3NoaWZ0KTsqLwotCXBhZ2UgPSBzdGFydCA+PiBuYW5kLT5wYWdlX3NoaWZ0OwotCi0JLyogR2V0IHJhdyBzdGFydGluZyBjb2x1bW4gKi8KLQljb2wgPSBzdGFydCAmIChuYW5kLT5vb2JibG9jayAtIDEpOwotCi0JLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgKi8KLQkqcmV0bGVuID0gMDsKLQotCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KLQlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93ICovCi0KLQkvKiBMb29wIHVudGlsIGFsbCBkYXRhIHJlYWQgKi8KLQl3aGlsZSAoKnJldGxlbiA8IGxlbikgewotCi0jaWZkZWYgQ09ORklHX01URF9OQU5EX0VDQwotCQkvKiBEbyB3ZSBoYXZlIHRoaXMgcGFnZSBpbiBjYWNoZSA/ICovCi0JCWlmIChuYW5kLT5jYWNoZV9wYWdlID09IHBhZ2UpCi0JCQlnb3RvIHJlYWRkYXRhOwotCQkvKiBTZW5kIHRoZSByZWFkIGNvbW1hbmQgKi8KLQkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1JFQUQwKTsKLQkJaWYgKG5hbmQtPmJ1czE2KSB7Ci0gCQkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCi0JCQkJICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIChjb2wgPj4gMSkpOwotCQl9IGVsc2UgewotIAkJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJCSAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyBjb2wpOwotCQl9Ci0KLQkJLyogUmVhZCBpbiBhIHBhZ2UgKyBvb2IgZGF0YSAqLwotCQlOYW5EX1JlYWRCdWYobmFuZCwgbmFuZC0+ZGF0YV9idWYsIG5hbmQtPm9vYmJsb2NrICsgbmFuZC0+b29ic2l6ZSk7Ci0KLQkJLyogY29weSBkYXRhIGludG8gY2FjaGUsIGZvciByZWFkIG91dCBvZiBjYWNoZSBhbmQgaWYgZWNjIGZhaWxzICovCi0JCWlmIChuYW5kLT5kYXRhX2NhY2hlKSB7Ci0JCQltZW1jcHkgKG5hbmQtPmRhdGFfY2FjaGUsIG5hbmQtPmRhdGFfYnVmLAotCQkJCW5hbmQtPm9vYmJsb2NrICsgbmFuZC0+b29ic2l6ZSk7Ci0JCX0KLQotCQkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLwotCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0JCQllY2NfY29kZVtqXSA9IG5hbmQtPmRhdGFfYnVmWyhuYW5kLT5vb2JibG9jayArIG9vYl9jb25maWcuZWNjX3Bvc1tqXSldOwotCQl9Ci0KLQkJLyogQ2FsY3VsYXRlIHRoZSBFQ0MgYW5kIHZlcmlmeSBpdCAqLwotCQkvKiBJZiBibG9jayB3YXMgbm90IHdyaXR0ZW4gd2l0aCBFQ0MsIHNraXAgRUNDICovCi0JCWlmIChvb2JfY29uZmlnLmVjY3ZhbGlkX3BvcyAhPSAtMSAmJgotCQkgICAgKG5hbmQtPmRhdGFfYnVmW25hbmQtPm9vYmJsb2NrICsgb29iX2NvbmZpZy5lY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgewotCi0JCQluYW5kX2NhbGN1bGF0ZV9lY2MgKCZuYW5kLT5kYXRhX2J1ZlswXSwgJmVjY19jYWxjWzBdKTsKLQkJCXN3aXRjaCAobmFuZF9jb3JyZWN0X2RhdGEgKCZuYW5kLT5kYXRhX2J1ZlswXSwgJmVjY19jb2RlWzBdLCAmZWNjX2NhbGNbMF0pKSB7Ci0JCQljYXNlIC0xOgotCQkJCXByaW50ZiAoIiVzOiBGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOwotCQkJCWVjY19mYWlsZWQrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCWNhc2UgMjoJLyogdHJhbnNmZXIgRUNDIGNvcnJlY3RlZCBkYXRhIHRvIGNhY2hlICovCi0JCQkJaWYgKG5hbmQtPmRhdGFfY2FjaGUpCi0JCQkJCW1lbWNweSAobmFuZC0+ZGF0YV9jYWNoZSwgbmFuZC0+ZGF0YV9idWYsIDI1Nik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob29iX2NvbmZpZy5lY2N2YWxpZF9wb3MgIT0gLTEgJiYKLQkJICAgIG5hbmQtPm9vYmJsb2NrID09IDUxMiAmJiAobmFuZC0+ZGF0YV9idWZbbmFuZC0+b29iYmxvY2sgKyBvb2JfY29uZmlnLmVjY3ZhbGlkX3Bvc10gJiAweGYwKSAhPSAweGYwKSB7Ci0KLQkJCW5hbmRfY2FsY3VsYXRlX2VjYyAoJm5hbmQtPmRhdGFfYnVmWzI1Nl0sICZlY2NfY2FsY1szXSk7Ci0JCQlzd2l0Y2ggKG5hbmRfY29ycmVjdF9kYXRhICgmbmFuZC0+ZGF0YV9idWZbMjU2XSwgJmVjY19jb2RlWzNdLCAmZWNjX2NhbGNbM10pKSB7Ci0JCQljYXNlIC0xOgotCQkJCXByaW50ZiAoIiVzOiBGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOwotCQkJCWVjY19mYWlsZWQrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCWNhc2UgMjoJLyogdHJhbnNmZXIgRUNDIGNvcnJlY3RlZCBkYXRhIHRvIGNhY2hlICovCi0JCQkJaWYgKG5hbmQtPmRhdGFfY2FjaGUpCi0JCQkJCW1lbWNweSAoJm5hbmQtPmRhdGFfY2FjaGVbMjU2XSwgJm5hbmQtPmRhdGFfYnVmWzI1Nl0sIDI1Nik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLXJlYWRkYXRhOgotCQkvKiBSZWFkIHRoZSBkYXRhIGZyb20gRUNDIGRhdGEgYnVmZmVyIGludG8gcmV0dXJuIGJ1ZmZlciAqLwotCQlkYXRhX3BvaSA9IChuYW5kLT5kYXRhX2NhY2hlKSA/IG5hbmQtPmRhdGFfY2FjaGUgOiBuYW5kLT5kYXRhX2J1ZjsKLQkJZGF0YV9wb2kgKz0gY29sOwotCQlpZiAoKCpyZXRsZW4gKyAobmFuZC0+b29iYmxvY2sgLSBjb2wpKSA+PSBsZW4pIHsKLQkJCW1lbWNweSAoYnVmICsgKnJldGxlbiwgZGF0YV9wb2ksIGxlbiAtICpyZXRsZW4pOwotCQkJKnJldGxlbiA9IGxlbjsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweSAoYnVmICsgKnJldGxlbiwgZGF0YV9wb2ksICBuYW5kLT5vb2JibG9jayAtIGNvbCk7Ci0JCQkqcmV0bGVuICs9IG5hbmQtPm9vYmJsb2NrIC0gY29sOwotCQl9Ci0JCS8qIFNldCBjYWNoZSBwYWdlIGFkZHJlc3MsIGludmFsaWRhdGUsIGlmIGVjY19mYWlsZWQgKi8KLQkJbmFuZC0+Y2FjaGVfcGFnZSA9IChuYW5kLT5kYXRhX2NhY2hlICYmICFlY2NfZmFpbGVkKSA/IHBhZ2UgOiAtMTsKLQotCQllY2Nfc3RhdHVzICs9IGVjY19mYWlsZWQ7Ci0JCWVjY19mYWlsZWQgPSAwOwotCi0jZWxzZQotCQkvKiBTZW5kIHRoZSByZWFkIGNvbW1hbmQgKi8KLQkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1JFQUQwKTsKLQkJaWYgKG5hbmQtPmJ1czE2KSB7Ci0JCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCQkgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgKGNvbCA+PiAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCQkgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgY29sKTsKLQkJfQotCi0JCS8qIFJlYWQgdGhlIGRhdGEgZGlyZWN0bHkgaW50byB0aGUgcmV0dXJuIGJ1ZmZlciAqLwotCQlpZiAoKCpyZXRsZW4gKyAobmFuZC0+b29iYmxvY2sgLSBjb2wpKSA+PSBsZW4pIHsKLQkJCU5hbkRfUmVhZEJ1ZihuYW5kLCBidWYgKyAqcmV0bGVuLCBsZW4gLSAqcmV0bGVuKTsKLQkJCSpyZXRsZW4gPSBsZW47Ci0JCQkvKiBXZSdyZSBkb25lICovCi0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCU5hbkRfUmVhZEJ1ZihuYW5kLCBidWYgKyAqcmV0bGVuLCBuYW5kLT5vb2JibG9jayAtIGNvbCk7Ci0JCQkqcmV0bGVuICs9IG5hbmQtPm9vYmJsb2NrIC0gY29sOwotCQkJfQotI2VuZGlmCi0JCS8qIEZvciBzdWJzZXF1ZW50IHJlYWRzIGFsaWduIHRvIHBhZ2UgYm91bmRhcnkuICovCi0JCWNvbCA9IDA7Ci0JCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgKi8KLQkJcGFnZSsrOwotCX0KLQotCS8qIERlLXNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KLQlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KLQotCS8qCi0JICogUmV0dXJuIHN1Y2Nlc3MsIGlmIG5vIEVDQyBmYWlsdXJlcywgZWxzZSAtRUlPCi0JICogZnMgZHJpdmVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoYXQsIGJlY2F1c2UKLQkgKiByZXRsZW4gPT0gZGVzaXJlZCBsZW4gYW5kIHJlc3VsdCA9PSAtRUlPCi0JICovCi0JcmV0dXJuIGVjY19zdGF0dXMgPyAtMSA6IDA7Ci19Ci0KLS8qCi0gKglOYW5kX3BhZ2VfcHJvZ3JhbSBmdW5jdGlvbiBpcyB1c2VkIGZvciB3cml0ZSBhbmQgd3JpdGV2ICEKLSAqLwotc3RhdGljIGludCBuYW5kX3dyaXRlX3BhZ2UgKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCi0JCQkgICAgaW50IHBhZ2UsIGludCBjb2wsIGludCBsYXN0LCB1X2NoYXIgKiBlY2NfY29kZSkKLXsKLQotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbmFuZHB0ciA9IG5hbmQtPklPX0FERFI7Ci0KLSNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDCi0jaWZkZWYgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURQotCWludCBlY2NfYnl0ZXMgPSAobmFuZC0+b29iYmxvY2sgPT0gNTEyKSA/IDYgOiAzOwotI2VuZGlmCi0jZW5kaWYKLQkvKiBwYWQgb29iIGFyZWEgKi8KLQlmb3IgKGkgPSBuYW5kLT5vb2JibG9jazsgaSA8IG5hbmQtPm9vYmJsb2NrICsgbmFuZC0+b29ic2l6ZTsgaSsrKQotCQluYW5kLT5kYXRhX2J1ZltpXSA9IDB4ZmY7Ci0KLSNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDCi0JLyogWmVybyBvdXQgdGhlIEVDQyBhcnJheSAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCWVjY19jb2RlW2ldID0gMHgwMDsKLQotCS8qIFJlYWQgYmFjayBwcmV2aW91cyB3cml0dGVuIGRhdGEsIGlmIGNvbCA+IDAgKi8KLQlpZiAoY29sKSB7Ci0JCU5hbkRfQ29tbWFuZCAobmFuZCwgTkFORF9DTURfUkVBRDApOwotCQlpZiAobmFuZC0+YnVzMTYpIHsKLQkJCU5hbkRfQWRkcmVzcyAobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIChjb2wgPj4gMSkpOwotCQl9IGVsc2UgewotCQkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJCSAgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgY29sKTsKLQkJfQotCi0JCWlmIChuYW5kLT5idXMxNikgewotCQkJdTE2IHZhbDsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNvbDsgaSArPSAyKSB7Ci0JCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKLQkJCQluYW5kLT5kYXRhX2J1ZltpXSA9IHZhbCAmIDB4ZmY7Ci0JCQkJbmFuZC0+ZGF0YV9idWZbaSArIDFdID0gdmFsID4+IDg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY29sOyBpKyspCi0JCQkJbmFuZC0+ZGF0YV9idWZbaV0gPSBSRUFEX05BTkQgKG5hbmRwdHIpOwotCQl9Ci0JfQotCi0JLyogQ2FsY3VsYXRlIGFuZCB3cml0ZSB0aGUgRUNDIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgKi8KLQlpZiAoKGNvbCA8IG5hbmQtPmVjY3NpemUpICYmIChsYXN0ID49IG5hbmQtPmVjY3NpemUpKSB7Ci0JCW5hbmRfY2FsY3VsYXRlX2VjYyAoJm5hbmQtPmRhdGFfYnVmWzBdLCAmKGVjY19jb2RlWzBdKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCW5hbmQtPmRhdGFfYnVmWyhuYW5kLT5vb2JibG9jayArCi0JCQkJCW9vYl9jb25maWcuZWNjX3Bvc1tpXSldID0gZWNjX2NvZGVbaV07Ci0JCX0KLQkJaWYgKG9vYl9jb25maWcuZWNjdmFsaWRfcG9zICE9IC0xKSB7Ci0JCQluYW5kLT5kYXRhX2J1ZltuYW5kLT5vb2JibG9jayArCi0JCQkJICAgICAgIG9vYl9jb25maWcuZWNjdmFsaWRfcG9zXSA9IDB4ZjA7Ci0JCX0KLQl9Ci0KLQkvKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBzZWNvbmQgRUNDIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgKi8KLQlpZiAoKG5hbmQtPm9vYmJsb2NrID09IDUxMikgJiYgKGxhc3QgPT0gbmFuZC0+b29iYmxvY2spKSB7Ci0JCW5hbmRfY2FsY3VsYXRlX2VjYyAoJm5hbmQtPmRhdGFfYnVmWzI1Nl0sICYoZWNjX2NvZGVbM10pKTsKLQkJZm9yIChpID0gMzsgaSA8IDY7IGkrKykgewotCQkJbmFuZC0+ZGF0YV9idWZbKG5hbmQtPm9vYmJsb2NrICsKLQkJCQkJb29iX2NvbmZpZy5lY2NfcG9zW2ldKV0gPSBlY2NfY29kZVtpXTsKLQkJfQotCQlpZiAob29iX2NvbmZpZy5lY2N2YWxpZF9wb3MgIT0gLTEpIHsKLQkJCW5hbmQtPmRhdGFfYnVmW25hbmQtPm9vYmJsb2NrICsKLQkJCQkgICAgICAgb29iX2NvbmZpZy5lY2N2YWxpZF9wb3NdICY9IDB4MGY7Ci0JCX0KLQl9Ci0jZW5kaWYKLQkvKiBQcmVwYWQgZm9yIHBhcnRpYWwgcGFnZSBwcm9ncmFtbWluZyAhISEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY29sOyBpKyspCi0JCW5hbmQtPmRhdGFfYnVmW2ldID0gMHhmZjsKLQotCS8qIFBvc3RwYWQgZm9yIHBhcnRpYWwgcGFnZSBwcm9ncmFtbWluZyAhISEgb29iIGlzIGFscmVhZHkgcGFkZGVkICovCi0JZm9yIChpID0gbGFzdDsgaSA8IG5hbmQtPm9vYmJsb2NrOyBpKyspCi0JCW5hbmQtPmRhdGFfYnVmW2ldID0gMHhmZjsKLQotCS8qIFNlbmQgY29tbWFuZCB0byBiZWdpbiBhdXRvIHBhZ2UgcHJvZ3JhbW1pbmcgKi8KLQlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1JFQUQwKTsKLQlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1NFUUlOKTsKLQlpZiAobmFuZC0+YnVzMTYpIHsKLQkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJICAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyAoY29sID4+IDEpKTsKLQl9IGVsc2UgewotCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCi0JCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIGNvbCk7Ci0JfQotCi0JLyogV3JpdGUgb3V0IGNvbXBsZXRlIHBhZ2Ugb2YgZGF0YSAqLwotCWlmIChuYW5kLT5idXMxNikgewotCQlmb3IgKGkgPSAwOyBpIDwgKG5hbmQtPm9vYmJsb2NrICsgbmFuZC0+b29ic2l6ZSk7IGkgKz0gMikgewotCQkJV1JJVEVfTkFORCAobmFuZC0+ZGF0YV9idWZbaV0gKwotCQkJCSAgICAobmFuZC0+ZGF0YV9idWZbaSArIDFdIDw8IDgpLAotCQkJCSAgICBuYW5kLT5JT19BRERSKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAobmFuZC0+b29iYmxvY2sgKyBuYW5kLT5vb2JzaXplKTsgaSsrKQotCQkJV1JJVEVfTkFORCAobmFuZC0+ZGF0YV9idWZbaV0sIG5hbmQtPklPX0FERFIpOwotCX0KLQotCS8qIFNlbmQgY29tbWFuZCB0byBhY3R1YWxseSBwcm9ncmFtIHRoZSBkYXRhICovCi0JTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9QQUdFUFJPRyk7Ci0JTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOwotI2lmZGVmIE5BTkRfTk9fUkIKLQl7Ci0JCXVfY2hhciByZXRfdmFsOwotCi0JCWRvIHsKLQkJCXJldF92YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOwkvKiB3YWl0IHRpbGwgcmVhZHkgKi8KLQkJfSB3aGlsZSAoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKLQl9Ci0jZW5kaWYKLQkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KLQlpZiAoUkVBRF9OQU5EIChuYW5kLT5JT19BRERSKSAmIDB4MDEpIHsKLQkJcHJpbnRmICgiJXM6IEZhaWxlZCB3cml0ZSwgcGFnZSAweCUwOHgsICIsIF9fRlVOQ1RJT05fXywKLQkJCXBhZ2UpOwotCQlyZXR1cm4gLTE7Ci0JfQotI2lmZGVmIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUKLQkvKgotCSAqIFRoZSBOQU5EIGRldmljZSBhc3N1bWVzIHRoYXQgaXQgaXMgYWx3YXlzIHdyaXRpbmcgdG8KLQkgKiBhIGNsZWFubHkgZXJhc2VkIHBhZ2UuIEhlbmNlLCBpdCBwZXJmb3JtcyBpdHMgaW50ZXJuYWwKLQkgKiB3cml0ZSB2ZXJpZmljYXRpb24gb25seSBvbiBiaXRzIHRoYXQgdHJhbnNpdGlvbmVkIGZyb20KLQkgKiAxIHRvIDAuIFRoZSBkZXZpY2UgZG9lcyBOT1QgdmVyaWZ5IHRoZSB3aG9sZSBwYWdlIG9uIGEKLQkgKiBieXRlIGJ5IGJ5dGUgYmFzaXMuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBhZ2Ugd2FzCi0JICogbm90IGNvbXBsZXRlbHkgZXJhc2VkIG9yIHRoZSBwYWdlIGlzIGJlY29taW5nIHVudXNhYmxlCi0JICogZHVlIHRvIHdlYXIuIFRoZSByZWFkIHdpdGggRUNDIHdvdWxkIGNhdGNoIHRoZSBlcnJvcgotCSAqIGxhdGVyIHdoZW4gdGhlIEVDQyBwYWdlIGNoZWNrIGZhaWxzLCBidXQgd2Ugd291bGQgcmF0aGVyCi0JICogY2F0Y2ggaXQgZWFybHkgaW4gdGhlIHBhZ2Ugd3JpdGUgc3RhZ2UuIEJldHRlciB0byB3cml0ZQotCSAqIG5vIGRhdGEgdGhhbiBpbnZhbGlkIGRhdGEuCi0JICovCi0KLQkvKiBTZW5kIGNvbW1hbmQgdG8gcmVhZCBiYWNrIHRoZSBwYWdlICovCi0JaWYgKGNvbCA8IG5hbmQtPmVjY3NpemUpCi0JCU5hbkRfQ29tbWFuZCAobmFuZCwgTkFORF9DTURfUkVBRDApOwotCWVsc2UKLQkJTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9SRUFEMSk7Ci0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0JCU5hbkRfQWRkcmVzcyAobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCSAgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgKGNvbCA+PiAxKSk7Ci0JfSBlbHNlIHsKLQkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJICAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyBjb2wpOwotCX0KLQotCS8qIExvb3AgdGhyb3VnaCBhbmQgdmVyaWZ5IHRoZSBkYXRhICovCi0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0JCWZvciAoaSA9IGNvbDsgaSA8IGxhc3Q7IGkgPSArMikgewotCQkJaWYgKChuYW5kLT5kYXRhX2J1ZltpXSArCi0JCQkgICAgIChuYW5kLT5kYXRhX2J1ZltpICsgMV0gPDwgOCkpICE9IFJFQURfTkFORCAobmFuZC0+SU9fQUREUikpIHsKLQkJCQlwcmludGYgKCIlczogRmFpbGVkIHdyaXRlIHZlcmlmeSwgcGFnZSAweCUwOHggIiwKLQkJCQkJX19GVU5DVElPTl9fLCBwYWdlKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSBjb2w7IGkgPCBsYXN0OyBpKyspIHsKLQkJCWlmIChuYW5kLT5kYXRhX2J1ZltpXSAhPSBSRUFEX05BTkQgKG5hbmQtPklPX0FERFIpKSB7Ci0JCQkJcHJpbnRmICgiJXM6IEZhaWxlZCB3cml0ZSB2ZXJpZnksIHBhZ2UgMHglMDh4ICIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcGFnZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHX01URF9OQU5EX0VDQwotCS8qCi0JICogV2UgYWxzbyB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIEVDQyBieXRlcyB3cm90ZQotCSAqIGNvcnJlY3RseSBmb3IgdGhlIHNhbWUgcmVhc29ucyBzdGF0ZWQgYWJvdmUuCi0JICovCi0JTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9SRUFET09CKTsKLQlpZiAobmFuZC0+YnVzMTYpIHsKLQkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJICAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyAoY29sID4+IDEpKTsKLQl9IGVsc2UgewotCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCi0JCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIGNvbCk7Ci0JfQotCWlmIChuYW5kLT5idXMxNikgewotCQlmb3IgKGkgPSAwOyBpIDwgbmFuZC0+b29ic2l6ZTsgaSArPSAyKSB7Ci0JCQl1MTYgdmFsOwotCi0JCQl2YWwgPSBSRUFEX05BTkQgKG5hbmQtPklPX0FERFIpOwotCQkJbmFuZC0+ZGF0YV9idWZbaV0gPSB2YWwgJiAweGZmOwotCQkJbmFuZC0+ZGF0YV9idWZbaSArIDFdID0gdmFsID4+IDg7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgbmFuZC0+b29ic2l6ZTsgaSsrKSB7Ci0JCQluYW5kLT5kYXRhX2J1ZltpXSA9IFJFQURfTkFORCAobmFuZC0+SU9fQUREUik7Ci0JCX0KLQl9Ci0JZm9yIChpID0gMDsgaSA8IGVjY19ieXRlczsgaSsrKSB7Ci0JCWlmICgobmFuZC0+ZGF0YV9idWZbKG9vYl9jb25maWcuZWNjX3Bvc1tpXSldICE9IGVjY19jb2RlW2ldKSAmJiBlY2NfY29kZVtpXSkgewotCQkJcHJpbnRmICgiJXM6IEZhaWxlZCBFQ0Mgd3JpdGUgIgotCQkJCSJ2ZXJpZnksIHBhZ2UgMHglMDh4LCAiCi0JCQkJIiU2aSBieXRlcyB3ZXJlIHN1Y2Nlc2Z1bFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHBhZ2UsIGkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotI2VuZGlmCS8qIENPTkZJR19NVERfTkFORF9FQ0MgKi8KLSNlbmRpZgkvKiBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmFuZF93cml0ZV9lY2MgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCB0bywgc2l6ZV90IGxlbiwKLQkJCSAgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBlY2NfY29kZSkKLXsKLQlpbnQgaSwgcGFnZSwgY29sLCBjbnQsIHJldCA9IDA7Ci0KLQkvKiBEbyBub3QgYWxsb3cgd3JpdGUgcGFzdCBlbmQgb2YgZGV2aWNlICovCi0JaWYgKCh0byArIGxlbikgPiBuYW5kLT50b3RsZW4pIHsKLQkJcHJpbnRmICgiJXM6IEF0dGVtcHQgdG8gd3JpdGUgcGFzdCBlbmQgb2YgcGFnZVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFNoaWZ0IHRvIGdldCBwYWdlICovCi0JcGFnZSA9ICgoaW50KSB0bykgPj4gbmFuZC0+cGFnZV9zaGlmdDsKLQotCS8qIEdldCB0aGUgc3RhcnRpbmcgY29sdW1uICovCi0JY29sID0gdG8gJiAobmFuZC0+b29iYmxvY2sgLSAxKTsKLQotCS8qIEluaXRpYWxpemUgcmV0dXJuIGxlbmd0aCB2YWx1ZSAqLwotCSpyZXRsZW4gPSAwOwotCi0JLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLwotI2lmZGVmIENPTkZJR19PTUFQMTUxMAotCWFyY2hmbGFzaHdwKDAsMCk7Ci0jZW5kaWYKLSNpZmRlZiBDRkdfTkFORF9XUAotCU5BTkRfV1BfT0ZGKCk7Ci0jZW5kaWYKLQotICAgIAlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93ICovCi0KLQkvKiBDaGVjayB0aGUgV1AgYml0ICovCi0JTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1NUQVRVUyk7Ci0JaWYgKCEoUkVBRF9OQU5EKG5hbmQtPklPX0FERFIpICYgMHg4MCkpIHsKLQkJcHJpbnRmICgiJXM6IERldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhISFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldCA9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBMb29wIHVudGlsIGFsbCBkYXRhIGlzIHdyaXR0ZW4gKi8KLQl3aGlsZSAoKnJldGxlbiA8IGxlbikgewotCQkvKiBJbnZhbGlkYXRlIGNhY2hlLCBpZiB3ZSB3cml0ZSB0byB0aGlzIHBhZ2UgKi8KLQkJaWYgKG5hbmQtPmNhY2hlX3BhZ2UgPT0gcGFnZSkKLQkJCW5hbmQtPmNhY2hlX3BhZ2UgPSAtMTsKLQotCQkvKiBXcml0ZSBkYXRhIGludG8gYnVmZmVyICovCi0JCWlmICgoY29sICsgbGVuKSA+PSBuYW5kLT5vb2JibG9jaykgewotCQkJZm9yIChpID0gY29sLCBjbnQgPSAwOyBpIDwgbmFuZC0+b29iYmxvY2s7IGkrKywgY250KyspIHsKLQkJCQluYW5kLT5kYXRhX2J1ZltpXSA9IGJ1ZlsoKnJldGxlbiArIGNudCldOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpID0gY29sLCBjbnQgPSAwOyBjbnQgPCAobGVuIC0gKnJldGxlbik7IGkrKywgY250KyspIHsKLQkJCQluYW5kLT5kYXRhX2J1ZltpXSA9IGJ1ZlsoKnJldGxlbiArIGNudCldOwotCQkJfQotCQl9Ci0JCS8qIFdlIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiBmb3Igd3JpdGUgYW5kIHdyaXRldiAhKSAqLwotCQlyZXQgPSBuYW5kX3dyaXRlX3BhZ2UgKG5hbmQsIHBhZ2UsIGNvbCwgaSwgZWNjX2NvZGUpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0KLQkJLyogTmV4dCBkYXRhIHN0YXJ0IGF0IHBhZ2UgYm91bmRhcnkgKi8KLQkJY29sID0gMDsKLQotCQkvKiBVcGRhdGUgd3JpdHRlbiBieXRlcyBjb3VudCAqLwotCQkqcmV0bGVuICs9IGNudDsKLQotCQkvKiBJbmNyZW1lbnQgcGFnZSBhZGRyZXNzICovCi0JCXBhZ2UrKzsKLQl9Ci0KLQkvKiBSZXR1cm4gaGFwcHkgKi8KLQkqcmV0bGVuID0gbGVuOwotCi1vdXQ6Ci0JLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLwotCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLwotI2lmZGVmIENPTkZJR19PTUFQMTUxMAotICAgIAlhcmNoZmxhc2h3cCgwLDEpOwotI2VuZGlmCi0jaWZkZWYgQ0ZHX05BTkRfV1AKLQlOQU5EX1dQX09OKCk7Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUKLSAqIHBhZ2Ugb3IgMiAyNTYtYnl0ZSBwYWdlcy4KLSAqLwotc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCBvZnMsIHNpemVfdCBsZW4sCi0JCQkgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCi17Ci0JaW50IGxlbjI1NiA9IDA7Ci0Jc3RydWN0IE5hbmQgKm15Y2hpcDsKLQlpbnQgcmV0ID0gMDsKLQotCW15Y2hpcCA9ICZuYW5kLT5jaGlwc1tvZnMgPj4gbmFuZC0+Y2hpcHNoaWZ0XTsKLQotCS8qIHVwZGF0ZSBhZGRyZXNzIGZvciAyTSB4IDhiaXQgZGV2aWNlcy4gT09CIHN0YXJ0cyBvbiB0aGUgc2Vjb25kICovCi0JLyogcGFnZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbmFuZF9yZWFkX2VjYy4gKi8KLQlpZiAobmFuZC0+cGFnZTI1NikgewotCQlpZiAoIShvZnMgJiAweDgpKQotCQkJb2ZzICs9IDB4MTAwOwotCQllbHNlCi0JCQlvZnMgLT0gMHg4OwotCX0KLQotCU5BTkRfRU5BQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBsb3cgKi8KLQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRE9PQik7Ci0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0gCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCSAgICAgKChvZnMgPj4gbmFuZC0+cGFnZV9zaGlmdCkgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKwotIAkJCQkoKG9mcyAmIChuYW5kLT5vb2JibG9jayAtIDEpKSA+PiAxKSk7Ci0JfSBlbHNlIHsKLQkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsIG9mcyk7Ci0JfQotCi0JLyogdHJlYXQgY3Jvc3NpbmcgOC1ieXRlIE9PQiBkYXRhIGZvciAyTSB4IDhiaXQgZGV2aWNlcyAqLwotCS8qIE5vdGU6IGRhdGFzaGVldCBzYXlzIGl0IHNob3VsZCBhdXRvbWF0aWNhbHkgd3JhcCB0byB0aGUgKi8KLQkvKiAgICAgICBuZXh0IE9PQiBibG9jaywgYnV0IGl0IGRpZG4ndCB3b3JrIGhlcmUuIG1mLiAgICAgICovCi0JaWYgKG5hbmQtPnBhZ2UyNTYgJiYgb2ZzICsgbGVuID4gKG9mcyB8IDB4NykgKyAxKSB7Ci0JCWxlbjI1NiA9IChvZnMgfCAweDcpICsgMSAtIG9mczsKLQkJTmFuRF9SZWFkQnVmKG5hbmQsIGJ1ZiwgbGVuMjU2KTsKLQotCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRE9PQik7Ci0JCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLCBvZnMgJiAofjB4MWZmKSk7Ci0JfQotCi0JTmFuRF9SZWFkQnVmKG5hbmQsICZidWZbbGVuMjU2XSwgbGVuIC0gbGVuMjU2KTsKLQotCSpyZXRsZW4gPSBsZW47Ci0JLyogUmVhZGluZyB0aGUgZnVsbCBPT0IgZGF0YSBkcm9wcyB1cyBvZmYgb2YgdGhlIGVuZCBvZiB0aGUgcGFnZSwKLQkgKiBjYXVzaW5nIHRoZSBmbGFzaCBkZXZpY2UgdG8gZ28gaW50byBidXN5IG1vZGUsIHNvIHdlIG5lZWQKLQkgKiB0byB3YWl0IHVudGlsIHJlYWR5IDExLjQuMSBhbmQgVG9zaGliYSBUQzU4MjU2RlQgbmFuZHMgKi8KLQotCXJldCA9IE5hbkRfV2FpdFJlYWR5KG5hbmQsIDEpOwotCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLwotCi0JcmV0dXJuIHJldDsKLQotfQotCi0vKiB3cml0ZSB0byB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUKLSAqIHBhZ2Ugb3IgMiAyNTYtYnl0ZSBwYWdlcy4KLSAqLwotc3RhdGljIGludCBuYW5kX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAotCQkgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmKQotewotCWludCBsZW4yNTYgPSAwOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbmFuZHB0ciA9IG5hbmQtPklPX0FERFI7Ci0KLSNpZmRlZiBQU1lDSE9fREVCVUcKLQlwcmludGYoIm5hbmRfd3JpdGVfb29iKCVseCwgJWQpOiAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAuLi4gJTIuMlggJTIuMlggLi4gJTIuMlggJTIuMlhcbiIsCi0JICAgICAgIChsb25nKW9mcywgbGVuLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCi0JICAgICAgIGJ1Zls4XSwgYnVmWzldLCBidWZbMTRdLGJ1ZlsxNV0pOwotI2VuZGlmCi0KLQlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93IHRvIGVuYWJsZSBjaGlwICovCi0KLQkvKiBSZXNldCB0aGUgY2hpcCAqLwotCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9SRVNFVCk7Ci0KLQkvKiBpc3N1ZSB0aGUgUmVhZDIgY29tbWFuZCB0byBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIFNwYXJlIERhdGEgQXJlYS4gKi8KLQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRE9PQik7Ci0JaWYgKG5hbmQtPmJ1czE2KSB7Ci0gCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKLQkJCSAgICAgKChvZnMgPj4gbmFuZC0+cGFnZV9zaGlmdCkgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKwotIAkJCQkoKG9mcyAmIChuYW5kLT5vb2JibG9jayAtIDEpKSA+PiAxKSk7Ci0JfSBlbHNlIHsKLSAJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLCBvZnMpOwotCX0KLQotCS8qIHVwZGF0ZSBhZGRyZXNzIGZvciAyTSB4IDhiaXQgZGV2aWNlcy4gT09CIHN0YXJ0cyBvbiB0aGUgc2Vjb25kICovCi0JLyogcGFnZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbmFuZF9yZWFkX2VjYy4gKi8KLQlpZiAobmFuZC0+cGFnZTI1NikgewotCQlpZiAoIShvZnMgJiAweDgpKQotCQkJb2ZzICs9IDB4MTAwOwotCQllbHNlCi0JCQlvZnMgLT0gMHg4OwotCX0KLQotCS8qIGlzc3VlIHRoZSBTZXJpYWwgRGF0YSBJbiBjb21tYW5kIHRvIGluaXRpYWwgdGhlIFBhZ2UgUHJvZ3JhbSBwcm9jZXNzICovCi0JTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1NFUUlOKTsKLQlpZiAobmFuZC0+YnVzMTYpIHsKLSAJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAotCQkJICAgICAoKG9mcyA+PiBuYW5kLT5wYWdlX3NoaWZ0KSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArCi0gCQkJCSgob2ZzICYgKG5hbmQtPm9vYmJsb2NrIC0gMSkpID4+IDEpKTsKLQl9IGVsc2UgewotIAkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsIG9mcyk7Ci0JfQotCi0JLyogdHJlYXQgY3Jvc3NpbmcgOC1ieXRlIE9PQiBkYXRhIGZvciAyTSB4IDhiaXQgZGV2aWNlcyAqLwotCS8qIE5vdGU6IGRhdGFzaGVldCBzYXlzIGl0IHNob3VsZCBhdXRvbWF0aWNhbHkgd3JhcCB0byB0aGUgKi8KLQkvKiAgICAgICBuZXh0IE9PQiBibG9jaywgYnV0IGl0IGRpZG4ndCB3b3JrIGhlcmUuIG1mLiAgICAgICovCi0JaWYgKG5hbmQtPnBhZ2UyNTYgJiYgb2ZzICsgbGVuID4gKG9mcyB8IDB4NykgKyAxKSB7Ci0JCWxlbjI1NiA9IChvZnMgfCAweDcpICsgMSAtIG9mczsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjI1NjsgaSsrKQotCQkJV1JJVEVfTkFORChidWZbaV0sIG5hbmRwdHIpOwotCi0JCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9QQUdFUFJPRyk7Ci0JCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOwotI2lmZGVmIE5BTkRfTk9fUkIKLSAgIAkJeyB1X2NoYXIgcmV0X3ZhbDsKLQkJCWRvIHsKLQkJCQlyZXRfdmFsID0gUkVBRF9OQU5EKG5hbmRwdHIpOyAvKiB3YWl0IHRpbGwgcmVhZHkgKi8KLQkJCX0gd2hpbGUgKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7Ci0JCX0KLSNlbmRpZgotCQlpZiAoUkVBRF9OQU5EKG5hbmRwdHIpICYgMSkgewotCQkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIG9vYiBkYXRhXG4iKTsKLQkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvciAqLwotCQkJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCi0JCQkqcmV0bGVuID0gMDsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU0VRSU4pOwotCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwgb2ZzICYgKH4weDFmZikpOwotCX0KLQotCWlmIChuYW5kLT5idXMxNikgewotCQlmb3IgKGkgPSBsZW4yNTY7IGkgPCBsZW47IGkgKz0gMikgewotCQkJV1JJVEVfTkFORChidWZbaV0gKyAoYnVmW2krMV0gPDwgOCksIG5hbmRwdHIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gbGVuMjU2OyBpIDwgbGVuOyBpKyspCi0JCQlXUklURV9OQU5EKGJ1ZltpXSwgbmFuZHB0cik7Ci0JfQotCi0JTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1BBR0VQUk9HKTsKLQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKLSNpZmRlZiBOQU5EX05PX1JCCi0Jewl1X2NoYXIgcmV0X3ZhbDsKLQkJZG8gewotCQkJcmV0X3ZhbCA9IFJFQURfTkFORChuYW5kcHRyKTsgLyogd2FpdCB0aWxsIHJlYWR5ICovCi0JCX0gd2hpbGUgKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7Ci0JfQotI2VuZGlmCi0JaWYgKFJFQURfTkFORChuYW5kcHRyKSAmIDEpIHsKLQkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIG9vYiBkYXRhXG4iKTsKLQkJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCi0JCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLwotCQkqcmV0bGVuID0gMDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLwotCSpyZXRsZW4gPSBsZW47Ci0JcmV0dXJuIDA7Ci0KLX0KLQotaW50IG5hbmRfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwgaW50IGNsZWFuKQotewotCS8qIFRoaXMgaXMgZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBzbyBpdCB3aWxsIHdvcmsgb24gYW55IHN5c3RlbQotCSAqIHVzaW5nIG5hdGl2ZSBlbmRpYW4gamZmczIgKHRoZSBkZWZhdWx0KS4KLQkgKi8KLQlzdGF0aWMgc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBjbGVhbl9tYXJrZXIgPSB7Ci0JCUpGRlMyX01BR0lDX0JJVE1BU0ssCi0JCUpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSLAotCQk4CQkvKiA4IGJ5dGVzIGluIHRoaXMgbm9kZSAqLwotCX07Ci0JdW5zaWduZWQgbG9uZyBuYW5kcHRyOwotCXN0cnVjdCBOYW5kICpteWNoaXA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAob2ZzICYgKG5hbmQtPmVyYXNlc2l6ZS0xKSB8fCBsZW4gJiAobmFuZC0+ZXJhc2VzaXplLTEpKSB7Ci0JCXByaW50ZiAoIk9mZnNldCBhbmQgc2l6ZSBtdXN0IGJlIHNlY3RvciBhbGlnbmVkLCBlcmFzZXNpemUgPSAlZFxuIiwKLQkJCShpbnQpIG5hbmQtPmVyYXNlc2l6ZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQluYW5kcHRyID0gbmFuZC0+SU9fQUREUjsKLQotCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KLSNpZmRlZiBDT05GSUdfT01BUDE1MTAKLQlhcmNoZmxhc2h3cCgwLDApOwotI2VuZGlmCi0jaWZkZWYgQ0ZHX05BTkRfV1AKLQlOQU5EX1dQX09GRigpOwotI2VuZGlmCi0gICAgTkFORF9FTkFCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGxvdyAqLwotCi0JLyogQ2hlY2sgdGhlIFdQIGJpdCAqLwotCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOwotCWlmICghKFJFQURfTkFORChuYW5kLT5JT19BRERSKSAmIDB4ODApKSB7Ci0JCXByaW50ZiAoIm5hbmRfd3JpdGVfZWNjOiBEZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkISEhXG4iKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENoZWNrIHRoZSBXUCBiaXQgKi8KLQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKLQlpZiAoIShSRUFEX05BTkQobmFuZC0+SU9fQUREUikgJiAweDgwKSkgewotCQlwcmludGYgKCIlczogRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCEhIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEZJWE1FOiBEbyBuYW5kIGluIHRoZSBiYWNrZ3JvdW5kLiBVc2UgdGltZXJzIG9yIHNjaGVkdWxlX3Rhc2soKSAqLwotCXdoaWxlKGxlbikgewotCQkvKm15Y2hpcCA9ICZuYW5kLT5jaGlwc1tzaHIob2ZzLCBuYW5kLT5jaGlwc2hpZnQpXTsqLwotCQlteWNoaXAgPSAmbmFuZC0+Y2hpcHNbb2ZzID4+IG5hbmQtPmNoaXBzaGlmdF07Ci0KLQkJLyogYWx3YXlzIGNoZWNrIGZvciBiYWQgYmxvY2sgZmlyc3QsIGdlbnVpbmUgYmFkIGJsb2NrcwotCQkgKiBzaG91bGQgX25ldmVyXyAgYmUgZXJhc2VkLgotCQkgKi8KLQkJaWYgKEFMTE9XX0VSQVNFX0JBRF9ERUJVRyB8fCAhY2hlY2tfYmxvY2sobmFuZCwgb2ZzKSkgewotCQkJLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLwotCQkJTkFORF9FTkFCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGxvdyAqLwotCi0JCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfRVJBU0UxKTsKLQkJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX1BBR0UsIG9mcyk7Ci0JCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfRVJBU0UyKTsKLQotCQkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1NUQVRVUyk7Ci0KLSNpZmRlZiBOQU5EX05PX1JCCi0JCQl7CXVfY2hhciByZXRfdmFsOwotCQkJCWRvIHsKLQkJCQkJcmV0X3ZhbCA9IFJFQURfTkFORChuYW5kcHRyKTsgLyogd2FpdCB0aWxsIHJlYWR5ICovCi0JCQkJfSB3aGlsZSAoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKLQkJCX0KLSNlbmRpZgotCQkJaWYgKFJFQURfTkFORChuYW5kcHRyKSAmIDEpIHsKLQkJCQlwcmludGYgKCIlczogRXJyb3IgZXJhc2luZyBhdCAweCVseFxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCAobG9uZylvZnMpOwotCQkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvciAqLwotCQkJCXJldCA9IC0xOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKGNsZWFuKSB7Ci0JCQkJaW50IG47CS8qIHJldHVybiB2YWx1ZSBub3QgdXNlZCAqLwotCQkJCWludCBwLCBsOwotCi0JCQkJLyogY2xlYW4gbWFya2VyIHBvc2l0aW9uIGFuZCBzaXplIGRlcGVuZAotCQkJCSAqIG9uIHRoZSBwYWdlIHNpemUsIHNpbmNlIDI1NiBieXRlIHBhZ2VzCi0JCQkJICogb25seSBoYXZlIDggYnl0ZXMgb2Ygb29iIGRhdGEKLQkJCQkgKi8KLQkJCQlpZiAobmFuZC0+cGFnZTI1NikgewotCQkJCQlwID0gTkFORF9KRkZTMl9PT0I4X0ZTREFQT1M7Ci0JCQkJCWwgPSBOQU5EX0pGRlMyX09PQjhfRlNEQUxFTjsKLQkJCQl9IGVsc2UgewotCQkJCQlwID0gTkFORF9KRkZTMl9PT0IxNl9GU0RBUE9TOwotCQkJCQlsID0gTkFORF9KRkZTMl9PT0IxNl9GU0RBTEVOOwotCQkJCX0KLQotCQkJCXJldCA9IG5hbmRfd3JpdGVfb29iKG5hbmQsIG9mcyArIHAsIGwsIChzaXplX3QgKikmbiwKLQkJCQkJCSAgICAgKHVfY2hhciAqKSZjbGVhbl9tYXJrZXIpOwotCQkJCS8qIHF1aXQgaGVyZSBpZiB3cml0ZSBmYWlsZWQgKi8KLQkJCQlpZiAocmV0KQotCQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQlvZnMgKz0gbmFuZC0+ZXJhc2VzaXplOwotCQlsZW4gLT0gbmFuZC0+ZXJhc2VzaXplOwotCX0KLQotb3V0OgotCS8qIERlLXNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KLQlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KLSNpZmRlZiBDT05GSUdfT01BUDE1MTAKLSAgICAJYXJjaGZsYXNod3AoMCwxKTsKLSNlbmRpZgotI2lmZGVmIENGR19OQU5EX1dQCi0JTkFORF9XUF9PTigpOwotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuYW5kY2hlY2sodW5zaWduZWQgbG9uZyBwb3RlbnRpYWwsIHVuc2lnbmVkIGxvbmcgcGh5c2FkcikKLXsKLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgbG9uZyBuYW5kX3Byb2JlKHVuc2lnbmVkIGxvbmcgcGh5c2FkcikKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gTlVMTDsKLQlpbnQgaSA9IDAsIENoaXBJRCA9IDE7Ci0KLSNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCi0Jb29iX2NvbmZpZy5lY2NfcG9zWzBdID0gTkFORF9KRkZTMl9PT0JfRUNDUE9TMDsKLQlvb2JfY29uZmlnLmVjY19wb3NbMV0gPSBOQU5EX0pGRlMyX09PQl9FQ0NQT1MxOwotCW9vYl9jb25maWcuZWNjX3Bvc1syXSA9IE5BTkRfSkZGUzJfT09CX0VDQ1BPUzI7Ci0Jb29iX2NvbmZpZy5lY2NfcG9zWzNdID0gTkFORF9KRkZTMl9PT0JfRUNDUE9TMzsKLQlvb2JfY29uZmlnLmVjY19wb3NbNF0gPSBOQU5EX0pGRlMyX09PQl9FQ0NQT1M0OwotCW9vYl9jb25maWcuZWNjX3Bvc1s1XSA9IE5BTkRfSkZGUzJfT09CX0VDQ1BPUzU7Ci0Jb29iX2NvbmZpZy5lY2N2YWxpZF9wb3MgPSA0OwotI2Vsc2UKLQlvb2JfY29uZmlnLmVjY19wb3NbMF0gPSBOQU5EX05PT0JfRUNDUE9TMDsKLQlvb2JfY29uZmlnLmVjY19wb3NbMV0gPSBOQU5EX05PT0JfRUNDUE9TMTsKLQlvb2JfY29uZmlnLmVjY19wb3NbMl0gPSBOQU5EX05PT0JfRUNDUE9TMjsKLQlvb2JfY29uZmlnLmVjY19wb3NbM10gPSBOQU5EX05PT0JfRUNDUE9TMzsKLQlvb2JfY29uZmlnLmVjY19wb3NbNF0gPSBOQU5EX05PT0JfRUNDUE9TNDsKLQlvb2JfY29uZmlnLmVjY19wb3NbNV0gPSBOQU5EX05PT0JfRUNDUE9TNTsKLQlvb2JfY29uZmlnLmVjY3ZhbGlkX3BvcyA9IE5BTkRfTk9PQl9FQ0NWUE9TOwotI2VuZGlmCi0Jb29iX2NvbmZpZy5iYWRibG9ja19wb3MgPSA1OwotCi0JZm9yIChpPTA7IGk8Q0ZHX01BWF9OQU5EX0RFVklDRTsgaSsrKSB7Ci0JCWlmIChuYW5kX2Rldl9kZXNjW2ldLkNoaXBJRCA9PSBOQU5EX0NoaXBJRF9VTktOT1dOKSB7Ci0JCQluYW5kID0gJm5hbmRfZGV2X2Rlc2NbaV07Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIW5hbmQpCi0JCXJldHVybiAoMCk7Ci0KLQltZW1zZXQoKGNoYXIgKiluYW5kLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwotCi0JbmFuZC0+SU9fQUREUiA9IHBoeXNhZHI7Ci0JbmFuZC0+Y2FjaGVfcGFnZSA9IC0xOyAgLyogaW5pdCB0aGUgY2FjaGUgcGFnZSAqLwotCU5hbkRfU2NhbkNoaXBzKG5hbmQpOwotCi0JaWYgKG5hbmQtPnRvdGxlbiA9PSAwKSB7Ci0JCS8qIG5vIGNoaXBzIGZvdW5kLCBjbGVhbiB1cCBhbmQgcXVpdCAqLwotCQltZW1zZXQoKGNoYXIgKiluYW5kLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwotCQluYW5kLT5DaGlwSUQgPSBOQU5EX0NoaXBJRF9VTktOT1dOOwotCQlyZXR1cm4gKDApOwotCX0KLQotCW5hbmQtPkNoaXBJRCA9IENoaXBJRDsKLQlpZiAoY3Vycl9kZXZpY2UgPT0gLTEpCi0JCWN1cnJfZGV2aWNlID0gaTsKLQotCW5hbmQtPmRhdGFfYnVmID0gbWFsbG9jIChuYW5kLT5vb2JibG9jayArIG5hbmQtPm9vYnNpemUpOwotCWlmICghbmFuZC0+ZGF0YV9idWYpIHsKLQkJcHV0cyAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlcy5cbiIpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCXJldHVybiAobmFuZC0+dG90bGVuKTsKLX0KLQotI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKLS8qCi0gKiBQcmUtY2FsY3VsYXRlZCAyNTYtd2F5IDEgYnl0ZSBjb2x1bW4gcGFyaXR5Ci0gKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgbmFuZF9lY2NfcHJlY2FsY190YWJsZVtdID0gewotCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsCi0JMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMCwKLQkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLAotCTB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsCi0JMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywKLQkweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAotCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksCi0JMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKLQkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLAotCTB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4NmEsIDB4M2YsIDB4M2MsIDB4NjksCi0JMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwKLQkweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAotCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsCi0JMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKLQkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLAotCTB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4NjksIDB4M2MsIDB4M2YsIDB4NmEsCi0JMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwKLQkweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAotCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsCi0JMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKLQkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LAotCTB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4MGYsIDB4NWEsIDB4NTksIDB4MGMsCi0JMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywKLQkweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAotCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksCi0JMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKLQkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLAotCTB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsCi0JMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwKLQkweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAotCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsCi0JMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMAotfTsKLQotCi0vKgotICogQ3JlYXRlcyBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eQotICovCi1zdGF0aWMgdm9pZCBuYW5kX3RyYW5zX3Jlc3VsdCh1X2NoYXIgcmVnMiwgdV9jaGFyIHJlZzMsCi0JdV9jaGFyICplY2NfY29kZSkKLXsKLQl1X2NoYXIgYSwgYiwgaSwgdG1wMSwgdG1wMjsKLQotCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCi0JYSA9IGIgPSAweDgwOwotCXRtcDEgPSB0bXAyID0gMDsKLQotCS8qIENhbGN1bGF0ZSBmaXJzdCBFQ0MgYnl0ZSAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHJlZzMgJiBhKQkJLyogTFAxNSwxMywxMSw5IC0tPiBlY2NfY29kZVswXSAqLwotCQkJdG1wMSB8PSBiOwotCQliID4+PSAxOwotCQlpZiAocmVnMiAmIGEpCQkvKiBMUDE0LDEyLDEwLDggLS0+IGVjY19jb2RlWzBdICovCi0JCQl0bXAxIHw9IGI7Ci0JCWIgPj49IDE7Ci0JCWEgPj49IDE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHNlY29uZCBFQ0MgYnl0ZSAqLwotCWIgPSAweDgwOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHJlZzMgJiBhKQkJLyogTFA3LDUsMywxIC0tPiBlY2NfY29kZVsxXSAqLwotCQkJdG1wMiB8PSBiOwotCQliID4+PSAxOwotCQlpZiAocmVnMiAmIGEpCQkvKiBMUDYsNCwyLDAgLS0+IGVjY19jb2RlWzFdICovCi0JCQl0bXAyIHw9IGI7Ci0JCWIgPj49IDE7Ci0JCWEgPj49IDE7Ci0JfQotCi0JLyogU3RvcmUgdHdvIG9mIHRoZSBFQ0MgYnl0ZXMgKi8KLQllY2NfY29kZVswXSA9IHRtcDE7Ci0JZWNjX2NvZGVbMV0gPSB0bXAyOwotfQotCi0vKgotICogQ2FsY3VsYXRlIDMgYnl0ZSBFQ0MgY29kZSBmb3IgMjU2IGJ5dGUgYmxvY2sKLSAqLwotc3RhdGljIHZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKLXsKLQl1X2NoYXIgaWR4LCByZWcxLCByZWczOwotCWludCBqOwotCi0JLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KLQlyZWcxID0gcmVnMyA9IDA7Ci0JZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKLQotCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KLQlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgewotCi0JCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLwotCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07Ci0JCXJlZzEgXj0gaWR4OwotCi0JCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCi0JCWlmIChpZHggJiAweDQwKSB7Ci0JCQlyZWczIF49ICh1X2NoYXIpIGo7Ci0JCX0KLQl9Ci0KLQkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KLQluYW5kX3RyYW5zX3Jlc3VsdCgocmVnMSAmIDB4NDApID8gfnJlZzMgOiByZWczLCByZWczLCBlY2NfY29kZSk7Ci0KLQkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KLQllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKLQllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKLQllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKLX0KLQotLyoKLSAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVycm9yIGZvciAyNTYgYnl0ZSBibG9jawotICovCi1zdGF0aWMgaW50IG5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKLXsKLQl1X2NoYXIgYSwgYiwgYywgZDEsIGQyLCBkMywgYWRkLCBiaXQsIGk7Ci0KLQkvKiBEbyBlcnJvciBkZXRlY3Rpb24gKi8KLQlkMSA9IGNhbGNfZWNjWzBdIF4gcmVhZF9lY2NbMF07Ci0JZDIgPSBjYWxjX2VjY1sxXSBeIHJlYWRfZWNjWzFdOwotCWQzID0gY2FsY19lY2NbMl0gXiByZWFkX2VjY1syXTsKLQotCWlmICgoZDEgfCBkMiB8IGQzKSA9PSAwKSB7Ci0JCS8qIE5vIGVycm9ycyAqLwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlhID0gKGQxIF4gKGQxID4+IDEpKSAmIDB4NTU7Ci0JCWIgPSAoZDIgXiAoZDIgPj4gMSkpICYgMHg1NTsKLQkJYyA9IChkMyBeIChkMyA+PiAxKSkgJiAweDU0OwotCi0JCS8qIEZvdW5kIGFuZCB3aWxsIGNvcnJlY3Qgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgZGF0YSAqLwotCQlpZiAoKGEgPT0gMHg1NSkgJiYgKGIgPT0gMHg1NSkgJiYgKGMgPT0gMHg1NCkpIHsKLQkJCWMgPSAweDgwOwotCQkJYWRkID0gMDsKLQkJCWEgPSAweDgwOwotCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7Ci0JCQkJaWYgKGQxICYgYykKLQkJCQkJYWRkIHw9IGE7Ci0JCQkJYyA+Pj0gMjsKLQkJCQlhID4+PSAxOwotCQkJfQotCQkJYyA9IDB4ODA7Ci0JCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKLQkJCQlpZiAoZDIgJiBjKQotCQkJCQlhZGQgfD0gYTsKLQkJCQljID4+PSAyOwotCQkJCWEgPj49IDE7Ci0JCQl9Ci0JCQliaXQgPSAwOwotCQkJYiA9IDB4MDQ7Ci0JCQljID0gMHg4MDsKLQkJCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQkJCWlmIChkMyAmIGMpCi0JCQkJCWJpdCB8PSBiOwotCQkJCWMgPj49IDI7Ci0JCQkJYiA+Pj0gMTsKLQkJCX0KLQkJCWIgPSAweDAxOwotCQkJYSA9IGRhdFthZGRdOwotCQkJYSBePSAoYiA8PCBiaXQpOwotCQkJZGF0W2FkZF0gPSBhOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChkMSkgewotCQkJCWlmIChkMSAmIDB4MDEpCi0JCQkJCSsraTsKLQkJCQlkMSA+Pj0gMTsKLQkJCX0KLQkJCXdoaWxlIChkMikgewotCQkJCWlmIChkMiAmIDB4MDEpCi0JCQkJCSsraTsKLQkJCQlkMiA+Pj0gMTsKLQkJCX0KLQkJCXdoaWxlIChkMykgewotCQkJCWlmIChkMyAmIDB4MDEpCi0JCQkJCSsraTsKLQkJCQlkMyA+Pj0gMTsKLQkJCX0KLQkJCWlmIChpID09IDEpIHsKLQkJCQkvKiBFQ0MgQ29kZSBFcnJvciBDb3JyZWN0aW9uICovCi0JCQkJcmVhZF9lY2NbMF0gPSBjYWxjX2VjY1swXTsKLQkJCQlyZWFkX2VjY1sxXSA9IGNhbGNfZWNjWzFdOwotCQkJCXJlYWRfZWNjWzJdID0gY2FsY19lY2NbMl07Ci0JCQkJcmV0dXJuIDI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBVbmNvcnJlY3RhYmxlIEVycm9yICovCi0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCi0JLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCXJldHVybiAtMTsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSkZGUzJfTkFORAotCi1pbnQgcmVhZF9qZmZzMl9uYW5kKHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKLQkJICAgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCBpbnQgbmFuZGRldikKLXsKLQlyZXR1cm4gbmFuZF9ydyhuYW5kX2Rldl9kZXNjICsgbmFuZGRldiwgTkFORFJXX1JFQUQgfCBOQU5EUldfSkZGUzIsCi0JCSAgICAgICBzdGFydCwgbGVuLCByZXRsZW4sIGJ1Zik7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfSkZGUzJfTkFORCAqLwotCi0KICNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworCisjZW5kaWYgLyogQ0ZHX05BTkRfTEVHQUNZICovCmRpZmYgLS1naXQgYS9jb21tb24vZW52X25hbmQuYyBiL2NvbW1vbi9lbnZfbmFuZC5jCmluZGV4IDYwYWJhMWUuLjQ4OTY4NTMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfbmFuZC5jCisrKyBiL2NvbW1vbi9lbnZfbmFuZC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGVudmlyb25tZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxuYW5kLmg+CiAKICNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCiAjZGVmaW5lIENNRF9TQVZFRU5WCkBAIC01NSwxNiArNTUsMTIgQEAKICNlcnJvciBDT05GSUdfSU5GRVJOTyBub3Qgc3VwcG9ydGVkIHlldAogI2VuZGlmCiAKLS8qIHJlZmVyZW5jZXMgdG8gbmFtZXMgaW4gY21kX25hbmQuYyAqLwotI2RlZmluZSBOQU5EUldfUkVBRAkJMHgwMQotI2RlZmluZSBOQU5EUldfV1JJVEUJMHgwMAotI2RlZmluZSBOQU5EUldfSkZGUzIJMHgwMgotZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tdOwotaW50IG5hbmRfcncgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsCitpbnQgbmFuZF9sZWdhY3lfcncgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsCiAJICAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKIAkgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpOwotaW50IG5hbmRfZXJhc2Uoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywKLQkJCQlzaXplX3QgbGVuLCBpbnQgY2xlYW4pOworCisvKiBpbmZvIGZvciBOQU5EIGNoaXBzLCBkZWZpbmVkIGluIGRyaXZlcnMvbmFuZC9uYW5kLmMgKi8KK2V4dGVybiBuYW5kX2luZm9fdCBuYW5kX2luZm9bXTsKIAogLyogcmVmZXJlbmNlcyB0byBuYW1lcyBpbiBlbnZfY29tbW9uLmMgKi8KIGV4dGVybiB1Y2hhciBkZWZhdWx0X2Vudmlyb25tZW50W107CkBAIC0xMTAsMzQgKzEwNiw0MyBAQAogfQogCiAjaWZkZWYgQ01EX1NBVkVFTlYKKy8qCisgKiBUaGUgbGVnYWN5IE5BTkQgY29kZSBzYXZlZCB0aGUgZW52aXJvbm1lbnQgaW4gdGhlIGZpcnN0IE5BTkQgZGV2aWNlIGkuZS4sCisgKiBuYW5kX2Rldl9kZXNjICsgMC4gVGhpcyBpcyBhbHNvIHRoZSBiZWhhdmlvdXIgdXNpbmcgdGhlIG5ldyBOQU5EIGNvZGUuCisgKi8KIGludCBzYXZlZW52KHZvaWQpCiB7CiAJaW50CXRvdGFsLCByZXQgPSAwOwotIAlwdXRzICgiRXJhc2luZyBOYW5kLi4uIik7Ci0gCWlmIChuYW5kX2VyYXNlKG5hbmRfZGV2X2Rlc2MgKyAwLCBDRkdfRU5WX09GRlNFVCwgQ0ZHX0VOVl9TSVpFLCAwKSkKLSAJCXJldHVybiAxOwogCi0JcHV0cyAoIldyaXRpbmcgdG8gTmFuZC4uLiAiKTsKLQlyZXQgPSBuYW5kX3J3KG5hbmRfZGV2X2Rlc2MgKyAwLAotCQkJCSAgTkFORFJXX1dSSVRFIHwgTkFORFJXX0pGRlMyLCBDRkdfRU5WX09GRlNFVCwgQ0ZHX0VOVl9TSVpFLAotCQkJICAgICAgJnRvdGFsLCAodV9jaGFyKillbnZfcHRyKTsKLSAgCWlmIChyZXQgfHwgdG90YWwgIT0gQ0ZHX0VOVl9TSVpFKQorCXB1dHMgKCJFcmFzaW5nIE5hbmQuLi4iKTsKKwlpZiAobmFuZF9lcmFzZSgmbmFuZF9pbmZvWzBdLCBDRkdfTkVXX09GRlNFVCwgQ0ZHX0VOVl9TSVpFKSkKIAkJcmV0dXJuIDE7CiAKLSAJcHV0cyAoImRvbmVcbiIpOwotICAJcmV0dXJuIHJldDsKKwlwdXRzICgiV3JpdGluZyB0byBOYW5kLi4uICIpOworCXRvdGFsID0gQ0ZHX0VOVl9TSVpFOworCXJldCA9IG5hbmRfd3JpdGUoJm5hbmRfaW5mb1swXSwgQ0ZHX0VOVl9PRkZTRVQsICZ0b3RhbCwKKwkJCSh1X2NoYXIqKSBlbnZfcHRyKTsKKwlpZiAocmV0IHx8IHRvdGFsICE9IENGR19FTlZfU0laRSkKKwkJcmV0dXJuIDE7CisKKwlwdXRzICgiZG9uZVxuIik7CisJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBDTURfU0FWRUVOViAqLwogCiAKKy8qCisgKiBUaGUgbGVnYWN5IE5BTkQgY29kZSBzYXZlZCB0aGUgZW52aXJvbm1lbnQgaW4gdGhlIGZpcnN0IE5BTkQgZGV2aWNlIGkuZS4sCisgKiBuYW5kX2Rldl9kZXNjICsgMC4gVGhpcyBpcyBhbHNvIHRoZSBiZWhhdmlvdXIgdXNpbmcgdGhlIG5ldyBOQU5EIGNvZGUuCisgKi8KIHZvaWQgZW52X3JlbG9jYXRlX3NwZWMgKHZvaWQpCiB7CiAjaWYgIWRlZmluZWQoRU5WX0lTX0VNQkVEREVEKQogCWludCByZXQsIHRvdGFsOwogCi0JcmV0ID0gbmFuZF9ydyhuYW5kX2Rldl9kZXNjICsgMCwKLQkJCQkgIE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyLCBDRkdfRU5WX09GRlNFVCwgQ0ZHX0VOVl9TSVpFLAotCQkJICAgICAgJnRvdGFsLCAodV9jaGFyKillbnZfcHRyKTsKKwl0b3RhbCA9IENGR19FTlZfU0laRTsKKwlyZXQgPSBuYW5kX3JlYWQoJm5hbmRfaW5mb1swXSwgQ0ZHX0VOVl9PRkZTRVQsICZ0b3RhbCwKKwkJCSh1X2NoYXIqKSBlbnZfcHRyKTsKICAgCWlmIChyZXQgfHwgdG90YWwgIT0gQ0ZHX0VOVl9TSVpFKQogCQlyZXR1cm4gdXNlX2RlZmF1bHQoKTsKIApkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5uYW5kIGIvZG9jL1JFQURNRS5uYW5kCmluZGV4IDBmMmJkYzUuLmNkNzYwOGMgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUubmFuZAorKysgYi9kb2MvUkVBRE1FLm5hbmQKQEAgLTEsNSArMSw5IEBACiBOQU5EIEZMQVNIIGNvbW1hbmRzIGFuZCBub3RlcwogCisKK1NlZSBOT1RFIGJlbG93ISEhCisKKwogIyAoQykgQ29weXJpZ2h0IDIwMDMKICMgRGF2ZSBFbGxpcywgU0lYTkVULCBkZ2VAc2l4bmV0aW8uY29tCiAjCkBAIC0xNzMsMyArMTc3LDM0IEBACiAgICAjZGVmaW5lIE5BTkRfQ2hpcElEX1VOS05PV04gMHgwMAogICAgI2RlZmluZSBOQU5EX01BWF9GTE9PUlMgMQogICAgI2RlZmluZSBOQU5EX01BWF9DSElQUyAxCisKKworCitOT1RFOgorPT09PT0KKworV2Ugbm93IHVzZSBhIGNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIE5BTkQgY29kZSBiYXNlZCBvbiB3aGF0IGlzIGluCisyLjYuMTIgTGludXgga2VybmVsLgorCitUaGUgb2xkIE5BTkQgaGFuZGxpbmcgY29kZSBoYXMgYmVlbiByZS1mYWN0b3JlZCBhbmQgaXMgbm93IGNvbmZpbmVkCit0byBvbmx5IGJvYXJkLXNwZWNpZmljIGZpbGVzIGFuZCAtIHVuZm9ydHVuYXRlbHkgLSB0byB0aGUgRG9DIGNvZGUKKyhzZWUgYmVsb3cpLiBBIG5ldyBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGhhcyBiZWVuIGludHJvZHVjZWQ6CitDRkdfTkFORF9MRUdBQ1ksIHdoaWNoIGhhcyB0byBiZSBkZWZpbmVkIGluIHRoZSBib2FyZCBjb25maWcgZmlsZSBpZgordGhhdCBib2FyZCB1c2VzIGxlZ2FjeSBjb2RlLiBJZiBDRkdfTkFORF9MRUdBQ1kgaXMgZGVmaW5lZCwgdGhlIGJvYXJkCitzcGVjaWZpYyBjb25maWcubWsgZmlsZSBzaG91bGQgYWxzbyBoYXZlICJCT0FSRExJQlMgPQorZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hIi4gRm9yIGJvYXJkcyB1c2luZyB0aGUgbmV3IE5BTkQKK2FwcHJvYWNoIChQUENoYW1lbGVvbiBhbmQgbmV0c3RhciBhdCB0aGUgbW9tZW50KSBubyB2YXJpYWJsZSBpcworbmVjZXNzYXJ5LCBidXQgdGhlIGNvbmZpZy5tayBzaG91bGQgaGF2ZSAiQk9BUkRMSUJTID0KK2RyaXZlcnMvbmFuZC9saWJuYW5kLmEiLgorCitUaGUgbmVjZXNzYXJ5IGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gYWxsIGFmZmVjdGVkIGJvYXJkcywgYW5kIG5vCitidWlsZCBicmVha2FnZSBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBleGNlcHQgZm9yIE5FVFRBIGFuZCBORVRUQV9JU0ROCit0YXJnZXRzIGZyb20gTUFLRUFMTC4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGVzZSB0d28gYm9hcmRzCit1c2UgSkZGUywgd2hpY2ggaGFzIGJlZW4gYWRvcHRlZCB0byB1c2UgdGhlIG5ldyBOQU5ELCBhbmQgYXQgdGhlIHNhbWUKK3RpbWUgdXNlIE5BTkQgaW4gbGVnYWN5IG1vZGUuIFRoZSBicmVha2FnZSB3aWxsIGRpc2FwcGVhciB3aGVuIHRoZQorYm9hcmQtc3BlY2lmaWMgY29kZSBpcyBjaGFuZ2VkIHRvIHRoZSBuZXcgTkFORC4KKworQXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgbGVnYWN5IGNvZGUgaXMgc3RpbGwgdXNlZCBieSB0aGUgRG9DIHN1YnN5c3RlbS4gCitUaGUgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBsZWdhY3kgTkFORCBjYW4ndCBiZSByZW1vdmVkICBmcm9tIAordGhlIHRyZWUgdW50aWwgdGhlIERvQyBpcyBwb3J0ZWQgdG8gdXNlIHRoZSBuZXcgTkFORCBzdXBwb3J0IChvciBib2FyZHMgCit3aXRoIERvQyB3aWxsIGJyZWFrKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY2N2RmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIgOj0gbGlibmFuZC5hCisKK09CSlMgOj0gbmFuZC5vIG5hbmRfYmFzZS5vIG5hbmRfaWRzLm8gbmFuZF9lY2MubyBuYW5kX2JidC5vCithbGw6CSQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy5kZXBlbmQ6CU1ha2VmaWxlICQoT0JKUzoubz0uYykKKwkJJChDQykgLU0gJChDRkxBR1MpICQoT0JKUzoubz0uYykgPiAkQAorCitzaW5jbHVkZSAuZGVwZW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvZGlza29uY2hpcC5jIGIvZHJpdmVycy9uYW5kL2Rpc2tvbmNoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFhZTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMCwwICsxLDE3ODggQEAKKy8qCisgKiBkcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworICoKKyAqIChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqIChDKSAyMDA0IERhbiBCcm93biA8ZGFuX2Jyb3duQGllZWUub3JnPgorICogKEMpIDIwMDQgS2FsZXYgTGVtYmVyIDxrYWxldkBzbWFydGxpbmsuZWU+CisgKgorICogQXV0aG9yOiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKiBBZGRpdGlvbmFsIERpc2tvbmNoaXAgMjAwMCBhbmQgTWlsbGVubml1bSBzdXBwb3J0IGJ5IERhbiBCcm93biA8ZGFuX2Jyb3duQGllZWUub3JnPgorICogRGlza29uY2hpcCBNaWxsZW5uaXVtIFBsdXMgc3VwcG9ydCBieSBLYWxldiBMZW1iZXIgPGthbGV2QHNtYXJ0bGluay5lZT4KKyAqCisgKiBFcnJvciBjb3JyZWN0aW9uIGNvZGUgbGlmdGVkIGZyb20gdGhlIG9sZCBkb2NlY2MgY29kZQorICogQXV0aG9yOiBGYWJyaWNlIEJlbGxhcmQgKGZhYnJpY2UuYmVsbGFyZEBuZXRnZW0uY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAwIE5ldGdlbSBTLkEuCisgKiBjb252ZXJ0ZWQgdG8gdGhlIGdlbmVyaWMgUmVlZC1Tb2xvbW9uIGxpYnJhcnkgYnkgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKgorICogSW50ZXJmYWNlIHRvIGdlbmVyaWMgTkFORCBjb2RlIGZvciBNLVN5c3RlbXMgRGlza09uQ2hpcCBkZXZpY2VzCisgKgorICogJElkOiBkaXNrb25jaGlwLmMsdiAxLjQ1IDIwMDUvMDEvMDUgMTg6MDU6MTQgZHdtdzIgRXhwICQKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKKyNlcnJvciBDRkdfTkFORF9MRUdBQ1kgZGVmaW5lZCBpbiBhIGZpbGUgbm90IHVzaW5nIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0IQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JzbGliLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2luZnRsLmg+CisKKy8qIFdoZXJlIHRvIGxvb2sgZm9yIHRoZSBkZXZpY2VzPyAqLworI2lmbmRlZiBDT05GSUdfTVREX0RJU0tPTkNISVBfUFJPQkVfQUREUkVTUworI2RlZmluZSBDT05GSUdfTVREX0RJU0tPTkNISVBfUFJPQkVfQUREUkVTUyAwCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBkb2NfbG9jYXRpb25zW10gPSB7CisjaWYgZGVmaW5lZCAoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjaWZkZWYgQ09ORklHX01URF9ESVNLT05DSElQX1BST0JFX0hJR0gKKwkweGZmZmM4MDAwLCAweGZmZmNhMDAwLCAweGZmZmNjMDAwLCAweGZmZmNlMDAwLAorCTB4ZmZmZDAwMDAsIDB4ZmZmZDIwMDAsIDB4ZmZmZDQwMDAsIDB4ZmZmZDYwMDAsCisJMHhmZmZkODAwMCwgMHhmZmZkYTAwMCwgMHhmZmZkYzAwMCwgMHhmZmZkZTAwMCwKKwkweGZmZmUwMDAwLCAweGZmZmUyMDAwLCAweGZmZmU0MDAwLCAweGZmZmU2MDAwLAorCTB4ZmZmZTgwMDAsIDB4ZmZmZWEwMDAsIDB4ZmZmZWMwMDAsIDB4ZmZmZWUwMDAsCisjZWxzZSAvKiAgQ09ORklHX01URF9ET0NQUk9CRV9ISUdIICovCisJMHhjODAwMCwgMHhjYTAwMCwgMHhjYzAwMCwgMHhjZTAwMCwKKwkweGQwMDAwLCAweGQyMDAwLCAweGQ0MDAwLCAweGQ2MDAwLAorCTB4ZDgwMDAsIDB4ZGEwMDAsIDB4ZGMwMDAsIDB4ZGUwMDAsCisJMHhlMDAwMCwgMHhlMjAwMCwgMHhlNDAwMCwgMHhlNjAwMCwKKwkweGU4MDAwLCAweGVhMDAwLCAweGVjMDAwLCAweGVlMDAwLAorI2VuZGlmIC8qICBDT05GSUdfTVREX0RPQ1BST0JFX0hJR0ggKi8KKyNlbGlmIGRlZmluZWQoX19QUENfXykKKwkweGU0MDAwMDAwLAorI2VsaWYgZGVmaW5lZChDT05GSUdfTU9NRU5DT19PQ0VMT1QpCisJMHgyZjAwMDAwMCwKKwkweGZmMDAwMDAwLAorI2VsaWYgZGVmaW5lZChDT05GSUdfTU9NRU5DT19PQ0VMT1RfRykgfHwgZGVmaW5lZCAoQ09ORklHX01PTUVOQ09fT0NFTE9UX0MpCisJMHhmZjAwMDAwMCwKKyMjZWxzZQorI3dhcm5pbmcgVW5rbm93biBhcmNoaXRlY3R1cmUgZm9yIERpc2tPbkNoaXAuIE5vIGRlZmF1bHQgcHJvYmUgbG9jYXRpb25zIGRlZmluZWQKKyNlbmRpZgorCTB4ZmZmZmZmZmYgfTsKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqZG9jbGlzdCA9IE5VTEw7CisKK3N0cnVjdCBkb2NfcHJpdiB7CisJdm9pZCBfX2lvbWVtICp2aXJ0YWRyOworCXVuc2lnbmVkIGxvbmcgcGh5c2FkcjsKKwl1X2NoYXIgQ2hpcElEOworCXVfY2hhciBDRFNOQ29udHJvbDsKKwlpbnQgY2hpcHNfcGVyX2Zsb29yOyAvKiBUaGUgbnVtYmVyIG9mIGNoaXBzIGRldGVjdGVkIG9uIGVhY2ggZmxvb3IgKi8KKwlpbnQgY3VyZmxvb3I7CisJaW50IGN1cmNoaXA7CisJaW50IG1oMF9wYWdlOworCWludCBtaDFfcGFnZTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm5leHRkb2M7Cit9OworCisvKiBNYXggbnVtYmVyIG9mIGVyYXNlYmxvY2tzIHRvIHNjYW4gKGZyb20gc3RhcnQgb2YgZGV2aWNlKSBmb3IgdGhlIChJKU5GVEwKKyAgIE1lZGlhSGVhZGVyLiAgVGhlIHNwZWMgc2F5cyB0byBqdXN0IGtlZXAgZ29pbmcsIEkgdGhpbmssIGJ1dCB0aGF0J3MganVzdAorICAgc2lsbHkuICovCisjZGVmaW5lIE1BWF9NRURJQUhFQURFUl9TQ0FOIDgKKworLyogVGhpcyBpcyB0aGUgc3luZHJvbWUgY29tcHV0ZWQgYnkgdGhlIEhXIGVjYyBnZW5lcmF0b3IgdXBvbiByZWFkaW5nIGFuIGVtcHR5CisgICBwYWdlLCBvbmUgd2l0aCBhbGwgMHhmZiBmb3IgZGF0YSBhbmQgc3RvcmVkIGVjYyBjb2RlLiAqLworc3RhdGljIHVfY2hhciBlbXB0eV9yZWFkX3N5bmRyb21lWzZdID0geyAweDI2LCAweGZmLCAweDZkLCAweDQ3LCAweDczLCAweDdhIH07CisvKiBUaGlzIGlzIHRoZSBlY2MgdmFsdWUgY29tcHV0ZWQgYnkgdGhlIEhXIGVjYyBnZW5lcmF0b3IgdXBvbiB3cml0aW5nIGFuIGVtcHR5CisgICBwYWdlLCBvbmUgd2l0aCBhbGwgMHhmZiBmb3IgZGF0YS4gKi8KK3N0YXRpYyB1X2NoYXIgZW1wdHlfd3JpdGVfZWNjWzZdID0geyAweDRiLCAweDAwLCAweGUyLCAweDBlLCAweDkzLCAweGY3IH07CisKKyNkZWZpbmUgSU5GVExfQkJUX1JFU0VSVkVEX0JMT0NLUyA0CisKKyNkZWZpbmUgRG9DX2lzX01pbGxlbm5pdW1QbHVzKGRvYykgKChkb2MpLT5DaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2NNaWxQbHVzMTYgfHwgKGRvYyktPkNoaXBJRCA9PSBET0NfQ2hpcElEX0RvY01pbFBsdXMzMikKKyNkZWZpbmUgRG9DX2lzX01pbGxlbm5pdW0oZG9jKSAoKGRvYyktPkNoaXBJRCA9PSBET0NfQ2hpcElEX0RvY01pbCkKKyNkZWZpbmUgRG9DX2lzXzIwMDAoZG9jKSAoKGRvYyktPkNoaXBJRCA9PSBET0NfQ2hpcElEX0RvYzJrKQorCitzdGF0aWMgdm9pZCBkb2MyMDB4X2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBkb2MyMDB4X3NlbGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCk7CisKK3N0YXRpYyBpbnQgZGVidWc9MDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKKworc3RhdGljIGludCB0cnlfZHdvcmQ9MTsKK21vZHVsZV9wYXJhbSh0cnlfZHdvcmQsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgbm9fZWNjX2ZhaWx1cmVzPTA7Cittb2R1bGVfcGFyYW0obm9fZWNjX2ZhaWx1cmVzLCBpbnQsIDApOworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCitzdGF0aWMgaW50IG5vX2F1dG9wYXJ0PTA7Cittb2R1bGVfcGFyYW0obm9fYXV0b3BhcnQsIGludCwgMCk7CisjZW5kaWYKKworI2lmZGVmIE1URF9OQU5EX0RJU0tPTkNISVBfQkJUV1JJVEUKK3N0YXRpYyBpbnQgaW5mdGxfYmJ0X3dyaXRlPTE7CisjZWxzZQorc3RhdGljIGludCBpbmZ0bF9iYnRfd3JpdGU9MDsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKGluZnRsX2JidF93cml0ZSwgaW50LCAwKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTOworbW9kdWxlX3BhcmFtKGRvY19jb25maWdfbG9jYXRpb24sIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG9jX2NvbmZpZ19sb2NhdGlvbiwgIlBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGF0IHdoaWNoIHRvIHByb2JlIGZvciBEaXNrT25DaGlwIik7CisKKworLyogU2VjdG9yIHNpemUgZm9yIEhXIEVDQyAqLworI2RlZmluZSBTRUNUT1JfU0laRSA1MTIKKy8qIFRoZSBzZWN0b3IgYnl0ZXMgYXJlIHBhY2tlZCBpbnRvIE5CX0RBVEEgMTAgYml0IHdvcmRzICovCisjZGVmaW5lIE5CX0RBVEEgKCgoU0VDVE9SX1NJWkUgKyAxKSAqIDggKyA2KSAvIDEwKQorLyogTnVtYmVyIG9mIHJvb3RzICovCisjZGVmaW5lIE5ST09UUyA0CisvKiBGaXJzdCBjb25zZWN0aXZlIHJvb3QgKi8KKyNkZWZpbmUgRkNSIDUxMAorLyogTnVtYmVyIG9mIHN5bWJvbHMgKi8KKyNkZWZpbmUgTk4gMTAyMworCisvKiB0aGUgUmVlZCBTb2xvbW9uIGNvbnRyb2wgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IHJzX2NvbnRyb2wgKnJzX2RlY29kZXI7CisKKy8qCisgKiBUaGUgSFcgZGVjb2RlciBpbiB0aGUgRG9DIEFTSUMncyBwcm92aWRlcyB1cyBhIGVycm9yIHN5bmRyb21lLAorICogd2hpY2ggd2UgbXVzdCBjb252ZXJ0IHRvIGEgc3RhbmRhcmQgc3luZHJvbSB1c2FibGUgYnkgdGhlIGdlbmVyaWMKKyAqIFJlZWQtU29sb21vbiBsaWJyYXJ5IGNvZGUuCisgKgorICogRmFicmljZSBCZWxsYXJkIGZpZ3VyZWQgdGhpcyBvdXQgaW4gdGhlIG9sZCBkb2NlY2MgY29kZS4gSSBhZGRlZAorICogc29tZSBjb21tZW50cywgaW1wcm92ZWQgYSBtaW5vciBiaXQgYW5kIGNvbnZlcnRlZCBpdCB0byBtYWtlIHVzZQorICogb2YgdGhlIGdlbmVyaWMgUmVlZC1Tb2xvbW9uIGxpYmFyeS4gdGdseAorICovCitzdGF0aWMgaW50IGRvY19lY2NfZGVjb2RlIChzdHJ1Y3QgcnNfY29udHJvbCAqcnMsIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKmVjYykKK3sKKwlpbnQgaSwgaiwgbmVyciwgZXJycG9zWzhdOworCXVpbnQ4X3QgcGFyaXR5OworCXVpbnQxNl90IGRzWzRdLCBzWzVdLCB0bXAsIGVycnZhbFs4XSwgc3luWzRdOworCisJLyogQ29udmVydCB0aGUgZWNjIGJ5dGVzIGludG8gd29yZHMgKi8KKwlkc1swXSA9ICgoZWNjWzRdICYgMHhmZikgPj4gMCkgfCAoKGVjY1s1XSAmIDB4MDMpIDw8IDgpOworCWRzWzFdID0gKChlY2NbNV0gJiAweGZjKSA+PiAyKSB8ICgoZWNjWzJdICYgMHgwZikgPDwgNik7CisJZHNbMl0gPSAoKGVjY1syXSAmIDB4ZjApID4+IDQpIHwgKChlY2NbM10gJiAweDNmKSA8PCA0KTsKKwlkc1szXSA9ICgoZWNjWzNdICYgMHhjMCkgPj4gNikgfCAoKGVjY1swXSAmIDB4ZmYpIDw8IDIpOworCXBhcml0eSA9IGVjY1sxXTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN5bmRyb20gYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IE5ST09UUzsgaSsrKQorCQlzW2ldID0gZHNbMF07CisJLyoKKwkgKiAgRXZhbHVhdGUKKwkgKiAgc1tpXSA9IGRzWzNdeF4zICsgZHNbMl14XjIgKyBkc1sxXXheMSArIGRzWzBdCisJICogIHdoZXJlIHggPSBhbHBoYV4oRkNSICsgaSkKKwkgKi8KKwlmb3IoaiA9IDE7IGogPCBOUk9PVFM7IGorKykgeworCQlpZihkc1tqXSA9PSAwKQorCQkJY29udGludWU7CisJCXRtcCA9IHJzLT5pbmRleF9vZltkc1tqXV07CisJCWZvcihpID0gMDsgaSA8IE5ST09UUzsgaSsrKQorCQkJc1tpXSBePSBycy0+YWxwaGFfdG9bcnNfbW9kbm4ocnMsIHRtcCArIChGQ1IgKyBpKSAqIGopXTsKKwl9CisKKwkvKiBDYWxjIHNbaV0gPSBzW2ldIC8gYWxwaGFeKHYgKyBpKSAqLworCWZvciAoaSA9IDA7IGkgPCBOUk9PVFM7IGkrKykgeworCQlpZiAoc3luW2ldKQorIAkJCXN5bltpXSA9IHJzX21vZG5uKHJzLCBycy0+aW5kZXhfb2Zbc1tpXV0gKyAoTk4gLSBGQ1IgLSBpKSk7CisJfQorCS8qIENhbGwgdGhlIGRlY29kZXIgbGlicmFyeSAqLworCW5lcnIgPSBkZWNvZGVfcnMxNihycywgTlVMTCwgTlVMTCwgMTAxOSwgc3luLCAwLCBlcnJwb3MsIDAsIGVycnZhbCk7CisKKwkvKiBJbmNvcnJlY3RhYmxlIGVycm9ycyA/ICovCisJaWYgKG5lcnIgPCAwKQorCQlyZXR1cm4gbmVycjsKKworCS8qCisJICogQ29ycmVjdCB0aGUgZXJyb3JzLiBUaGUgYml0cG9zaXRpb25zIGFyZSBhIGJpdCBvZiBtYWdpYywKKwkgKiBidXQgdGhleSBhcmUgZ2l2ZW4gYnkgdGhlIGRlc2lnbiBvZiB0aGUgZGUvZW5jb2RlciBjaXJjdWl0CisJICogaW4gdGhlIERvQyBBU0lDJ3MuCisJICovCisJZm9yKGkgPSAwO2kgPCBuZXJyOyBpKyspIHsKKwkJaW50IGluZGV4LCBiaXRwb3MsIHBvcyA9IDEwMTUgLSBlcnJwb3NbaV07CisJCXVpbnQ4X3QgdmFsOworCQlpZiAocG9zID49IE5CX0RBVEEgJiYgcG9zIDwgMTAxOSkKKwkJCWNvbnRpbnVlOworCQlpZiAocG9zIDwgTkJfREFUQSkgeworCQkJLyogZXh0cmFjdCBiaXQgcG9zaXRpb24gKE1TQiBmaXJzdCkgKi8KKwkJCXBvcyA9IDEwICogKE5CX0RBVEEgLSAxIC0gcG9zKSAtIDY7CisJCQkvKiBub3cgY29ycmVjdCB0aGUgZm9sbG93aW5nIDEwIGJpdHMuIEF0IG1vc3QgdHdvIGJ5dGVzCisJCQkgICBjYW4gYmUgbW9kaWZpZWQgc2luY2UgcG9zIGlzIGV2ZW4gKi8KKwkJCWluZGV4ID0gKHBvcyA+PiAzKSBeIDE7CisJCQliaXRwb3MgPSBwb3MgJiA3OworCQkJaWYgKChpbmRleCA+PSAwICYmIGluZGV4IDwgU0VDVE9SX1NJWkUpIHx8CisJCQkgICAgaW5kZXggPT0gKFNFQ1RPUl9TSVpFICsgMSkpIHsKKwkJCQl2YWwgPSAodWludDhfdCkgKGVycnZhbFtpXSA+PiAoMiArIGJpdHBvcykpOworCQkJCXBhcml0eSBePSB2YWw7CisJCQkJaWYgKGluZGV4IDwgU0VDVE9SX1NJWkUpCisJCQkJCWRhdGFbaW5kZXhdIF49IHZhbDsKKwkJCX0KKwkJCWluZGV4ID0gKChwb3MgPj4gMykgKyAxKSBeIDE7CisJCQliaXRwb3MgPSAoYml0cG9zICsgMTApICYgNzsKKwkJCWlmIChiaXRwb3MgPT0gMCkKKwkJCQliaXRwb3MgPSA4OworCQkJaWYgKChpbmRleCA+PSAwICYmIGluZGV4IDwgU0VDVE9SX1NJWkUpIHx8CisJCQkgICAgaW5kZXggPT0gKFNFQ1RPUl9TSVpFICsgMSkpIHsKKwkJCQl2YWwgPSAodWludDhfdCkoZXJydmFsW2ldIDw8ICg4IC0gYml0cG9zKSk7CisJCQkJcGFyaXR5IF49IHZhbDsKKwkJCQlpZiAoaW5kZXggPCBTRUNUT1JfU0laRSkKKwkJCQkJZGF0YVtpbmRleF0gXj0gdmFsOworCQkJfQorCQl9CisJfQorCS8qIElmIHRoZSBwYXJpdHkgaXMgd3JvbmcsIG5vIHJlc2N1ZSBwb3NzaWJsZSAqLworCXJldHVybiBwYXJpdHkgPyAtMSA6IG5lcnI7Cit9CisKK3N0YXRpYyB2b2lkIERvQ19EZWxheShzdHJ1Y3QgZG9jX3ByaXYgKmRvYywgdW5zaWduZWQgc2hvcnQgY3ljbGVzKQoreworCXZvbGF0aWxlIGNoYXIgZHVtbXk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3ljbGVzOyBpKyspIHsKKwkJaWYgKERvQ19pc19NaWxsZW5uaXVtKGRvYykpCisJCQlkdW1teSA9IFJlYWRET0MoZG9jLT52aXJ0YWRyLCBOT1ApOworCQllbHNlIGlmIChEb0NfaXNfTWlsbGVubml1bVBsdXMoZG9jKSkKKwkJCWR1bW15ID0gUmVhZERPQyhkb2MtPnZpcnRhZHIsIE1wbHVzX05PUCk7CisJCWVsc2UKKwkJCWR1bW15ID0gUmVhZERPQyhkb2MtPnZpcnRhZHIsIERPQ1N0YXR1cyk7CisJfQorCit9CisKKyNkZWZpbmUgQ0RTTl9DVFJMX0ZSX0JfTUFTSwkoQ0RTTl9DVFJMX0ZSX0IwIHwgQ0RTTl9DVFJMX0ZSX0IxKQorCisvKiBET0NfV2FpdFJlYWR5OiBXYWl0IGZvciBSRFkgbGluZSB0byBiZSBhc3NlcnRlZCBieSB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBfRG9DX1dhaXRSZWFkeShzdHJ1Y3QgZG9jX3ByaXYgKmRvYykKK3sKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIChIWiAqIDEwKTsKKworCWlmKGRlYnVnKSBwcmludGsoIl9Eb0NfV2FpdFJlYWR5Li4uXG4iKTsKKwkvKiBPdXQtb2YtbGluZSByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaXAgcmVzcG9uc2UgKi8KKwlpZiAoRG9DX2lzX01pbGxlbm5pdW1QbHVzKGRvYykpIHsKKwkJd2hpbGUgKChSZWFkRE9DKGRvY3B0ciwgTXBsdXNfRmxhc2hDb250cm9sKSAmIENEU05fQ1RSTF9GUl9CX01BU0spICE9IENEU05fQ1RSTF9GUl9CX01BU0spIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgeworCQkJCXByaW50aygiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICghKFJlYWRET0MoZG9jcHRyLCBDRFNOQ29udHJvbCkgJiBDRFNOX0NUUkxfRlJfQikpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgeworCQkJCXByaW50aygiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBEb0NfV2FpdFJlYWR5KHN0cnVjdCBkb2NfcHJpdiAqZG9jKQoreworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCWludCByZXQgPSAwOworCisJaWYgKERvQ19pc19NaWxsZW5uaXVtUGx1cyhkb2MpKSB7CisJCURvQ19EZWxheShkb2MsIDQpOworCisJCWlmICgoUmVhZERPQyhkb2NwdHIsIE1wbHVzX0ZsYXNoQ29udHJvbCkgJiBDRFNOX0NUUkxfRlJfQl9NQVNLKSAhPSBDRFNOX0NUUkxfRlJfQl9NQVNLKQorCQkJLyogQ2FsbCB0aGUgb3V0LW9mLWxpbmUgcm91dGluZSB0byB3YWl0ICovCisJCQlyZXQgPSBfRG9DX1dhaXRSZWFkeShkb2MpOworCX0gZWxzZSB7CisJCURvQ19EZWxheShkb2MsIDQpOworCisJCWlmICghKFJlYWRET0MoZG9jcHRyLCBDRFNOQ29udHJvbCkgJiBDRFNOX0NUUkxfRlJfQikpCisJCQkvKiBDYWxsIHRoZSBvdXQtb2YtbGluZSByb3V0aW5lIHRvIHdhaXQgKi8KKwkJCXJldCA9IF9Eb0NfV2FpdFJlYWR5KGRvYyk7CisJCURvQ19EZWxheShkb2MsIDIpOworCX0KKworCWlmKGRlYnVnKSBwcmludGsoIkRvQ19XYWl0UmVhZHkgT0tcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRvYzIwMDBfd3JpdGVfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyIGRhdHVtKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJaWYoZGVidWcpcHJpbnRrKCJ3cml0ZV9ieXRlICUwMnhcbiIsIGRhdHVtKTsKKwlXcml0ZURPQyhkYXR1bSwgZG9jcHRyLCBDRFNOU2xvd0lPKTsKKwlXcml0ZURPQyhkYXR1bSwgZG9jcHRyLCAya19DRFNOX0lPKTsKK30KKworc3RhdGljIHVfY2hhciBkb2MyMDAwX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwl1X2NoYXIgcmV0OworCisJUmVhZERPQyhkb2NwdHIsIENEU05TbG93SU8pOworCURvQ19EZWxheShkb2MsIDIpOworCXJldCA9IFJlYWRET0MoZG9jcHRyLCAya19DRFNOX0lPKTsKKwlpZiAoZGVidWcpIHByaW50aygicmVhZF9ieXRlIHJldHVybnMgJTAyeFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkb2MyMDAwX3dyaXRlYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJICAgICBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwlpbnQgaTsKKwlpZiAoZGVidWcpcHJpbnRrKCJ3cml0ZWJ1ZiBvZiAlZCBieXRlczogIiwgbGVuKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCVdyaXRlRE9DXyhidWZbaV0sIGRvY3B0ciwgRG9DXzJrX0NEU05fSU8gKyBpKTsKKwkJaWYgKGRlYnVnICYmIGkgPCAxNikKKwkJCXByaW50aygiJTAyeCAiLCBidWZbaV0pOworCX0KKwlpZiAoZGVidWcpIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZG9jMjAwMF9yZWFkYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJICAgIHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworIAlpbnQgaTsKKworCWlmIChkZWJ1ZylwcmludGsoInJlYWRidWYgb2YgJWQgYnl0ZXM6ICIsIGxlbik7CisKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWJ1ZltpXSA9IFJlYWRET0MoZG9jcHRyLCAya19DRFNOX0lPICsgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb2MyMDAwX3JlYWRidWZfZHdvcmQoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisgCWludCBpOworCisJaWYgKGRlYnVnKSBwcmludGsoInJlYWRidWZfZHdvcmQgb2YgJWQgYnl0ZXM6ICIsIGxlbik7CisKKwlpZiAodW5saWtlbHkoKCgodW5zaWduZWQgbG9uZylidWYpfGxlbikgJiAzKSkgeworCQlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCQkqKHVpbnQ4X3QgKikoJmJ1ZltpXSkgPSBSZWFkRE9DKGRvY3B0ciwgMmtfQ0RTTl9JTyArIGkpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7IGkgPCBsZW47IGkrPTQpIHsKKwkJCSoodWludDMyX3QqKSgmYnVmW2ldKSA9IHJlYWRsKGRvY3B0ciArIERvQ18ya19DRFNOX0lPICsgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9jMjAwMF92ZXJpZnlidWYoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgICBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspCisJCWlmIChidWZbaV0gIT0gUmVhZERPQyhkb2NwdHIsIDJrX0NEU05fSU8pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBfX2luaXQgZG9jMjAweF9pZGVudF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbnIpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdWludDE2X3QgcmV0OworCisJZG9jMjAweF9zZWxlY3RfY2hpcChtdGQsIG5yKTsKKwlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CisJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIE5BTkRfQ01EX1JFQURJRCk7CisJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOworCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQUxFKTsKKwl0aGlzLT53cml0ZV9ieXRlKG10ZCwgMCk7CisJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOworCisJcmV0ID0gdGhpcy0+cmVhZF9ieXRlKG10ZCkgPDwgODsKKwlyZXQgfD0gdGhpcy0+cmVhZF9ieXRlKG10ZCk7CisKKwlpZiAoZG9jLT5DaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2MyayAmJiB0cnlfZHdvcmQgJiYgIW5yKSB7CisJCS8qIEZpcnN0IGNoaXAgcHJvYmUuIFNlZSBpZiB3ZSBnZXQgc2FtZSByZXN1bHRzIGJ5IDMyLWJpdCBhY2Nlc3MgKi8KKwkJdW5pb24geworCQkJdWludDMyX3QgZHdvcmQ7CisJCQl1aW50OF90IGJ5dGVbNF07CisJCX0gaWRlbnQ7CisJCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQ0xFKTsKKwkJZG9jMjAwMF93cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfUkVBRElEKTsKKwkJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOworCQlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVEFMRSk7CisJCWRvYzIwMDBfd3JpdGVfYnl0ZShtdGQsIDApOworCQlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkFMRSk7CisKKwkJaWRlbnQuZHdvcmQgPSByZWFkbChkb2NwdHIgKyBEb0NfMmtfQ0RTTl9JTyk7CisJCWlmICgoKGlkZW50LmJ5dGVbMF0gPDwgOCkgfCBpZGVudC5ieXRlWzFdKSA9PSByZXQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRpc2tPbkNoaXAgMjAwMCByZXNwb25kcyB0byBEV09SRCBhY2Nlc3NcbiIpOworCQkJdGhpcy0+cmVhZF9idWYgPSAmZG9jMjAwMF9yZWFkYnVmX2R3b3JkOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRvYzIwMDBfY291bnRfY2hpcHMoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdWludDE2X3QgbWZyaWQ7CisJaW50IGk7CisKKwkvKiBNYXggNCBjaGlwcyBwZXIgZmxvb3Igb24gRGlza09uQ2hpcCAyMDAwICovCisJZG9jLT5jaGlwc19wZXJfZmxvb3IgPSA0OworCisJLyogRmluZCBvdXQgd2hhdCB0aGUgZmlyc3QgY2hpcCBpcyAqLworCW1mcmlkID0gZG9jMjAweF9pZGVudF9jaGlwKG10ZCwgMCk7CisKKwkvKiBGaW5kIGhvdyBtYW55IGNoaXBzIGluIGVhY2ggZmxvb3IuICovCisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlpZiAoZG9jMjAweF9pZGVudF9jaGlwKG10ZCwgaSkgIT0gbWZyaWQpCisJCQlicmVhazsKKwl9CisJZG9jLT5jaGlwc19wZXJfZmxvb3IgPSBpOworCXByaW50ayhLRVJOX0RFQlVHICJEZXRlY3RlZCAlZCBjaGlwcyBwZXIgZmxvb3IuXG4iLCBpKTsKK30KKworc3RhdGljIGludCBkb2MyMDB4X3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisKKwlpbnQgc3RhdHVzOworCisJRG9DX1dhaXRSZWFkeShkb2MpOworCXRoaXMtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9TVEFUVVMsIC0xLCAtMSk7CisJRG9DX1dhaXRSZWFkeShkb2MpOworCXN0YXR1cyA9IChpbnQpdGhpcy0+cmVhZF9ieXRlKG10ZCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBkb2MyMDAxX3dyaXRlX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciBkYXR1bSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKworCVdyaXRlRE9DKGRhdHVtLCBkb2NwdHIsIENEU05TbG93SU8pOworCVdyaXRlRE9DKGRhdHVtLCBkb2NwdHIsIE1pbF9DRFNOX0lPKTsKKwlXcml0ZURPQyhkYXR1bSwgZG9jcHRyLCBXcml0ZVBpcGVUZXJtKTsKK30KKworc3RhdGljIHVfY2hhciBkb2MyMDAxX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKworCS8qUmVhZERPQyhkb2NwdHIsIENEU05TbG93SU8pOyAqLworCS8qIDExLjQuNSAtLSBkZWxheSB0d2ljZSB0byBhbGxvdyBleHRlbmRlZCBsZW5ndGggY3ljbGUgKi8KKwlEb0NfRGVsYXkoZG9jLCAyKTsKKwlSZWFkRE9DKGRvY3B0ciwgUmVhZFBpcGVJbml0KTsKKwkvKnJldHVybiBSZWFkRE9DKGRvY3B0ciwgTWlsX0NEU05fSU8pOyAqLworCXJldHVybiBSZWFkRE9DKGRvY3B0ciwgTGFzdERhdGFSZWFkKTsKK30KKworc3RhdGljIHZvaWQgZG9jMjAwMV93cml0ZWJ1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCSAgICAgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKQorCQlXcml0ZURPQ18oYnVmW2ldLCBkb2NwdHIsIERvQ19NaWxfQ0RTTl9JTyArIGkpOworCS8qIFRlcm1pbmF0ZSB3cml0ZSBwaXBlbGluZSAqLworCVdyaXRlRE9DKDB4MDAsIGRvY3B0ciwgV3JpdGVQaXBlVGVybSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvYzIwMDFfcmVhZGJ1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCSAgICB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwlpbnQgaTsKKworCS8qIFN0YXJ0IHJlYWQgcGlwZWxpbmUgKi8KKwlSZWFkRE9DKGRvY3B0ciwgUmVhZFBpcGVJbml0KTsKKworCWZvciAoaT0wOyBpIDwgbGVuLTE7IGkrKykKKwkJYnVmW2ldID0gUmVhZERPQyhkb2NwdHIsIE1pbF9DRFNOX0lPICsgKGkgJiAweGZmKSk7CisKKwkvKiBUZXJtaW5hdGUgcmVhZCBwaXBlbGluZSAqLworCWJ1ZltpXSA9IFJlYWRET0MoZG9jcHRyLCBMYXN0RGF0YVJlYWQpOworfQorCitzdGF0aWMgaW50IGRvYzIwMDFfdmVyaWZ5YnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJICAgICBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKKwlpbnQgaTsKKworCS8qIFN0YXJ0IHJlYWQgcGlwZWxpbmUgKi8KKwlSZWFkRE9DKGRvY3B0ciwgUmVhZFBpcGVJbml0KTsKKworCWZvciAoaT0wOyBpIDwgbGVuLTE7IGkrKykKKwkJaWYgKGJ1ZltpXSAhPSBSZWFkRE9DKGRvY3B0ciwgTWlsX0NEU05fSU8pKSB7CisJCQlSZWFkRE9DKGRvY3B0ciwgTGFzdERhdGFSZWFkKTsKKwkJCXJldHVybiBpOworCQl9CisJaWYgKGJ1ZltpXSAhPSBSZWFkRE9DKGRvY3B0ciwgTGFzdERhdGFSZWFkKSkKKwkJcmV0dXJuIGk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1X2NoYXIgZG9jMjAwMXBsdXNfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCXVfY2hhciByZXQ7CisKKwlSZWFkRE9DKGRvY3B0ciwgTXBsdXNfUmVhZFBpcGVJbml0KTsKKwlSZWFkRE9DKGRvY3B0ciwgTXBsdXNfUmVhZFBpcGVJbml0KTsKKwlyZXQgPSBSZWFkRE9DKGRvY3B0ciwgTXBsdXNfTGFzdERhdGFSZWFkKTsKKwlpZiAoZGVidWcpIHByaW50aygicmVhZF9ieXRlIHJldHVybnMgJTAyeFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkb2MyMDAxcGx1c193cml0ZWJ1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCSAgICAgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisJaW50IGk7CisKKwlpZiAoZGVidWcpcHJpbnRrKCJ3cml0ZWJ1ZiBvZiAlZCBieXRlczogIiwgbGVuKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCVdyaXRlRE9DXyhidWZbaV0sIGRvY3B0ciwgRG9DX01pbF9DRFNOX0lPICsgaSk7CisJCWlmIChkZWJ1ZyAmJiBpIDwgMTYpCisJCQlwcmludGsoIiUwMnggIiwgYnVmW2ldKTsKKwl9CisJaWYgKGRlYnVnKSBwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRvYzIwMDFwbHVzX3JlYWRidWYoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisJaW50IGk7CisKKwlpZiAoZGVidWcpcHJpbnRrKCJyZWFkYnVmIG9mICVkIGJ5dGVzOiAiLCBsZW4pOworCisJLyogU3RhcnQgcmVhZCBwaXBlbGluZSAqLworCVJlYWRET0MoZG9jcHRyLCBNcGx1c19SZWFkUGlwZUluaXQpOworCVJlYWRET0MoZG9jcHRyLCBNcGx1c19SZWFkUGlwZUluaXQpOworCisJZm9yIChpPTA7IGkgPCBsZW4tMjsgaSsrKSB7CisJCWJ1ZltpXSA9IFJlYWRET0MoZG9jcHRyLCBNaWxfQ0RTTl9JTyk7CisJCWlmIChkZWJ1ZyAmJiBpIDwgMTYpCisJCQlwcmludGsoIiUwMnggIiwgYnVmW2ldKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgcmVhZCBwaXBlbGluZSAqLworCWJ1ZltsZW4tMl0gPSBSZWFkRE9DKGRvY3B0ciwgTXBsdXNfTGFzdERhdGFSZWFkKTsKKwlpZiAoZGVidWcgJiYgaSA8IDE2KQorCQlwcmludGsoIiUwMnggIiwgYnVmW2xlbi0yXSk7CisJYnVmW2xlbi0xXSA9IFJlYWRET0MoZG9jcHRyLCBNcGx1c19MYXN0RGF0YVJlYWQpOworCWlmIChkZWJ1ZyAmJiBpIDwgMTYpCisJCXByaW50aygiJTAyeCAiLCBidWZbbGVuLTFdKTsKKwlpZiAoZGVidWcpIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIGludCBkb2MyMDAxcGx1c192ZXJpZnlidWYoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCWludCBpOworCisJaWYgKGRlYnVnKXByaW50aygidmVyaWZ5YnVmIG9mICVkIGJ5dGVzOiAiLCBsZW4pOworCisJLyogU3RhcnQgcmVhZCBwaXBlbGluZSAqLworCVJlYWRET0MoZG9jcHRyLCBNcGx1c19SZWFkUGlwZUluaXQpOworCVJlYWRET0MoZG9jcHRyLCBNcGx1c19SZWFkUGlwZUluaXQpOworCisJZm9yIChpPTA7IGkgPCBsZW4tMjsgaSsrKQorCQlpZiAoYnVmW2ldICE9IFJlYWRET0MoZG9jcHRyLCBNaWxfQ0RTTl9JTykpIHsKKwkJCVJlYWRET0MoZG9jcHRyLCBNcGx1c19MYXN0RGF0YVJlYWQpOworCQkJUmVhZERPQyhkb2NwdHIsIE1wbHVzX0xhc3REYXRhUmVhZCk7CisJCQlyZXR1cm4gaTsKKwkJfQorCWlmIChidWZbbGVuLTJdICE9IFJlYWRET0MoZG9jcHRyLCBNcGx1c19MYXN0RGF0YVJlYWQpKQorCQlyZXR1cm4gbGVuLTI7CisJaWYgKGJ1ZltsZW4tMV0gIT0gUmVhZERPQyhkb2NwdHIsIE1wbHVzX0xhc3REYXRhUmVhZCkpCisJCXJldHVybiBsZW4tMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG9jMjAwMXBsdXNfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCWludCBmbG9vciA9IDA7CisKKwlpZihkZWJ1ZylwcmludGsoInNlbGVjdCBjaGlwICglZClcbiIsIGNoaXApOworCisJaWYgKGNoaXAgPT0gLTEpIHsKKwkJLyogRGlzYWJsZSBmbGFzaCBpbnRlcm5hbGx5ICovCisJCVdyaXRlRE9DKDAsIGRvY3B0ciwgTXBsdXNfRmxhc2hTZWxlY3QpOworCQlyZXR1cm47CisJfQorCisJZmxvb3IgPSBjaGlwIC8gZG9jLT5jaGlwc19wZXJfZmxvb3I7CisJY2hpcCAtPSAoZmxvb3IgKiAgZG9jLT5jaGlwc19wZXJfZmxvb3IpOworCisJLyogQXNzZXJ0IENoaXBFbmFibGUgYW5kIGRlYXNzZXJ0IFdyaXRlUHJvdGVjdCAqLworCVdyaXRlRE9DKChET0NfRkxBU0hfQ0UpLCBkb2NwdHIsIE1wbHVzX0ZsYXNoU2VsZWN0KTsKKwl0aGlzLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIC0xLCAtMSk7CisKKwlkb2MtPmN1cmNoaXAgPSBjaGlwOworCWRvYy0+Y3VyZmxvb3IgPSBmbG9vcjsKK30KKworc3RhdGljIHZvaWQgZG9jMjAweF9zZWxlY3RfY2hpcChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNoaXApCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisJaW50IGZsb29yID0gMDsKKworCWlmKGRlYnVnKXByaW50aygic2VsZWN0IGNoaXAgKCVkKVxuIiwgY2hpcCk7CisKKwlpZiAoY2hpcCA9PSAtMSkKKwkJcmV0dXJuOworCisJZmxvb3IgPSBjaGlwIC8gZG9jLT5jaGlwc19wZXJfZmxvb3I7CisJY2hpcCAtPSAoZmxvb3IgKiAgZG9jLT5jaGlwc19wZXJfZmxvb3IpOworCisJLyogMTEuNC40IC0tIGRlYXNzZXJ0IENFIGJlZm9yZSBjaGFuZ2luZyBjaGlwICovCisJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJOQ0UpOworCisJV3JpdGVET0MoZmxvb3IsIGRvY3B0ciwgRmxvb3JTZWxlY3QpOworCVdyaXRlRE9DKGNoaXAsIGRvY3B0ciwgQ0RTTkRldmljZVNlbGVjdCk7CisKKwlkb2MyMDB4X2h3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVE5DRSk7CisKKwlkb2MtPmN1cmNoaXAgPSBjaGlwOworCWRvYy0+Y3VyZmxvb3IgPSBmbG9vcjsKK30KKworc3RhdGljIHZvaWQgZG9jMjAweF9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBOQU5EX0NUTF9TRVROQ0U6CisJCWRvYy0+Q0RTTkNvbnRyb2wgfD0gQ0RTTl9DVFJMX0NFOworCQlicmVhazsKKwljYXNlIE5BTkRfQ1RMX0NMUk5DRToKKwkJZG9jLT5DRFNOQ29udHJvbCAmPSB+Q0RTTl9DVFJMX0NFOworCQlicmVhazsKKwljYXNlIE5BTkRfQ1RMX1NFVENMRToKKwkJZG9jLT5DRFNOQ29udHJvbCB8PSBDRFNOX0NUUkxfQ0xFOworCQlicmVhazsKKwljYXNlIE5BTkRfQ1RMX0NMUkNMRToKKwkJZG9jLT5DRFNOQ29udHJvbCAmPSB+Q0RTTl9DVFJMX0NMRTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CisJCWRvYy0+Q0RTTkNvbnRyb2wgfD0gQ0RTTl9DVFJMX0FMRTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NUTF9DTFJBTEU6CisJCWRvYy0+Q0RTTkNvbnRyb2wgJj0gfkNEU05fQ1RSTF9BTEU7CisJCWJyZWFrOworCWNhc2UgTkFORF9DVExfU0VUV1A6CisJCWRvYy0+Q0RTTkNvbnRyb2wgfD0gQ0RTTl9DVFJMX1dQOworCQlicmVhazsKKwljYXNlIE5BTkRfQ1RMX0NMUldQOgorCQlkb2MtPkNEU05Db250cm9sICY9IH5DRFNOX0NUUkxfV1A7CisJCWJyZWFrOworCX0KKwlpZiAoZGVidWcpcHJpbnRrKCJod2NvbnRyb2woJWQpOiAlMDJ4XG4iLCBjbWQsIGRvYy0+Q0RTTkNvbnRyb2wpOworCVdyaXRlRE9DKGRvYy0+Q0RTTkNvbnRyb2wsIGRvY3B0ciwgQ0RTTkNvbnRyb2wpOworCS8qIDExLjQuMyAtLSA0IE5PUHMgYWZ0ZXIgQ1NETkNvbnRyb2wgd3JpdGUgKi8KKwlEb0NfRGVsYXkoZG9jLCA0KTsKK30KKworc3RhdGljIHZvaWQgZG9jMjAwMXBsdXNfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwkvKgorCSAqIE11c3QgdGVybWluYXRlIHdyaXRlIHBpcGVsaW5lIGJlZm9yZSBzZW5kaW5nIGFueSBjb21tYW5kcworCSAqIHRvIHRoZSBkZXZpY2UuCisJICovCisJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfUEFHRVBST0cpIHsKKwkJV3JpdGVET0MoMHgwMCwgZG9jcHRyLCBNcGx1c19Xcml0ZVBpcGVUZXJtKTsKKwkJV3JpdGVET0MoMHgwMCwgZG9jcHRyLCBNcGx1c19Xcml0ZVBpcGVUZXJtKTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLgorCSAqLworCWlmIChjb21tYW5kID09IE5BTkRfQ01EX1NFUUlOKSB7CisJCWludCByZWFkY21kOworCisJCWlmIChjb2x1bW4gPj0gbXRkLT5vb2JibG9jaykgeworCQkJLyogT09CIGFyZWEgKi8KKwkJCWNvbHVtbiAtPSBtdGQtPm9vYmJsb2NrOworCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQURPT0I7CisJCX0gZWxzZSBpZiAoY29sdW1uIDwgMjU2KSB7CisJCQkvKiBGaXJzdCAyNTYgYnl0ZXMgLS0+IFJFQUQwICovCisJCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDA7CisJCX0gZWxzZSB7CisJCQljb2x1bW4gLT0gMjU2OworCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQUQxOworCQl9CisJCVdyaXRlRE9DKHJlYWRjbWQsIGRvY3B0ciwgTXBsdXNfRmxhc2hDbWQpOworCX0KKwlXcml0ZURPQyhjb21tYW5kLCBkb2NwdHIsIE1wbHVzX0ZsYXNoQ21kKTsKKwlXcml0ZURPQygwLCBkb2NwdHIsIE1wbHVzX1dyaXRlUGlwZVRlcm0pOworCVdyaXRlRE9DKDAsIGRvY3B0ciwgTXBsdXNfV3JpdGVQaXBlVGVybSk7CisKKwlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgeworCQkvKiBTZXJpYWxseSBpbnB1dCBhZGRyZXNzICovCisJCWlmIChjb2x1bW4gIT0gLTEpIHsKKwkJCS8qIEFkanVzdCBjb2x1bW5zIGZvciAxNiBiaXQgYnVzd2lkdGggKi8KKwkJCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikKKwkJCQljb2x1bW4gPj49IDE7CisJCQlXcml0ZURPQyhjb2x1bW4sIGRvY3B0ciwgTXBsdXNfRmxhc2hBZGRyZXNzKTsKKwkJfQorCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7CisJCQlXcml0ZURPQygodW5zaWduZWQgY2hhcikgKHBhZ2VfYWRkciAmIDB4ZmYpLCBkb2NwdHIsIE1wbHVzX0ZsYXNoQWRkcmVzcyk7CisJCQlXcml0ZURPQygodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gOCkgJiAweGZmKSwgZG9jcHRyLCBNcGx1c19GbGFzaEFkZHJlc3MpOworCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgaGlnaGVyIGRlbnNpdHkgZGV2aWNlcyAqLworCQkJaWYgKHRoaXMtPmNoaXBzaXplICYgMHgwYzAwMDAwMCkgeworCQkJCVdyaXRlRE9DKCh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiAxNikgJiAweDBmKSwgZG9jcHRyLCBNcGx1c19GbGFzaEFkZHJlc3MpOworCQkJCXByaW50aygiaGlnaCBkZW5zaXR5XG4iKTsKKwkJCX0KKwkJfQorCQlXcml0ZURPQygwLCBkb2NwdHIsIE1wbHVzX1dyaXRlUGlwZVRlcm0pOworCQlXcml0ZURPQygwLCBkb2NwdHIsIE1wbHVzX1dyaXRlUGlwZVRlcm0pOworCQkvKiBkZWFzc2VydCBBTEUgKi8KKwkJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfUkVBRDAgfHwgY29tbWFuZCA9PSBOQU5EX0NNRF9SRUFEMSB8fCBjb21tYW5kID09IE5BTkRfQ01EX1JFQURPT0IgfHwgY29tbWFuZCA9PSBOQU5EX0NNRF9SRUFESUQpCisJCQlXcml0ZURPQygwLCBkb2NwdHIsIE1wbHVzX0ZsYXNoQ29udHJvbCk7CisJfQorCisJLyoKKwkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzCisJICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5CisJKi8KKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKworCWNhc2UgTkFORF9DTURfUEFHRVBST0c6CisJY2FzZSBOQU5EX0NNRF9FUkFTRTE6CisJY2FzZSBOQU5EX0NNRF9FUkFTRTI6CisJY2FzZSBOQU5EX0NNRF9TRVFJTjoKKwljYXNlIE5BTkRfQ01EX1NUQVRVUzoKKwkJcmV0dXJuOworCisJY2FzZSBOQU5EX0NNRF9SRVNFVDoKKwkJaWYgKHRoaXMtPmRldl9yZWFkeSkKKwkJCWJyZWFrOworCQl1ZGVsYXkodGhpcy0+Y2hpcF9kZWxheSk7CisJCVdyaXRlRE9DKE5BTkRfQ01EX1NUQVRVUywgZG9jcHRyLCBNcGx1c19GbGFzaENtZCk7CisJCVdyaXRlRE9DKDAsIGRvY3B0ciwgTXBsdXNfV3JpdGVQaXBlVGVybSk7CisJCVdyaXRlRE9DKDAsIGRvY3B0ciwgTXBsdXNfV3JpdGVQaXBlVGVybSk7CisJCXdoaWxlICggISh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIDB4NDApKTsKKwkJcmV0dXJuOworCisJLyogVGhpcyBhcHBsaWVzIHRvIHJlYWQgY29tbWFuZHMgKi8KKwlkZWZhdWx0OgorCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgorCQkgKiBjb21tYW5kIGRlbGF5CisJCSovCisJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSB7CisJCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KKwkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KKwluZGVsYXkgKDEwMCk7CisJLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLworCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworfQorCitzdGF0aWMgaW50IGRvYzIwMHhfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJaWYgKERvQ19pc19NaWxsZW5uaXVtUGx1cyhkb2MpKSB7CisJCS8qIDExLjQuMiAtLSBtdXN0IE5PUCBmb3VyIHRpbWVzIGJlZm9yZSBjaGVja2luZyBGUi9CIyAqLworCQlEb0NfRGVsYXkoZG9jLCA0KTsKKwkJaWYgKChSZWFkRE9DKGRvY3B0ciwgTXBsdXNfRmxhc2hDb250cm9sKSAmIENEU05fQ1RSTF9GUl9CX01BU0spICE9IENEU05fQ1RSTF9GUl9CX01BU0spIHsKKwkJCWlmKGRlYnVnKQorCQkJCXByaW50aygibm90IHJlYWR5XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChkZWJ1ZylwcmludGsoIndhcyByZWFkeVxuIik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qIDExLjQuMiAtLSBtdXN0IE5PUCBmb3VyIHRpbWVzIGJlZm9yZSBjaGVja2luZyBGUi9CIyAqLworCQlEb0NfRGVsYXkoZG9jLCA0KTsKKwkJaWYgKCEoUmVhZERPQyhkb2NwdHIsIENEU05Db250cm9sKSAmIENEU05fQ1RSTF9GUl9CKSkgeworCQkJaWYoZGVidWcpCisJCQkJcHJpbnRrKCJub3QgcmVhZHlcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogMTEuNC4yIC0tIE11c3QgTk9QIHR3aWNlIGlmIGl0J3MgcmVhZHkgKi8KKwkJRG9DX0RlbGF5KGRvYywgMik7CisJCWlmIChkZWJ1ZylwcmludGsoIndhcyByZWFkeVxuIik7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGludCBkb2MyMDB4X2Jsb2NrX2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgaW50IGdldGNoaXApCit7CisJLyogVGhpcyBpcyBvdXIgbGFzdCByZXNvcnQgaWYgd2UgY291bGRuJ3QgZmluZCBvciBjcmVhdGUgYSBCQlQuICBKdXN0CisJICAgcHJldGVuZCBhbGwgYmxvY2tzIGFyZSBnb29kLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb2MyMDB4X2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisKKwkvKiBQcmltZSB0aGUgRUNDIGVuZ2luZSAqLworCXN3aXRjaChtb2RlKSB7CisJY2FzZSBOQU5EX0VDQ19SRUFEOgorCQlXcml0ZURPQyhET0NfRUNDX1JFU0VULCBkb2NwdHIsIEVDQ0NvbmYpOworCQlXcml0ZURPQyhET0NfRUNDX0VOLCBkb2NwdHIsIEVDQ0NvbmYpOworCQlicmVhazsKKwljYXNlIE5BTkRfRUNDX1dSSVRFOgorCQlXcml0ZURPQyhET0NfRUNDX1JFU0VULCBkb2NwdHIsIEVDQ0NvbmYpOworCQlXcml0ZURPQyhET0NfRUNDX0VOIHwgRE9DX0VDQ19SVywgZG9jcHRyLCBFQ0NDb25mKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb2MyMDAxcGx1c19lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCisJLyogUHJpbWUgdGhlIEVDQyBlbmdpbmUgKi8KKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgTkFORF9FQ0NfUkVBRDoKKwkJV3JpdGVET0MoRE9DX0VDQ19SRVNFVCwgZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKKwkJV3JpdGVET0MoRE9DX0VDQ19FTiwgZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0VDQ19XUklURToKKwkJV3JpdGVET0MoRE9DX0VDQ19SRVNFVCwgZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKKwkJV3JpdGVET0MoRE9DX0VDQ19FTiB8IERPQ19FQ0NfUlcsIGRvY3B0ciwgTXBsdXNfRUNDQ29uZik7CisJCWJyZWFrOworCX0KK30KKworLyogVGhpcyBjb2RlIGlzIG9ubHkgY2FsbGVkIG9uIHdyaXRlICovCitzdGF0aWMgaW50IGRvYzIwMHhfY2FsY3VsYXRlX2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpkYXQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKmVjY19jb2RlKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOworCWludCBpOworCWludCBlbXB0eW1hdGNoID0gMTsKKworCS8qIGZsdXNoIHRoZSBwaXBlbGluZSAqLworCWlmIChEb0NfaXNfMjAwMChkb2MpKSB7CisJCVdyaXRlRE9DKGRvYy0+Q0RTTkNvbnRyb2wgJiB+Q0RTTl9DVFJMX0ZMQVNIX0lPLCBkb2NwdHIsIENEU05Db250cm9sKTsKKwkJV3JpdGVET0MoMCwgZG9jcHRyLCAya19DRFNOX0lPKTsKKwkJV3JpdGVET0MoMCwgZG9jcHRyLCAya19DRFNOX0lPKTsKKwkJV3JpdGVET0MoMCwgZG9jcHRyLCAya19DRFNOX0lPKTsKKwkJV3JpdGVET0MoZG9jLT5DRFNOQ29udHJvbCwgZG9jcHRyLCBDRFNOQ29udHJvbCk7CisJfSBlbHNlIGlmIChEb0NfaXNfTWlsbGVubml1bVBsdXMoZG9jKSkgeworCQlXcml0ZURPQygwLCBkb2NwdHIsIE1wbHVzX05PUCk7CisJCVdyaXRlRE9DKDAsIGRvY3B0ciwgTXBsdXNfTk9QKTsKKwkJV3JpdGVET0MoMCwgZG9jcHRyLCBNcGx1c19OT1ApOworCX0gZWxzZSB7CisJCVdyaXRlRE9DKDAsIGRvY3B0ciwgTk9QKTsKKwkJV3JpdGVET0MoMCwgZG9jcHRyLCBOT1ApOworCQlXcml0ZURPQygwLCBkb2NwdHIsIE5PUCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoRG9DX2lzX01pbGxlbm5pdW1QbHVzKGRvYykpCisJCQllY2NfY29kZVtpXSA9IFJlYWRET0NfKGRvY3B0ciwgRG9DX01wbHVzX0VDQ1N5bmRyb21lMCArIGkpOworCQllbHNlCisJCQllY2NfY29kZVtpXSA9IFJlYWRET0NfKGRvY3B0ciwgRG9DX0VDQ1N5bmRyb21lMCArIGkpOworCQlpZiAoZWNjX2NvZGVbaV0gIT0gZW1wdHlfd3JpdGVfZWNjW2ldKQorCQkJZW1wdHltYXRjaCA9IDA7CisJfQorCWlmIChEb0NfaXNfTWlsbGVubml1bVBsdXMoZG9jKSkKKwkJV3JpdGVET0MoRE9DX0VDQ19ESVMsIGRvY3B0ciwgTXBsdXNfRUNDQ29uZik7CisJZWxzZQorCQlXcml0ZURPQyhET0NfRUNDX0RJUywgZG9jcHRyLCBFQ0NDb25mKTsKKyNpZiAwCisJLyogSWYgZW1wdHltYXRjaD0xLCB3ZSBtaWdodCBoYXZlIGFuIGFsbC0weGZmIGRhdGEgYnVmZmVyLiAgQ2hlY2suICovCisJaWYgKGVtcHR5bWF0Y2gpIHsKKwkJLyogTm90ZTogdGhpcyBzb21ld2hhdCBleHBlbnNpdmUgdGVzdCBzaG91bGQgbm90IGJlIHRyaWdnZXJlZAorCQkgICBvZnRlbi4gIEl0IGNvdWxkIGJlIG9wdGltaXplZCBhd2F5IGJ5IGV4YW1pbmluZyB0aGUgZGF0YSBpbgorCQkgICB0aGUgd3JpdGVidWYgcm91dGluZSwgYW5kIHJlbWVtYmVyaW5nIHRoZSByZXN1bHQuICovCisJCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQkJaWYgKGRhdFtpXSA9PSAweGZmKSBjb250aW51ZTsKKwkJCWVtcHR5bWF0Y2ggPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogSWYgZW1wdHltYXRjaCBzdGlsbCA9MSwgd2UgZG8gaGF2ZSBhbiBhbGwtMHhmZiBkYXRhIGJ1ZmZlci4KKwkgICBSZXR1cm4gYWxsLTB4ZmYgZWNjIHZhbHVlIGluc3RlYWQgb2YgdGhlIGNvbXB1dGVkIG9uZSwgc28KKwkgICBpdCdsbCBsb29rIGp1c3QgbGlrZSBhIGZyZXNobHktZXJhc2VkIHBhZ2UuICovCisJaWYgKGVtcHR5bWF0Y2gpIG1lbXNldChlY2NfY29kZSwgMHhmZiwgNik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb2MyMDB4X2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisJdm9pZCBfX2lvbWVtICpkb2NwdHIgPSBkb2MtPnZpcnRhZHI7CisJdm9sYXRpbGUgdV9jaGFyIGR1bW15OworCWludCBlbXB0eW1hdGNoID0gMTsKKworCS8qIGZsdXNoIHRoZSBwaXBlbGluZSAqLworCWlmIChEb0NfaXNfMjAwMChkb2MpKSB7CisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIDJrX0VDQ1N0YXR1cyk7CisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIDJrX0VDQ1N0YXR1cyk7CisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIDJrX0VDQ1N0YXR1cyk7CisJfSBlbHNlIGlmIChEb0NfaXNfTWlsbGVubml1bVBsdXMoZG9jKSkgeworCQlkdW1teSA9IFJlYWRET0MoZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKKwkJZHVtbXkgPSBSZWFkRE9DKGRvY3B0ciwgTXBsdXNfRUNDQ29uZik7CisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIE1wbHVzX0VDQ0NvbmYpOworCX0gZWxzZSB7CisJCWR1bW15ID0gUmVhZERPQyhkb2NwdHIsIEVDQ0NvbmYpOworCQlkdW1teSA9IFJlYWRET0MoZG9jcHRyLCBFQ0NDb25mKTsKKwkJZHVtbXkgPSBSZWFkRE9DKGRvY3B0ciwgRUNDQ29uZik7CisJfQorCisJLyogRXJyb3Igb2NjdXJlZCA/ICovCisJaWYgKGR1bW15ICYgMHg4MCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlpZiAoRG9DX2lzX01pbGxlbm5pdW1QbHVzKGRvYykpCisJCQkJY2FsY19lY2NbaV0gPSBSZWFkRE9DXyhkb2NwdHIsIERvQ19NcGx1c19FQ0NTeW5kcm9tZTAgKyBpKTsKKwkJCWVsc2UKKwkJCQljYWxjX2VjY1tpXSA9IFJlYWRET0NfKGRvY3B0ciwgRG9DX0VDQ1N5bmRyb21lMCArIGkpOworCQkJaWYgKGNhbGNfZWNjW2ldICE9IGVtcHR5X3JlYWRfc3luZHJvbWVbaV0pCisJCQkJZW1wdHltYXRjaCA9IDA7CisJCX0KKwkJLyogSWYgZW1wdHltYXRjaD0xLCB0aGUgcmVhZCBzeW5kcm9tZSBpcyBjb25zaXN0ZW50IHdpdGggYW4KKwkJICAgYWxsLTB4ZmYgZGF0YSBhbmQgc3RvcmVkIGVjYyBibG9jay4gIENoZWNrIHRoZSBzdG9yZWQgZWNjLiAqLworCQlpZiAoZW1wdHltYXRjaCkgeworCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJCWlmIChyZWFkX2VjY1tpXSA9PSAweGZmKSBjb250aW51ZTsKKwkJCQllbXB0eW1hdGNoID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBJZiBlbXB0eW1hdGNoIHN0aWxsID0xLCBjaGVjayB0aGUgZGF0YSBibG9jay4gKi8KKwkJaWYgKGVtcHR5bWF0Y2gpIHsKKwkJLyogTm90ZTogdGhpcyBzb21ld2hhdCBleHBlbnNpdmUgdGVzdCBzaG91bGQgbm90IGJlIHRyaWdnZXJlZAorCQkgICBvZnRlbi4gIEl0IGNvdWxkIGJlIG9wdGltaXplZCBhd2F5IGJ5IGV4YW1pbmluZyB0aGUgZGF0YSBpbgorCQkgICB0aGUgcmVhZGJ1ZiByb3V0aW5lLCBhbmQgcmVtZW1iZXJpbmcgdGhlIHJlc3VsdC4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQkJCWlmIChkYXRbaV0gPT0gMHhmZikgY29udGludWU7CisJCQkJZW1wdHltYXRjaCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogSWYgZW1wdHltYXRjaCBzdGlsbCA9MSwgdGhpcyBpcyBhbG1vc3QgY2VydGFpbmx5IGEgZnJlc2hseS0KKwkJICAgZXJhc2VkIGJsb2NrLCBpbiB3aGljaCBjYXNlIHRoZSBFQ0Mgd2lsbCBub3QgY29tZSBvdXQgcmlnaHQuCisJCSAgIFdlJ2xsIHN1cHByZXNzIHRoZSBlcnJvciBhbmQgdGVsbCB0aGUgY2FsbGVyIGV2ZXJ5dGhpbmcncworCQkgICBPSy4gIEJlY2F1c2UgaXQgaXMuICovCisJCWlmICghZW1wdHltYXRjaCkgcmV0ID0gZG9jX2VjY19kZWNvZGUgKHJzX2RlY29kZXIsIGRhdCwgY2FsY19lY2MpOworCQlpZiAocmV0ID4gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiZG9jMjAweF9jb3JyZWN0X2RhdGEgY29ycmVjdGVkICVkIGVycm9yc1xuIiwgcmV0KTsKKwl9CisJaWYgKERvQ19pc19NaWxsZW5uaXVtUGx1cyhkb2MpKQorCQlXcml0ZURPQyhET0NfRUNDX0RJUywgZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKKwllbHNlCisJCVdyaXRlRE9DKERPQ19FQ0NfRElTLCBkb2NwdHIsIEVDQ0NvbmYpOworCWlmIChub19lY2NfZmFpbHVyZXMgJiYgKHJldCA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdXBwcmVzc2luZyBFQ0MgZmFpbHVyZVxuIik7CisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qdV9jaGFyIG15ZGF0YWJ1Zls1MjhdOyAqLworCitzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkb2MyMDB4X29vYmluZm8gPSB7CisJLnVzZWVjYyA9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMgPSA2LAorCS5lY2Nwb3MgPSB7MCwgMSwgMiwgMywgNCwgNX0sCisJLm9vYmZyZWUgPSB7IHs4LCA4fSB9Cit9OworCisvKiBGaW5kIHRoZSAoSSlORlRMIE1lZGlhIEhlYWRlciwgYW5kIG9wdGlvbmFsbHkgYWxzbyB0aGUgbWlycm9yIG1lZGlhIGhlYWRlci4KKyAgIE9uIHN1Y2Vzc2Z1bCByZXR1cm4sIGJ1ZiB3aWxsIGNvbnRhaW4gYSBjb3B5IG9mIHRoZSBtZWRpYSBoZWFkZXIgZm9yCisgICBmdXJ0aGVyIHByb2Nlc3NpbmcuICBpZCBpcyB0aGUgc3RyaW5nIHRvIHNjYW4gZm9yLCBhbmQgd2lsbCBwcmVzdW1hYmx5IGJlCisgICBlaXRoZXIgIkFOQU5EIiBvciAiQk5BTkQiLiAgSWYgZmluZG1pcnJvcj0xLCBhbHNvIGxvb2sgZm9yIHRoZSBtaXJyb3IgbWVkaWEKKyAgIGhlYWRlci4gIFRoZSBwYWdlICNzIG9mIHRoZSBmb3VuZCBtZWRpYSBoZWFkZXJzIGFyZSBwbGFjZWQgaW4gbWgwX3BhZ2UgYW5kCisgICBtaDFfcGFnZSBpbiB0aGUgRE9DIHByaXZhdGUgc3RydWN0dXJlLiAqLworc3RhdGljIGludCBfX2luaXQgZmluZF9tZWRpYV9oZWFkZXJzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmlkLCBpbnQgZmluZG1pcnJvcikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwl1bnNpZ25lZCBvZmZzLCBlbmQgPSAoTUFYX01FRElBSEVBREVSX1NDQU4gPDwgdGhpcy0+cGh5c19lcmFzZV9zaGlmdCk7CisJaW50IHJldDsKKwlzaXplX3QgcmV0bGVuOworCisJZW5kID0gbWluKGVuZCwgbXRkLT5zaXplKTsgLyogcGFyYW5vaWEgKi8KKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgZW5kOyBvZmZzICs9IG10ZC0+ZXJhc2VzaXplKSB7CisJCXJldCA9IG10ZC0+cmVhZChtdGQsIG9mZnMsIG10ZC0+b29iYmxvY2ssICZyZXRsZW4sIGJ1Zik7CisJCWlmIChyZXRsZW4gIT0gbXRkLT5vb2JibG9jaykgY29udGludWU7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDQyBlcnJvciBzY2FubmluZyBET0MgYXQgMHgleFxuIiwKKwkJCQlvZmZzKTsKKwkJfQorCQlpZiAobWVtY21wKGJ1ZiwgaWQsIDYpKSBjb250aW51ZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgRGlza09uQ2hpcCAlcyBNZWRpYSBIZWFkZXIgYXQgMHgleFxuIiwgaWQsIG9mZnMpOworCQlpZiAoZG9jLT5taDBfcGFnZSA9PSAtMSkgeworCQkJZG9jLT5taDBfcGFnZSA9IG9mZnMgPj4gdGhpcy0+cGFnZV9zaGlmdDsKKwkJCWlmICghZmluZG1pcnJvcikgcmV0dXJuIDE7CisJCQljb250aW51ZTsKKwkJfQorCQlkb2MtPm1oMV9wYWdlID0gb2ZmcyA+PiB0aGlzLT5wYWdlX3NoaWZ0OworCQlyZXR1cm4gMjsKKwl9CisJaWYgKGRvYy0+bWgwX3BhZ2UgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlza09uQ2hpcCAlcyBNZWRpYSBIZWFkZXIgbm90IGZvdW5kLlxuIiwgaWQpOworCQlyZXR1cm4gMDsKKwl9CisJLyogT25seSBvbmUgbWVkaWFoZWFkZXIgd2FzIGZvdW5kLiAgV2Ugd2FudCBidWYgdG8gY29udGFpbiBhCisJICAgbWVkaWFoZWFkZXIgb24gcmV0dXJuLCBzbyB3ZSdsbCBoYXZlIHRvIHJlLXJlYWQgdGhlIG9uZSB3ZSBmb3VuZC4gKi8KKwlvZmZzID0gZG9jLT5taDBfcGFnZSA8PCB0aGlzLT5wYWdlX3NoaWZ0OworCXJldCA9IG10ZC0+cmVhZChtdGQsIG9mZnMsIG10ZC0+b29iYmxvY2ssICZyZXRsZW4sIGJ1Zik7CisJaWYgKHJldGxlbiAhPSBtdGQtPm9vYmJsb2NrKSB7CisJCS8qIEluc2FuaXR5LiAgR2l2ZSB1cC4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJSZWFkIERpc2tPbkNoaXAgTWVkaWEgSGVhZGVyIG9uY2UsIGJ1dCBjYW4ndCByZXJlYWQgaXQ/Pz9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdCBuZnRsX3BhcnRzY2FuKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1X2NoYXIgKmJ1ZjsKKwlzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICptaDsKKwljb25zdCB1bnNpZ25lZCBwc2l6ZSA9IDEgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwl1bnNpZ25lZCBibG9ja3MsIG1heGJsb2NrczsKKwlpbnQgb2ZmcywgbnVtaGVhZGVyczsKKworCWJ1ZiA9IGttYWxsb2MobXRkLT5vb2JibG9jaywgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEaXNrT25DaGlwIG1lZGlhaGVhZGVyIGttYWxsb2MgZmFpbGVkIVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIShudW1oZWFkZXJzPWZpbmRfbWVkaWFfaGVhZGVycyhtdGQsIGJ1ZiwgIkFOQU5EIiwgMSkpKSBnb3RvIG91dDsKKwltaCA9IChzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICopIGJ1ZjsKKworLyojaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFICovCisvKglpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpICovCisJcHJpbnRrKEtFUk5fSU5GTyAiICAgIERhdGFPcmdJRCAgICAgICAgPSAlc1xuIgorCQkJICIgICAgTnVtRXJhc2VVbml0cyAgICA9ICVkXG4iCisJCQkgIiAgICBGaXJzdFBoeXNpY2FsRVVOID0gJWRcbiIKKwkJCSAiICAgIEZvcm1hdHRlZFNpemUgICAgPSAlZFxuIgorCQkJICIgICAgVW5pdFNpemVGYWN0b3IgICA9ICVkXG4iLAorCQltaC0+RGF0YU9yZ0lELCBtaC0+TnVtRXJhc2VVbml0cywKKwkJbWgtPkZpcnN0UGh5c2ljYWxFVU4sIG1oLT5Gb3JtYXR0ZWRTaXplLAorCQltaC0+VW5pdFNpemVGYWN0b3IpOworLyojZW5kaWYgKi8KKworCWJsb2NrcyA9IG10ZC0+c2l6ZSA+PiB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0OworCW1heGJsb2NrcyA9IG1pbigzMjc2OFUsIG10ZC0+ZXJhc2VzaXplIC0gcHNpemUpOworCisJaWYgKG1oLT5Vbml0U2l6ZUZhY3RvciA9PSAweDAwKSB7CisJCS8qIEF1dG8tZGV0ZXJtaW5lIFVuaXRTaXplRmFjdG9yLiAgVGhlIGNvbnN0cmFpbnRzIGFyZToKKwkJICAgLSBUaGVyZSBjYW4gYmUgYXQgbW9zdCAzMjc2OCB2aXJ0dWFsIGJsb2Nrcy4KKwkJICAgLSBUaGVyZSBjYW4gYmUgYXQgbW9zdCAodmlydHVhbCBibG9jayBzaXplIC0gcGFnZSBzaXplKQorCQkgICAgIHZpcnR1YWwgYmxvY2tzIChiZWNhdXNlIE1lZGlhSGVhZGVyK0JCVCBtdXN0IGZpdCBpbiAxKS4KKwkJKi8KKwkJbWgtPlVuaXRTaXplRmFjdG9yID0gMHhmZjsKKwkJd2hpbGUgKGJsb2NrcyA+IG1heGJsb2NrcykgeworCQkJYmxvY2tzID4+PSAxOworCQkJbWF4YmxvY2tzID0gbWluKDMyNzY4VSwgKG1heGJsb2NrcyA8PCAxKSArIHBzaXplKTsKKwkJCW1oLT5Vbml0U2l6ZUZhY3Rvci0tOworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuaXRTaXplRmFjdG9yPTB4MDAgZGV0ZWN0ZWQuICBDb3JyZWN0IHZhbHVlIGlzIGFzc3VtZWQgdG8gYmUgMHglMDJ4LlxuIiwgbWgtPlVuaXRTaXplRmFjdG9yKTsKKwl9CisKKwkvKiBOT1RFOiBUaGUgbGluZXMgYmVsb3cgbW9kaWZ5IGludGVybmFsIHZhcmlhYmxlcyBvZiB0aGUgTkFORCBhbmQgTVRECisJICAgbGF5ZXJzOyB2YXJpYWJsZXMgd2l0aCBoYXZlIGFscmVhZHkgYmVlbiBjb25maWd1cmVkIGJ5IG5hbmRfc2Nhbi4KKwkgICBVbmZvcnR1bmF0ZWx5LCB3ZSBkaWRuJ3Qga25vdyBiZWZvcmUgdGhpcyBwb2ludCB3aGF0IHRoZXNlIHZhbHVlcworCSAgIHNob3VsZCBiZS4gIFRodXMsIHRoaXMgY29kZSBpcyBzb21ld2hhdCBkZXBlbmRhbnQgb24gdGhlIGV4YWN0CisJICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5BTkQgbGF5ZXIuICAqLworCWlmIChtaC0+VW5pdFNpemVGYWN0b3IgIT0gMHhmZikgeworCQl0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgKz0gKDB4ZmYgLSBtaC0+VW5pdFNpemVGYWN0b3IpOworCQltdGQtPmVyYXNlc2l6ZSA8PD0gKDB4ZmYgLSBtaC0+VW5pdFNpemVGYWN0b3IpOworCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHZpcnR1YWwgZXJhc2Ugc2l6ZSB0byAlZFxuIiwgbXRkLT5lcmFzZXNpemUpOworCQlibG9ja3MgPSBtdGQtPnNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OworCQltYXhibG9ja3MgPSBtaW4oMzI3NjhVLCBtdGQtPmVyYXNlc2l6ZSAtIHBzaXplKTsKKwl9CisKKwlpZiAoYmxvY2tzID4gbWF4YmxvY2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5pdFNpemVGYWN0b3Igb2YgMHglMDJ4IGlzIGluY29uc2lzdGVudCB3aXRoIGRldmljZSBzaXplLiAgQWJvcnRpbmcuXG4iLCBtaC0+VW5pdFNpemVGYWN0b3IpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTa2lwIHBhc3QgdGhlIG1lZGlhIGhlYWRlcnMuICovCisJb2ZmcyA9IG1heChkb2MtPm1oMF9wYWdlLCBkb2MtPm1oMV9wYWdlKTsKKwlvZmZzIDw8PSB0aGlzLT5wYWdlX3NoaWZ0OworCW9mZnMgKz0gbXRkLT5lcmFzZXNpemU7CisKKwkvKnBhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgQm9vdCAvIE1lZGlhIEhlYWRlciBwYXJ0aXRpb24iOyAqLworCS8qcGFydHNbMF0ub2Zmc2V0ID0gMDsgKi8KKwkvKnBhcnRzWzBdLnNpemUgPSBvZmZzOyAqLworCisJcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBCRFRMIHBhcnRpdGlvbiI7CisJcGFydHNbMF0ub2Zmc2V0ID0gb2ZmczsKKwlwYXJ0c1swXS5zaXplID0gKG1oLT5OdW1FcmFzZVVuaXRzIC0gbnVtaGVhZGVycykgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OworCisJb2ZmcyArPSBwYXJ0c1swXS5zaXplOworCWlmIChvZmZzIDwgbXRkLT5zaXplKSB7CisJCXBhcnRzWzFdLm5hbWUgPSAiIERpc2tPbkNoaXAgUmVtYWluZGVyIHBhcnRpdGlvbiI7CisJCXBhcnRzWzFdLm9mZnNldCA9IG9mZnM7CisJCXBhcnRzWzFdLnNpemUgPSBtdGQtPnNpemUgLSBvZmZzOworCQlyZXQgPSAyOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMTsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgaXMgYSBzdHJpcHBlZC1kb3duIGNvcHkgb2YgdGhlIGNvZGUgaW4gaW5mdGxtb3VudC5jICovCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgaW5mdGxfcGFydHNjYW4oc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1X2NoYXIgKmJ1ZjsKKwlzdHJ1Y3QgSU5GVExNZWRpYUhlYWRlciAqbWg7CisJc3RydWN0IElORlRMUGFydGl0aW9uICppcDsKKwlpbnQgbnVtcGFydHMgPSAwOworCWludCBibG9ja3M7CisJaW50IHZzaGlmdCwgbGFzdHZ1bml0ID0gMDsKKwlpbnQgaTsKKwlpbnQgZW5kID0gbXRkLT5zaXplOworCisJaWYgKGluZnRsX2JidF93cml0ZSkKKwkJZW5kIC09IChJTkZUTF9CQlRfUkVTRVJWRURfQkxPQ0tTIDw8IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpOworCisJYnVmID0ga21hbGxvYyhtdGQtPm9vYmJsb2NrLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgIkRpc2tPbkNoaXAgbWVkaWFoZWFkZXIga21hbGxvYyBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmaW5kX21lZGlhX2hlYWRlcnMobXRkLCBidWYsICJCTkFORCIsIDApKSBnb3RvIG91dDsKKwlkb2MtPm1oMV9wYWdlID0gZG9jLT5taDBfcGFnZSArICg0MDk2ID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCW1oID0gKHN0cnVjdCBJTkZUTE1lZGlhSGVhZGVyICopIGJ1ZjsKKworCW1oLT5Ob09mQm9vdEltYWdlQmxvY2tzID0gbGUzMl90b19jcHUobWgtPk5vT2ZCb290SW1hZ2VCbG9ja3MpOworCW1oLT5Ob09mQmluYXJ5UGFydGl0aW9ucyA9IGxlMzJfdG9fY3B1KG1oLT5Ob09mQmluYXJ5UGFydGl0aW9ucyk7CisJbWgtPk5vT2ZCRFRMUGFydGl0aW9ucyA9IGxlMzJfdG9fY3B1KG1oLT5Ob09mQkRUTFBhcnRpdGlvbnMpOworCW1oLT5CbG9ja011bHRpcGxpZXJCaXRzID0gbGUzMl90b19jcHUobWgtPkJsb2NrTXVsdGlwbGllckJpdHMpOworCW1oLT5Gb3JtYXRGbGFncyA9IGxlMzJfdG9fY3B1KG1oLT5Gb3JtYXRGbGFncyk7CisJbWgtPlBlcmNlbnRVc2VkID0gbGUzMl90b19jcHUobWgtPlBlcmNlbnRVc2VkKTsKKworLyojaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFICovCisvKglpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpICovCisJcHJpbnRrKEtFUk5fSU5GTyAiICAgIGJvb3RSZWNvcmRJRCAgICAgICAgICA9ICVzXG4iCisJCQkgIiAgICBOb09mQm9vdEltYWdlQmxvY2tzICAgPSAlZFxuIgorCQkJICIgICAgTm9PZkJpbmFyeVBhcnRpdGlvbnMgID0gJWRcbiIKKwkJCSAiICAgIE5vT2ZCRFRMUGFydGl0aW9ucyAgICA9ICVkXG4iCisJCQkgIiAgICBCbG9ja011bHRpcGxlckJpdHMgICAgPSAlZFxuIgorCQkJICIgICAgRm9ybWF0RmxncyAgICAgICAgICAgID0gJWRcbiIKKwkJCSAiICAgIE9zYWtWZXJzaW9uICAgICAgICAgICA9ICVkLiVkLiVkLiVkXG4iCisJCQkgIiAgICBQZXJjZW50VXNlZCAgICAgICAgICAgPSAlZFxuIiwKKwkJbWgtPmJvb3RSZWNvcmRJRCwgbWgtPk5vT2ZCb290SW1hZ2VCbG9ja3MsCisJCW1oLT5Ob09mQmluYXJ5UGFydGl0aW9ucywKKwkJbWgtPk5vT2ZCRFRMUGFydGl0aW9ucywKKwkJbWgtPkJsb2NrTXVsdGlwbGllckJpdHMsIG1oLT5Gb3JtYXRGbGFncywKKwkJKCh1bnNpZ25lZCBjaGFyICopICZtaC0+T3Nha1ZlcnNpb24pWzBdICYgMHhmLAorCQkoKHVuc2lnbmVkIGNoYXIgKikgJm1oLT5Pc2FrVmVyc2lvbilbMV0gJiAweGYsCisJCSgodW5zaWduZWQgY2hhciAqKSAmbWgtPk9zYWtWZXJzaW9uKVsyXSAmIDB4ZiwKKwkJKCh1bnNpZ25lZCBjaGFyICopICZtaC0+T3Nha1ZlcnNpb24pWzNdICYgMHhmLAorCQltaC0+UGVyY2VudFVzZWQpOworLyojZW5kaWYgKi8KKworCXZzaGlmdCA9IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgKyBtaC0+QmxvY2tNdWx0aXBsaWVyQml0czsKKworCWJsb2NrcyA9IG10ZC0+c2l6ZSA+PiB2c2hpZnQ7CisJaWYgKGJsb2NrcyA+IDMyNzY4KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQmxvY2tNdWx0aXBsaWVyQml0cz0lZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBkZXZpY2Ugc2l6ZS4gIEFib3J0aW5nLlxuIiwgbWgtPkJsb2NrTXVsdGlwbGllckJpdHMpOworCQlnb3RvIG91dDsKKwl9CisKKwlibG9ja3MgPSBkb2MtPmNoaXBzX3Blcl9mbG9vciA8PCAodGhpcy0+Y2hpcF9zaGlmdCAtIHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpOworCWlmIChpbmZ0bF9iYnRfd3JpdGUgJiYgKGJsb2NrcyA+IG10ZC0+ZXJhc2VzaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIldyaXRlYWJsZSBCQlRzIHNwYW5uaW5nIG1vcmUgdGhhbiBvbmUgZXJhc2UgYmxvY2sgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiAgRklYIE1FIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNjYW4gdGhlIHBhcnRpdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyAoaSA8IDQpOyBpKyspIHsKKwkJaXAgPSAmKG1oLT5QYXJ0aXRpb25zW2ldKTsKKwkJaXAtPnZpcnR1YWxVbml0cyA9IGxlMzJfdG9fY3B1KGlwLT52aXJ0dWFsVW5pdHMpOworCQlpcC0+Zmlyc3RVbml0ID0gbGUzMl90b19jcHUoaXAtPmZpcnN0VW5pdCk7CisJCWlwLT5sYXN0VW5pdCA9IGxlMzJfdG9fY3B1KGlwLT5sYXN0VW5pdCk7CisJCWlwLT5mbGFncyA9IGxlMzJfdG9fY3B1KGlwLT5mbGFncyk7CisJCWlwLT5zcGFyZVVuaXRzID0gbGUzMl90b19jcHUoaXAtPnNwYXJlVW5pdHMpOworCQlpcC0+UmVzZXJ2ZWQwID0gbGUzMl90b19jcHUoaXAtPlJlc2VydmVkMCk7CisKKy8qI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRSAqLworLyoJCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTwkiICAgIFBBUlRJVElPTlslZF0gLT5cbiIKKwkJCSIgICAgICAgIHZpcnR1YWxVbml0cyAgICA9ICVkXG4iCisJCQkiICAgICAgICBmaXJzdFVuaXQgICAgICAgPSAlZFxuIgorCQkJIiAgICAgICAgbGFzdFVuaXQgICAgICAgID0gJWRcbiIKKwkJCSIgICAgICAgIGZsYWdzICAgICAgICAgICA9IDB4JXhcbiIKKwkJCSIgICAgICAgIHNwYXJlVW5pdHMgICAgICA9ICVkXG4iLAorCQkJaSwgaXAtPnZpcnR1YWxVbml0cywgaXAtPmZpcnN0VW5pdCwKKwkJCWlwLT5sYXN0VW5pdCwgaXAtPmZsYWdzLAorCQkJaXAtPnNwYXJlVW5pdHMpOworLyojZW5kaWYgKi8KKworLyoKKwkJaWYgKChpID09IDApICYmIChpcC0+Zmlyc3RVbml0ID4gMCkpIHsKKwkJCXBhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgSVBMIC8gTWVkaWEgSGVhZGVyIHBhcnRpdGlvbiI7CisJCQlwYXJ0c1swXS5vZmZzZXQgPSAwOworCQkJcGFydHNbMF0uc2l6ZSA9IG10ZC0+ZXJhc2VzaXplICogaXAtPmZpcnN0VW5pdDsKKwkJCW51bXBhcnRzID0gMTsKKwkJfQorKi8KKworCQlpZiAoaXAtPmZsYWdzICYgSU5GVExfQklOQVJZKQorCQkJcGFydHNbbnVtcGFydHNdLm5hbWUgPSAiIERpc2tPbkNoaXAgQkRLIHBhcnRpdGlvbiI7CisJCWVsc2UKKwkJCXBhcnRzW251bXBhcnRzXS5uYW1lID0gIiBEaXNrT25DaGlwIEJEVEwgcGFydGl0aW9uIjsKKwkJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IGlwLT5maXJzdFVuaXQgPDwgdnNoaWZ0OworCQlwYXJ0c1tudW1wYXJ0c10uc2l6ZSA9ICgxICsgaXAtPmxhc3RVbml0IC0gaXAtPmZpcnN0VW5pdCkgPDwgdnNoaWZ0OworCQludW1wYXJ0cysrOworCQlpZiAoaXAtPmxhc3RVbml0ID4gbGFzdHZ1bml0KSBsYXN0dnVuaXQgPSBpcC0+bGFzdFVuaXQ7CisJCWlmIChpcC0+ZmxhZ3MgJiBJTkZUTF9MQVNUKSBicmVhazsKKwl9CisJbGFzdHZ1bml0Kys7CisJaWYgKChsYXN0dnVuaXQgPDwgdnNoaWZ0KSA8IGVuZCkgeworCQlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBSZW1haW5kZXIgcGFydGl0aW9uIjsKKwkJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IGxhc3R2dW5pdCA8PCB2c2hpZnQ7CisJCXBhcnRzW251bXBhcnRzXS5zaXplID0gZW5kIC0gcGFydHNbbnVtcGFydHNdLm9mZnNldDsKKwkJbnVtcGFydHMrKzsKKwl9CisJcmV0ID0gbnVtcGFydHM7CitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZnRsX3NjYW5fYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCWludCByZXQsIG51bXBhcnRzOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OworCXN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRzWzJdOworCisJbWVtc2V0KChjaGFyICopIHBhcnRzLCAwLCBzaXplb2YocGFydHMpKTsKKwkvKiBPbiBORlRMLCB3ZSBoYXZlIHRvIGZpbmQgdGhlIG1lZGlhIGhlYWRlcnMgYmVmb3JlIHdlIGNhbiByZWFkIHRoZQorCSAgIEJCVHMsIHNpbmNlIHRoZXkncmUgc3RvcmVkIGluIHRoZSBtZWRpYSBoZWFkZXIgZXJhc2VibG9ja3MuICovCisJbnVtcGFydHMgPSBuZnRsX3BhcnRzY2FuKG10ZCwgcGFydHMpOworCWlmICghbnVtcGFydHMpIHJldHVybiAtRUlPOworCXRoaXMtPmJidF90ZC0+b3B0aW9ucyA9IE5BTkRfQkJUX0FCU1BBR0UgfCBOQU5EX0JCVF84QklUIHwKKwkJCQlOQU5EX0JCVF9TQVZFQ09OVEVOVCB8IE5BTkRfQkJUX1dSSVRFIHwKKwkJCQlOQU5EX0JCVF9WRVJTSU9OOworCXRoaXMtPmJidF90ZC0+dmVyb2ZmcyA9IDc7CisJdGhpcy0+YmJ0X3RkLT5wYWdlc1swXSA9IGRvYy0+bWgwX3BhZ2UgKyAxOworCWlmIChkb2MtPm1oMV9wYWdlICE9IC0xKSB7CisJCXRoaXMtPmJidF9tZC0+b3B0aW9ucyA9IE5BTkRfQkJUX0FCU1BBR0UgfCBOQU5EX0JCVF84QklUIHwKKwkJCQkJTkFORF9CQlRfU0FWRUNPTlRFTlQgfCBOQU5EX0JCVF9XUklURSB8CisJCQkJCU5BTkRfQkJUX1ZFUlNJT047CisJCXRoaXMtPmJidF9tZC0+dmVyb2ZmcyA9IDc7CisJCXRoaXMtPmJidF9tZC0+cGFnZXNbMF0gPSBkb2MtPm1oMV9wYWdlICsgMTsKKwl9IGVsc2UgeworCQl0aGlzLT5iYnRfbWQgPSBOVUxMOworCX0KKworCS8qIEl0J3Mgc2FmZSB0byBzZXQgYmQ9TlVMTCBiZWxvdyBiZWNhdXNlIE5BTkRfQkJUX0NSRUFURSBpcyBub3Qgc2V0LgorCSAgIEF0IGxlYXN0IGFzIG5hbmRfYmJ0LmMgaXMgY3VycmVudGx5IHdyaXR0ZW4uICovCisJaWYgKChyZXQgPSBuYW5kX3NjYW5fYmJ0KG10ZCwgTlVMTCkpKQorCQlyZXR1cm4gcmV0OworCWFkZF9tdGRfZGV2aWNlKG10ZCk7CisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJaWYgKCFub19hdXRvcGFydCkKKwkJYWRkX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydHMsIG51bXBhcnRzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbmZ0bF9zY2FuX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlpbnQgcmV0LCBudW1wYXJ0czsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0c1s1XTsKKworCWlmICh0aGlzLT5udW1jaGlwcyA+IGRvYy0+Y2hpcHNfcGVyX2Zsb29yKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTXVsdGktZmxvb3IgSU5GVEwgZGV2aWNlcyBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoRG9DX2lzX01pbGxlbm5pdW1QbHVzKGRvYykpIHsKKwkJdGhpcy0+YmJ0X3RkLT5vcHRpb25zID0gTkFORF9CQlRfMkJJVCB8IE5BTkRfQkJUX0FCU1BBR0U7CisJCWlmIChpbmZ0bF9iYnRfd3JpdGUpCisJCQl0aGlzLT5iYnRfdGQtPm9wdGlvbnMgfD0gTkFORF9CQlRfV1JJVEU7CisJCXRoaXMtPmJidF90ZC0+cGFnZXNbMF0gPSAyOworCQl0aGlzLT5iYnRfbWQgPSBOVUxMOworCX0gZWxzZSB7CisJCXRoaXMtPmJidF90ZC0+b3B0aW9ucyA9IE5BTkRfQkJUX0xBU1RCTE9DSyB8IE5BTkRfQkJUXzhCSVQgfAorCQkJCQlOQU5EX0JCVF9WRVJTSU9OOworCQlpZiAoaW5mdGxfYmJ0X3dyaXRlKQorCQkJdGhpcy0+YmJ0X3RkLT5vcHRpb25zIHw9IE5BTkRfQkJUX1dSSVRFOworCQl0aGlzLT5iYnRfdGQtPm9mZnMgPSA4OworCQl0aGlzLT5iYnRfdGQtPmxlbiA9IDg7CisJCXRoaXMtPmJidF90ZC0+dmVyb2ZmcyA9IDc7CisJCXRoaXMtPmJidF90ZC0+bWF4YmxvY2tzID0gSU5GVExfQkJUX1JFU0VSVkVEX0JMT0NLUzsKKwkJdGhpcy0+YmJ0X3RkLT5yZXNlcnZlZF9ibG9ja19jb2RlID0gMHgwMTsKKwkJdGhpcy0+YmJ0X3RkLT5wYXR0ZXJuID0gIk1TWVNfQkJUIjsKKworCQl0aGlzLT5iYnRfbWQtPm9wdGlvbnMgPSBOQU5EX0JCVF9MQVNUQkxPQ0sgfCBOQU5EX0JCVF84QklUIHwKKwkJCQkJTkFORF9CQlRfVkVSU0lPTjsKKwkJaWYgKGluZnRsX2JidF93cml0ZSkKKwkJCXRoaXMtPmJidF9tZC0+b3B0aW9ucyB8PSBOQU5EX0JCVF9XUklURTsKKwkJdGhpcy0+YmJ0X21kLT5vZmZzID0gODsKKwkJdGhpcy0+YmJ0X21kLT5sZW4gPSA4OworCQl0aGlzLT5iYnRfbWQtPnZlcm9mZnMgPSA3OworCQl0aGlzLT5iYnRfbWQtPm1heGJsb2NrcyA9IElORlRMX0JCVF9SRVNFUlZFRF9CTE9DS1M7CisJCXRoaXMtPmJidF9tZC0+cmVzZXJ2ZWRfYmxvY2tfY29kZSA9IDB4MDE7CisJCXRoaXMtPmJidF9tZC0+cGF0dGVybiA9ICJUQkJfU1lTTSI7CisJfQorCisJLyogSXQncyBzYWZlIHRvIHNldCBiZD1OVUxMIGJlbG93IGJlY2F1c2UgTkFORF9CQlRfQ1JFQVRFIGlzIG5vdCBzZXQuCisJICAgQXQgbGVhc3QgYXMgbmFuZF9iYnQuYyBpcyBjdXJyZW50bHkgd3JpdHRlbi4gKi8KKwlpZiAoKHJldCA9IG5hbmRfc2Nhbl9iYnQobXRkLCBOVUxMKSkpCisJCXJldHVybiByZXQ7CisJbWVtc2V0KChjaGFyICopIHBhcnRzLCAwLCBzaXplb2YocGFydHMpKTsKKwludW1wYXJ0cyA9IGluZnRsX3BhcnRzY2FuKG10ZCwgcGFydHMpOworCS8qIEF0IGxlYXN0IGZvciBub3csIHJlcXVpcmUgdGhlIElORlRMIE1lZGlhIEhlYWRlci4gIFdlIGNvdWxkIHByb2JhYmx5CisJICAgZG8gd2l0aG91dCBpdCBmb3Igbm9uLUlORlRMIHVzZSwgc2luY2UgYWxsIGl0IGdpdmVzIHVzIGlzCisJICAgYXV0b3BhcnRpdGlvbmluZywgYnV0IEkgd2FudCB0byBnaXZlIGl0IG1vcmUgdGhvdWdodC4gKi8KKwlpZiAoIW51bXBhcnRzKSByZXR1cm4gLUVJTzsKKwlhZGRfbXRkX2RldmljZShtdGQpOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCWlmICghbm9fYXV0b3BhcnQpCisJCWFkZF9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRzLCBudW1wYXJ0cyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0IGRvYzIwMDBfaW5pdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKworCXRoaXMtPndyaXRlX2J5dGUgPSBkb2MyMDAwX3dyaXRlX2J5dGU7CisJdGhpcy0+cmVhZF9ieXRlID0gZG9jMjAwMF9yZWFkX2J5dGU7CisJdGhpcy0+d3JpdGVfYnVmID0gZG9jMjAwMF93cml0ZWJ1ZjsKKwl0aGlzLT5yZWFkX2J1ZiA9IGRvYzIwMDBfcmVhZGJ1ZjsKKwl0aGlzLT52ZXJpZnlfYnVmID0gZG9jMjAwMF92ZXJpZnlidWY7CisJdGhpcy0+c2Nhbl9iYnQgPSBuZnRsX3NjYW5fYmJ0OworCisJZG9jLT5DRFNOQ29udHJvbCA9IENEU05fQ1RSTF9GTEFTSF9JTyB8IENEU05fQ1RSTF9FQ0NfSU87CisJZG9jMjAwMF9jb3VudF9jaGlwcyhtdGQpOworCW10ZC0+bmFtZSA9ICJEaXNrT25DaGlwIDIwMDAgKE5GVEwgTW9kZWwpIjsKKwlyZXR1cm4gKDQgKiBkb2MtPmNoaXBzX3Blcl9mbG9vcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdCBkb2MyMDAxX2luaXQoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZG9jX3ByaXYgKmRvYyA9IHRoaXMtPnByaXY7CisKKwl0aGlzLT53cml0ZV9ieXRlID0gZG9jMjAwMV93cml0ZV9ieXRlOworCXRoaXMtPnJlYWRfYnl0ZSA9IGRvYzIwMDFfcmVhZF9ieXRlOworCXRoaXMtPndyaXRlX2J1ZiA9IGRvYzIwMDFfd3JpdGVidWY7CisJdGhpcy0+cmVhZF9idWYgPSBkb2MyMDAxX3JlYWRidWY7CisJdGhpcy0+dmVyaWZ5X2J1ZiA9IGRvYzIwMDFfdmVyaWZ5YnVmOworCisJUmVhZERPQyhkb2MtPnZpcnRhZHIsIENoaXBJRCk7CisJUmVhZERPQyhkb2MtPnZpcnRhZHIsIENoaXBJRCk7CisJUmVhZERPQyhkb2MtPnZpcnRhZHIsIENoaXBJRCk7CisJaWYgKFJlYWRET0MoZG9jLT52aXJ0YWRyLCBDaGlwSUQpICE9IERPQ19DaGlwSURfRG9jTWlsKSB7CisJCS8qIEl0J3Mgbm90IGEgTWlsbGVubml1bTsgaXQncyBvbmUgb2YgdGhlIG5ld2VyCisJCSAgIERpc2tPbkNoaXAgMjAwMCB1bml0cyB3aXRoIGEgc2ltaWxhciBBU0lDLgorCQkgICBUcmVhdCBpdCBsaWtlIGEgTWlsbGVubml1bSwgZXhjZXB0IHRoYXQgaXQKKwkJICAgY2FuIGhhdmUgbXVsdGlwbGUgY2hpcHMuICovCisJCWRvYzIwMDBfY291bnRfY2hpcHMobXRkKTsKKwkJbXRkLT5uYW1lID0gIkRpc2tPbkNoaXAgMjAwMCAoSU5GVEwgTW9kZWwpIjsKKwkJdGhpcy0+c2Nhbl9iYnQgPSBpbmZ0bF9zY2FuX2JidDsKKwkJcmV0dXJuICg0ICogZG9jLT5jaGlwc19wZXJfZmxvb3IpOworCX0gZWxzZSB7CisJCS8qIEJvZy1zdGFuZGFyZCBNaWxsZW5uaXVtICovCisJCWRvYy0+Y2hpcHNfcGVyX2Zsb29yID0gMTsKKwkJbXRkLT5uYW1lID0gIkRpc2tPbkNoaXAgTWlsbGVubml1bSI7CisJCXRoaXMtPnNjYW5fYmJ0ID0gbmZ0bF9zY2FuX2JidDsKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgZG9jMjAwMXBsdXNfaW5pdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBkb2NfcHJpdiAqZG9jID0gdGhpcy0+cHJpdjsKKworCXRoaXMtPndyaXRlX2J5dGUgPSBOVUxMOworCXRoaXMtPnJlYWRfYnl0ZSA9IGRvYzIwMDFwbHVzX3JlYWRfYnl0ZTsKKwl0aGlzLT53cml0ZV9idWYgPSBkb2MyMDAxcGx1c193cml0ZWJ1ZjsKKwl0aGlzLT5yZWFkX2J1ZiA9IGRvYzIwMDFwbHVzX3JlYWRidWY7CisJdGhpcy0+dmVyaWZ5X2J1ZiA9IGRvYzIwMDFwbHVzX3ZlcmlmeWJ1ZjsKKwl0aGlzLT5zY2FuX2JidCA9IGluZnRsX3NjYW5fYmJ0OworCXRoaXMtPmh3Y29udHJvbCA9IE5VTEw7CisJdGhpcy0+c2VsZWN0X2NoaXAgPSBkb2MyMDAxcGx1c19zZWxlY3RfY2hpcDsKKwl0aGlzLT5jbWRmdW5jID0gZG9jMjAwMXBsdXNfY29tbWFuZDsKKwl0aGlzLT5lbmFibGVfaHdlY2MgPSBkb2MyMDAxcGx1c19lbmFibGVfaHdlY2M7CisKKwlkb2MtPmNoaXBzX3Blcl9mbG9vciA9IDE7CisJbXRkLT5uYW1lID0gIkRpc2tPbkNoaXAgTWlsbGVubml1bSBQbHVzIjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgZG9jX3Byb2JlKHVuc2lnbmVkIGxvbmcgcGh5c2FkcikKK3sKKwl1bnNpZ25lZCBjaGFyIENoaXBJRDsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kOworCXN0cnVjdCBkb2NfcHJpdiAqZG9jOworCXZvaWQgX19pb21lbSAqdmlydGFkcjsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBjaGFyIHRtcCwgdG1wYiwgdG1wYzsKKwlpbnQgcmVnLCBsZW4sIG51bWNoaXBzOworCWludCByZXQgPSAwOworCisJdmlydGFkciA9IGlvcmVtYXAocGh5c2FkciwgRE9DX0lPUkVNQVBfTEVOKTsKKwlpZiAoIXZpcnRhZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEaXNrb25jaGlwIGlvcmVtYXAgZmFpbGVkOiAweCV4IGJ5dGVzIGF0IDB4JWx4XG4iLCBET0NfSU9SRU1BUF9MRU4sIHBoeXNhZHIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBjbGVhbmx5IGRldGVjdCB0aGUgRGlza09uQ2hpcCAtIHRoZQorCSAqIGJvb3R1cCBwcm9jZWR1cmUgd2lsbCBwdXQgdGhlIGRldmljZSBpbnRvIHJlc2V0IG1vZGUsIGFuZAorCSAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRhbGsgdG8gaXQgd2l0aG91dCBhY3R1YWxseSB3cml0aW5nCisJICogdG8gdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXIuIFNvIHdlIHN0b3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzCisJICogb2YgdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXIncyBsb2NhdGlvbiwgaW4gY2FzZSB3ZSBsYXRlciBkZWNpZGUKKwkgKiB0aGF0IGl0J3Mgbm90IGEgRGlza09uQ2hpcCwgYW5kIHdhbnQgdG8gcHV0IGl0IGJhY2sgaG93IHdlCisJICogZm91bmQgaXQuCisJICovCisJc2F2ZV9jb250cm9sID0gUmVhZERPQyh2aXJ0YWRyLCBET0NDb250cm9sKTsKKworCS8qIFJlc2V0IHRoZSBEaXNrT25DaGlwIEFTSUMgKi8KKwlXcml0ZURPQyhET0NfTU9ERV9DTFJfRVJSIHwgRE9DX01PREVfTURXUkVOIHwgRE9DX01PREVfUkVTRVQsCisJCSB2aXJ0YWRyLCBET0NDb250cm9sKTsKKwlXcml0ZURPQyhET0NfTU9ERV9DTFJfRVJSIHwgRE9DX01PREVfTURXUkVOIHwgRE9DX01PREVfUkVTRVQsCisJCSB2aXJ0YWRyLCBET0NDb250cm9sKTsKKworCS8qIEVuYWJsZSB0aGUgRGlza09uQ2hpcCBBU0lDICovCisJV3JpdGVET0MoRE9DX01PREVfQ0xSX0VSUiB8IERPQ19NT0RFX01EV1JFTiB8IERPQ19NT0RFX05PUk1BTCwKKwkJIHZpcnRhZHIsIERPQ0NvbnRyb2wpOworCVdyaXRlRE9DKERPQ19NT0RFX0NMUl9FUlIgfCBET0NfTU9ERV9NRFdSRU4gfCBET0NfTU9ERV9OT1JNQUwsCisJCSB2aXJ0YWRyLCBET0NDb250cm9sKTsKKworCUNoaXBJRCA9IFJlYWRET0ModmlydGFkciwgQ2hpcElEKTsKKworCXN3aXRjaChDaGlwSUQpIHsKKwljYXNlIERPQ19DaGlwSURfRG9jMms6CisJCXJlZyA9IERvQ18ya19FQ0NTdGF0dXM7CisJCWJyZWFrOworCWNhc2UgRE9DX0NoaXBJRF9Eb2NNaWw6CisJCXJlZyA9IERvQ19FQ0NDb25mOworCQlicmVhazsKKwljYXNlIERPQ19DaGlwSURfRG9jTWlsUGx1czE2OgorCWNhc2UgRE9DX0NoaXBJRF9Eb2NNaWxQbHVzMzI6CisJY2FzZSAwOgorCQkvKiBQb3NzaWJsZSBNaWxsZW5uaXVtIFBsdXMsIG5lZWQgdG8gZG8gbW9yZSBjaGVja3MgKi8KKwkJLyogUG9zc2libHkgcmVsZWFzZSBmcm9tIHBvd2VyIGRvd24gbW9kZSAqLworCQlmb3IgKHRtcCA9IDA7ICh0bXAgPCA0KTsgdG1wKyspCisJCQlSZWFkRE9DKHZpcnRhZHIsIE1wbHVzX1Bvd2VyKTsKKworCQkvKiBSZXNldCB0aGUgTWlsbGVubml1bSBQbHVzIEFTSUMgKi8KKwkJdG1wID0gRE9DX01PREVfUkVTRVQgfCBET0NfTU9ERV9NRFdSRU4gfCBET0NfTU9ERV9SU1RfTEFUIHwKKwkJCURPQ19NT0RFX0JERUNUOworCQlXcml0ZURPQyh0bXAsIHZpcnRhZHIsIE1wbHVzX0RPQ0NvbnRyb2wpOworCQlXcml0ZURPQyh+dG1wLCB2aXJ0YWRyLCBNcGx1c19DdHJsQ29uZmlybSk7CisKKwkJbWRlbGF5KDEpOworCQkvKiBFbmFibGUgdGhlIE1pbGxlbm5pdW0gUGx1cyBBU0lDICovCisJCXRtcCA9IERPQ19NT0RFX05PUk1BTCB8IERPQ19NT0RFX01EV1JFTiB8IERPQ19NT0RFX1JTVF9MQVQgfAorCQkJRE9DX01PREVfQkRFQ1Q7CisJCVdyaXRlRE9DKHRtcCwgdmlydGFkciwgTXBsdXNfRE9DQ29udHJvbCk7CisJCVdyaXRlRE9DKH50bXAsIHZpcnRhZHIsIE1wbHVzX0N0cmxDb25maXJtKTsKKwkJbWRlbGF5KDEpOworCisJCUNoaXBJRCA9IFJlYWRET0ModmlydGFkciwgQ2hpcElEKTsKKworCQlzd2l0Y2ggKENoaXBJRCkgeworCQljYXNlIERPQ19DaGlwSURfRG9jTWlsUGx1czE2OgorCQkJcmVnID0gRG9DX01wbHVzX1RvZ2dsZTsKKwkJCWJyZWFrOworCQljYXNlIERPQ19DaGlwSURfRG9jTWlsUGx1czMyOgorCQkJcHJpbnRrKEtFUk5fRVJSICJEaXNrT25DaGlwIE1pbGxlbm5pdW0gUGx1cyAzMk1CIGlzIG5vdCBzdXBwb3J0ZWQsIGlnbm9yaW5nLlxuIik7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBub3Rmb3VuZDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbm90Zm91bmQ7CisJfQorCS8qIENoZWNrIHRoZSBUT0dHTEUgYml0IGluIHRoZSBFQ0MgcmVnaXN0ZXIgKi8KKwl0bXAgID0gUmVhZERPQ18odmlydGFkciwgcmVnKSAmIERPQ19UT0dHTEVfQklUOworCXRtcGIgPSBSZWFkRE9DXyh2aXJ0YWRyLCByZWcpICYgRE9DX1RPR0dMRV9CSVQ7CisJdG1wYyA9IFJlYWRET0NfKHZpcnRhZHIsIHJlZykgJiBET0NfVE9HR0xFX0JJVDsKKwlpZiAoKHRtcCA9PSB0bXBiKSB8fCAodG1wICE9IHRtcGMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBvc3NpYmxlIERpc2tPbkNoaXAgYXQgMHglbHggZmFpbGVkIFRPR0dMRSB0ZXN0LCBkcm9wcGluZy5cbiIsIHBoeXNhZHIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG5vdGZvdW5kOworCX0KKworCWZvciAobXRkID0gZG9jbGlzdDsgbXRkOyBtdGQgPSBkb2MtPm5leHRkb2MpIHsKKwkJdW5zaWduZWQgY2hhciBvbGR2YWw7CisJCXVuc2lnbmVkIGNoYXIgbmV3dmFsOworCQluYW5kID0gbXRkLT5wcml2OworCQlkb2MgPSBuYW5kLT5wcml2OworCQkvKiBVc2UgdGhlIGFsaWFzIHJlc29sdXRpb24gcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMKKwkJICAgaW4gZmFjdCB0aGUgc2FtZSBET0MgYWxpYXNlZCB0byBhIG5ldyBhZGRyZXNzLiAgSWYgd3JpdGVzCisJCSAgIHRvIG9uZSBjaGlwJ3MgYWxpYXMgcmVzb2x1dGlvbiByZWdpc3RlciBjaGFuZ2UgdGhlIHZhbHVlIG9uCisJCSAgIHRoZSBvdGhlciBjaGlwLCB0aGV5J3JlIHRoZSBzYW1lIGNoaXAuICovCisJCWlmIChDaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2NNaWxQbHVzMTYpIHsKKwkJCW9sZHZhbCA9IFJlYWRET0MoZG9jLT52aXJ0YWRyLCBNcGx1c19BbGlhc1Jlc29sdXRpb24pOworCQkJbmV3dmFsID0gUmVhZERPQyh2aXJ0YWRyLCBNcGx1c19BbGlhc1Jlc29sdXRpb24pOworCQl9IGVsc2UgeworCQkJb2xkdmFsID0gUmVhZERPQyhkb2MtPnZpcnRhZHIsIEFsaWFzUmVzb2x1dGlvbik7CisJCQluZXd2YWwgPSBSZWFkRE9DKHZpcnRhZHIsIEFsaWFzUmVzb2x1dGlvbik7CisJCX0KKwkJaWYgKG9sZHZhbCAhPSBuZXd2YWwpCisJCQljb250aW51ZTsKKwkJaWYgKENoaXBJRCA9PSBET0NfQ2hpcElEX0RvY01pbFBsdXMxNikgeworCQkJV3JpdGVET0Mofm5ld3ZhbCwgdmlydGFkciwgTXBsdXNfQWxpYXNSZXNvbHV0aW9uKTsKKwkJCW9sZHZhbCA9IFJlYWRET0MoZG9jLT52aXJ0YWRyLCBNcGx1c19BbGlhc1Jlc29sdXRpb24pOworCQkJV3JpdGVET0MobmV3dmFsLCB2aXJ0YWRyLCBNcGx1c19BbGlhc1Jlc29sdXRpb24pOyAvKiByZXN0b3JlIGl0ICovCisJCX0gZWxzZSB7CisJCQlXcml0ZURPQyh+bmV3dmFsLCB2aXJ0YWRyLCBBbGlhc1Jlc29sdXRpb24pOworCQkJb2xkdmFsID0gUmVhZERPQyhkb2MtPnZpcnRhZHIsIEFsaWFzUmVzb2x1dGlvbik7CisJCQlXcml0ZURPQyhuZXd2YWwsIHZpcnRhZHIsIEFsaWFzUmVzb2x1dGlvbik7IC8qIHJlc3RvcmUgaXQgKi8KKwkJfQorCQluZXd2YWwgPSB+bmV3dmFsOworCQlpZiAob2xkdmFsID09IG5ld3ZhbCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkZvdW5kIGFsaWFzIG9mIERPQyBhdCAweCVseCB0byAweCVseFxuIiwgZG9jLT5waHlzYWRyLCBwaHlzYWRyKTsKKwkJCWdvdG8gbm90Zm91bmQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkRpc2tPbkNoaXAgZm91bmQgYXQgMHglbHhcbiIsIHBoeXNhZHIpOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKworCSAgICAgIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSArCisJICAgICAgc2l6ZW9mKHN0cnVjdCBkb2NfcHJpdikgKworCSAgICAgICgyICogc2l6ZW9mKHN0cnVjdCBuYW5kX2JidF9kZXNjcikpOworCW10ZCA9ICBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdGQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEaXNrT25DaGlwIGttYWxsb2MgKCVkIGJ5dGVzKSBmYWlsZWQhXG4iLCBsZW4pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCW1lbXNldChtdGQsIDAsIGxlbik7CisKKwluYW5kCQkJPSAoc3RydWN0IG5hbmRfY2hpcCAqKSAobXRkICsgMSk7CisJZG9jCQkJPSAoc3RydWN0IGRvY19wcml2ICopIChuYW5kICsgMSk7CisJbmFuZC0+YmJ0X3RkCQk9IChzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKikgKGRvYyArIDEpOworCW5hbmQtPmJidF9tZAkJPSBuYW5kLT5iYnRfdGQgKyAxOworCisJbXRkLT5wcml2CQk9IG5hbmQ7CisJbXRkLT5vd25lcgkJPSBUSElTX01PRFVMRTsKKworCW5hbmQtPnByaXYJCT0gZG9jOworCW5hbmQtPnNlbGVjdF9jaGlwCT0gZG9jMjAweF9zZWxlY3RfY2hpcDsKKwluYW5kLT5od2NvbnRyb2wJCT0gZG9jMjAweF9od2NvbnRyb2w7CisJbmFuZC0+ZGV2X3JlYWR5CQk9IGRvYzIwMHhfZGV2X3JlYWR5OworCW5hbmQtPndhaXRmdW5jCQk9IGRvYzIwMHhfd2FpdDsKKwluYW5kLT5ibG9ja19iYWQJCT0gZG9jMjAweF9ibG9ja19iYWQ7CisJbmFuZC0+ZW5hYmxlX2h3ZWNjCT0gZG9jMjAweF9lbmFibGVfaHdlY2M7CisJbmFuZC0+Y2FsY3VsYXRlX2VjYwk9IGRvYzIwMHhfY2FsY3VsYXRlX2VjYzsKKwluYW5kLT5jb3JyZWN0X2RhdGEJPSBkb2MyMDB4X2NvcnJlY3RfZGF0YTsKKworCW5hbmQtPmF1dG9vb2IJCT0gJmRvYzIwMHhfb29iaW5mbzsKKwluYW5kLT5lY2Ntb2RlCQk9IE5BTkRfRUNDX0hXNl81MTI7CisJbmFuZC0+b3B0aW9ucwkJPSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX0hXRUNDX1NZTkRST01FOworCisJZG9jLT5waHlzYWRyCQk9IHBoeXNhZHI7CisJZG9jLT52aXJ0YWRyCQk9IHZpcnRhZHI7CisJZG9jLT5DaGlwSUQJCT0gQ2hpcElEOworCWRvYy0+Y3VyZmxvb3IJCT0gLTE7CisJZG9jLT5jdXJjaGlwCQk9IC0xOworCWRvYy0+bWgwX3BhZ2UJCT0gLTE7CisJZG9jLT5taDFfcGFnZQkJPSAtMTsKKwlkb2MtPm5leHRkb2MJCT0gZG9jbGlzdDsKKworCWlmIChDaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2MyaykKKwkJbnVtY2hpcHMgPSBkb2MyMDAwX2luaXQobXRkKTsKKwllbHNlIGlmIChDaGlwSUQgPT0gRE9DX0NoaXBJRF9Eb2NNaWxQbHVzMTYpCisJCW51bWNoaXBzID0gZG9jMjAwMXBsdXNfaW5pdChtdGQpOworCWVsc2UKKwkJbnVtY2hpcHMgPSBkb2MyMDAxX2luaXQobXRkKTsKKworCWlmICgocmV0ID0gbmFuZF9zY2FuKG10ZCwgbnVtY2hpcHMpKSkgeworCQkvKiBEQkIgbm90ZTogaSBiZWxpZXZlIG5hbmRfcmVsZWFzZSBpcyBuZWNlc3NhcnkgaGVyZSwgYXMKKwkJICAgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiBuYW5kX2Jhc2UuICBDaGVjayB3aXRoCisJCSAgIFRob21hcy4gRklYIE1FISAqLworCQkvKiBuYW5kX3JlbGVhc2Ugd2lsbCBjYWxsIGRlbF9tdGRfZGV2aWNlLCBidXQgd2UgaGF2ZW4ndCB5ZXQKKwkJICAgYWRkZWQgaXQuICBUaGlzIGlzIGhhbmRsZWQgd2l0aG91dCBpbmNpZGVudCBieQorCQkgICBkZWxfbXRkX2RldmljZSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwuICovCisJCW5hbmRfcmVsZWFzZShtdGQpOworCQlrZnJlZShtdGQpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogU3VjY2VzcyEgKi8KKwlkb2NsaXN0ID0gbXRkOworCXJldHVybiAwOworCitub3Rmb3VuZDoKKwkvKiBQdXQgYmFjayB0aGUgY29udGVudHMgb2YgdGhlIERPQ0NvbnRyb2wgcmVnaXN0ZXIsIGluIGNhc2UgaXQncyBub3QKKwkgICBhY3R1YWxseSBhIERpc2tPbkNoaXAuICAqLworCVdyaXRlRE9DKHNhdmVfY29udHJvbCwgdmlydGFkciwgRE9DQ29udHJvbCk7CitmYWlsOgorCWlvdW5tYXAodmlydGFkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9uYW5kZG9jKHZvaWQpCit7CisgCXN0cnVjdCBtdGRfaW5mbyAqbXRkLCAqbmV4dG10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kOworCXN0cnVjdCBkb2NfcHJpdiAqZG9jOworCisJZm9yIChtdGQgPSBkb2NsaXN0OyBtdGQ7IG10ZCA9IG5leHRtdGQpIHsKKwkJbmFuZCA9IG10ZC0+cHJpdjsKKwkJZG9jID0gbmFuZC0+cHJpdjsKKworCQluZXh0bXRkID0gZG9jLT5uZXh0ZG9jOworCQluYW5kX3JlbGVhc2UobXRkKTsKKwkJaW91bm1hcChkb2MtPnZpcnRhZHIpOworCQlrZnJlZShtdGQpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9uYW5kZG9jKHZvaWQpCit7CisJaW50IGksIHJldCA9IDA7CisKKwkvKiBXZSBjb3VsZCBjcmVhdGUgdGhlIGRlY29kZXIgb24gZGVtYW5kLCBpZiBtZW1vcnkgaXMgYSBjb25jZXJuLgorCSAqIFRoaXMgd2F5IHdlIGhhdmUgaXQgaGFuZHksIGlmIGFuIGVycm9yIGhhcHBlbnMKKwkgKgorCSAqIFN5bWJvbHNpemUgaXMgMTAgKGJpdHMpCisJICogUHJpbWl0dmUgcG9seW5vbWlhbCBpcyB4XjEwK3heMysxCisJICogZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBpcyA1MTAKKwkgKiBwcmltaXR2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQorCSAqIGdlbmVyYXRvciBwb2xpbm9taWFsIGRlZ3JlZSA9IDQKKwkgKi8KKwlyc19kZWNvZGVyID0gaW5pdF9ycygxMCwgMHg0MDksIEZDUiwgMSwgTlJPT1RTKTsKKyAJaWYgKCFyc19kZWNvZGVyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIkRpc2tPbkNoaXA6IENvdWxkIG5vdCBjcmVhdGUgYSBSUyBkZWNvZGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGRvY19jb25maWdfbG9jYXRpb24pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgY29uZmlndXJlZCBEaXNrT25DaGlwIHByb2JlIGFkZHJlc3MgMHglbHhcbiIsIGRvY19jb25maWdfbG9jYXRpb24pOworCQlyZXQgPSBkb2NfcHJvYmUoZG9jX2NvbmZpZ19sb2NhdGlvbik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRlcnI7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7IChkb2NfbG9jYXRpb25zW2ldICE9IDB4ZmZmZmZmZmYpOyBpKyspIHsKKwkJCWRvY19wcm9iZShkb2NfbG9jYXRpb25zW2ldKTsKKwkJfQorCX0KKwkvKiBObyBiYW5uZXIgbWVzc2FnZSBhbnkgbW9yZS4gUHJpbnQgYSBtZXNzYWdlIGlmIG5vIERpc2tPbkNoaXAKKwkgICBmb3VuZCwgc28gdGhlIHVzZXIga25vd3Mgd2UgYXQgbGVhc3QgdHJpZWQuICovCisJaWYgKCFkb2NsaXN0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIHZhbGlkIERpc2tPbkNoaXAgZGV2aWNlcyBmb3VuZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0ZXJyOworCX0KKwlyZXR1cm4gMDsKK291dGVycjoKKwlmcmVlX3JzKHJzX2RlY29kZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX25hbmRkb2Modm9pZCkKK3sKKwkvKiBDbGVhbnVwIHRoZSBuYW5kL0RvQyByZXNvdXJjZXMgKi8KKwlyZWxlYXNlX25hbmRkb2MoKTsKKworCS8qIEZyZWUgdGhlIHJlZWQgc29sb21vbiByZXNvdXJjZXMgKi8KKwlpZiAocnNfZGVjb2RlcikgeworCQlmcmVlX3JzKHJzX2RlY29kZXIpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9uYW5kZG9jKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbmFuZGRvYyk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTS1TeXN0ZW1zIERpc2tPbkNoaXAgMjAwMCwgTWlsbGVubml1bSBhbmQgTWlsbGVubml1bSBQbHVzIGRldmljZSBkcml2ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmQuYyBiL2RyaXZlcnMvbmFuZC9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4MDAyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogMk4gVGVsZWtvbXVuaWthY2UsIGEucy4gPHd3dy4ybi5jej4KKyAqIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKKyNlcnJvciBDRkdfTkFORF9MRUdBQ1kgZGVmaW5lZCBpbiBhIGZpbGUgbm90IHVzaW5nIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0IQorI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCisjaW5jbHVkZSA8bmFuZC5oPgorCisjaWZuZGVmIENGR19OQU5EX0JBU0VfTElTVAorI2RlZmluZSBDRkdfTkFORF9CQVNFX0xJU1QgeyBDRkdfTkFORF9CQVNFIH0KKyNlbmRpZgorCitpbnQgbmFuZF9jdXJyX2RldmljZSA9IC0xOworbmFuZF9pbmZvX3QgbmFuZF9pbmZvW0NGR19NQVhfTkFORF9ERVZJQ0VdOworCitzdGF0aWMgc3RydWN0IG5hbmRfY2hpcCBuYW5kX2NoaXBbQ0ZHX01BWF9OQU5EX0RFVklDRV07CitzdGF0aWMgdWxvbmcgYmFzZV9hZGRyZXNzW0NGR19NQVhfTkFORF9ERVZJQ0VdID0gQ0ZHX05BTkRfQkFTRV9MSVNUOworCitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X25hbmRfbmFtZVtdID0gIm5hbmQiOworCitleHRlcm4gdm9pZCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCk7CisKK3N0YXRpYyB2b2lkIG5hbmRfaW5pdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLAorCQkJICAgdWxvbmcgYmFzZV9hZGRyKQoreworCW10ZC0+cHJpdiA9IG5hbmQ7CisKKwluYW5kLT5JT19BRERSX1IgPSBuYW5kLT5JT19BRERSX1cgPSAodm9pZCAgX19pb21lbSAqKWJhc2VfYWRkcjsKKwlib2FyZF9uYW5kX2luaXQobmFuZCk7CisKKwlpZiAobmFuZF9zY2FuKG10ZCwgMSkgPT0gMCkgeworCQlpZiAoIW10ZC0+bmFtZSkKKwkJCW10ZC0+bmFtZSA9IChjaGFyICopZGVmYXVsdF9uYW5kX25hbWU7CisJfSBlbHNlCisJCW10ZC0+bmFtZSA9IE5VTEw7CisKK30KKwordm9pZCBuYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfTkFORF9ERVZJQ0U7IGkrKykgeworCQluYW5kX2luaXRfY2hpcCgmbmFuZF9pbmZvW2ldLCAmbmFuZF9jaGlwW2ldLCBiYXNlX2FkZHJlc3NbaV0pOworCQlzaXplICs9IG5hbmRfaW5mb1tpXS5zaXplOworCQlpZiAobmFuZF9jdXJyX2RldmljZSA9PSAtMSkKKwkJCW5hbmRfY3Vycl9kZXZpY2UgPSBpOworfQorCXByaW50ZigiJWx1IE1pQlxuIiwgc2l6ZSAvICgxMDI0ICogMTAyNCkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNkNjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jCkBAIC0wLDAgKzEsMjY2NSBAQAorLyoKKyAqICBkcml2ZXJzL210ZC9uYW5kLmMKKyAqCisgKiAgT3ZlcnZpZXc6CisgKiAgIFRoaXMgaXMgdGhlIGdlbmVyaWMgTVREIGRyaXZlciBmb3IgTkFORCBmbGFzaCBkZXZpY2VzLiBJdCBzaG91bGQgYmUKKyAqICAgY2FwYWJsZSBvZiB3b3JraW5nIHdpdGggYWxtb3N0IGFsbCBOQU5EIGNoaXBzIGN1cnJlbnRseSBhdmFpbGFibGUuCisgKiAgIEJhc2ljIHN1cHBvcnQgZm9yIEFHLUFORCBjaGlwcyBpcyBwcm92aWRlZC4KKyAqCisgKglBZGRpdGlvbmFsIHRlY2huaWNhbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24KKyAqCWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvdGVjaC9uYW5kLmh0bWwKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tKQorICogCQkgIDIwMDIgVGhvbWFzIEdsZWl4bmVyICh0Z2x4QGxpbnV0cm9uaXguZGUpCisgKgorICogIDAyLTA4LTIwMDQgIHRnbHg6IHN1cHBvcnQgZm9yIHN0cmFuZ2UgY2hpcHMsIHdoaWNoIGNhbm5vdCBhdXRvIGluY3JlbWVudAorICoJCXBhZ2VzIG9uIHJlYWQgLyByZWFkX29vYgorICoKKyAqICAwMy0xNy0yMDA0ICB0Z2x4OiBDaGVjayByZWFkeSBiZWZvcmUgYXV0byBpbmNyZW1lbnQgY2hlY2suIFNpbW9uIEJheWVzCisgKgkJcG9pbnRlZCB0aGlzIG91dCwgYXMgaGUgbWFya2VkIGFuIGF1dG8gaW5jcmVtZW50IGNhcGFibGUgY2hpcAorICoJCWFzIE5PQVVUT0lOQ1IgaW4gdGhlIGJvYXJkIGRyaXZlci4KKyAqCQlNYWtlIHJlYWRzIG92ZXIgYmxvY2sgYm91bmRhcmllcyB3b3JrIHRvbworICoKKyAqICAwNC0xNC0yMDA0CXRnbHg6IGZpcnN0IHdvcmtpbmcgdmVyc2lvbiBmb3IgMmsgcGFnZSBzaXplIGNoaXBzCisgKgorICogIDA1LTE5LTIwMDQgIHRnbHg6IEJhc2ljIHN1cHBvcnQgZm9yIFJlbmVzYXMgQUctQU5EIGNoaXBzCisgKgorICogIDA5LTI0LTIwMDQgIHRnbHg6IGFkZCBzdXBwb3J0IGZvciBoYXJkd2FyZSBjb250cm9sbGVycyAoZS5nLiBFQ0MpIHNoYXJlZAorICoJCWFtb25nIG11bHRpcGxlIGluZGVwZW5kZW5kIGRldmljZXMuIFN1Z2dlc3Rpb25zIGFuZCBpbml0aWFsIHBhdGNoCisgKgkJZnJvbSBCZW4gRG9va3MgPGJlbi1tdGRAZmx1ZmYub3JnPgorICoKKyAqIENyZWRpdHM6CisgKglEYXZpZCBXb29kaG91c2UgZm9yIGFkZGluZyBtdWx0aWNoaXAgc3VwcG9ydAorICoKKyAqCUFsZXBoIE9uZSBMdGQuIGFuZCBUb2J5IENodXJjaGlsbCBMdGQuIGZvciBzdXBwb3J0aW5nIHRoZQorICoJcmV3b3JrIGZvciAySyBwYWdlIHNpemUgY2hpcHMKKyAqCisgKiBUT0RPOgorICoJRW5hYmxlIGNhY2hlZCBwcm9ncmFtbWluZyBmb3IgMmsgcGFnZSBzaXplIGNoaXBzCisgKglDaGVjaywgaWYgbXRkLT5lY2N0eXBlIHNob3VsZCBiZSBzZXQgdG8gTVREX0VDQ19IVworICoJaWYgd2UgaGF2ZSBIVyBlY2Mgc3VwcG9ydC4KKyAqCVRoZSBBRy1BTkQgY2hpcHMgaGF2ZSBuaWNlIGZlYXR1cmVzIGZvciBzcGVlZCBpbXByb3ZlbWVudCwKKyAqCXdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4gUmVhZCAvIHByb2dyYW0gNCBwYWdlcyBpbiBvbmUgZ28uCisgKgorICogJElkOiBuYW5kX2Jhc2UuYyx2IDEuMTI2IDIwMDQvMTIvMTMgMTE6MjI6MjUgbGF2aW5lbiBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKy8qIFhYWCBVLUJPT1QgWFhYICovCisjaWYgMAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXRtYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19OQU5EX0xFR0FDWQorI2Vycm9yIENGR19OQU5EX0xFR0FDWSBkZWZpbmVkIGluIGEgZmlsZSBub3QgdXNpbmcgdGhlIGxlZ2FjeSBOQU5EIHN1cHBvcnQhCisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaWZkZWYgQ09ORklHX0pGRlMyX05BTkQKKyNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgorI2VuZGlmCisKKy8qIERlZmluZSBkZWZhdWx0IG9vYiBwbGFjZW1lbnQgc2NoZW1lcyBmb3IgbGFyZ2UgYW5kIHNtYWxsIHBhZ2UgZGV2aWNlcyAqLworc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gbmFuZF9vb2JfOCA9IHsKKwkudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcyA9IDMsCisJLmVjY3BvcyA9IHswLCAxLCAyfSwKKwkub29iZnJlZSA9IHsgezMsIDJ9LCB7NiwgMn0gfQorfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX29vYmluZm8gbmFuZF9vb2JfMTYgPSB7CisJLnVzZWVjYyA9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMgPSA2LAorCS5lY2Nwb3MgPSB7MCwgMSwgMiwgMywgNiwgN30sCisJLm9vYmZyZWUgPSB7IHs4LCA4fSB9Cit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBuYW5kX29vYl82NCA9IHsKKwkudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcyA9IDI0LAorCS5lY2Nwb3MgPSB7CisJCTQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkJNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorCQk1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9LAorCS5vb2JmcmVlID0geyB7MiwgMzh9IH0KK307CisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgcGFkZGluZyBwdXJwb3NlcyBpbiBuYW5kX3dyaXRlX29vYiAqLworc3RhdGljIHVfY2hhciBmZmNoYXJzW10gPSB7CisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorfTsKKworLyoKKyAqIE5BTkQgbG93LWxldmVsIE1URCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBuYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaW50IG5hbmRfdmVyaWZ5X2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pOworCitzdGF0aWMgaW50IG5hbmRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1Zik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCSAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIGVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1Zik7CitzdGF0aWMgaW50IG5hbmRfd3JpdGUgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmKTsKK3N0YXRpYyBpbnQgbmFuZF93cml0ZV9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCQkgICBzaXplX3QgKiByZXRsZW4sIGNvbnN0IHVfY2hhciAqIGJ1ZiwgdV9jaGFyICogZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOworc3RhdGljIGludCBuYW5kX3dyaXRlX29vYiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1Zik7CisvKiBYWFggVS1CT09UIFhYWCAqLworI2lmIDAKK3N0YXRpYyBpbnQgbmFuZF93cml0ZXYgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKKwkJCXVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICogcmV0bGVuKTsKK3N0YXRpYyBpbnQgbmFuZF93cml0ZXZfZWNjIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgbmFuZF9lcmFzZSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cik7CitzdGF0aWMgdm9pZCBuYW5kX3N5bmMgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKworLyogU29tZSBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgbmFuZF93cml0ZV9wYWdlIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHBhZ2UsIHVfY2hhciAqb29iX2J1ZiwKKwkJc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsLCBpbnQgbW9kZSk7CisjaWZkZWYgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURQorc3RhdGljIGludCBuYW5kX3ZlcmlmeV9wYWdlcyAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBwYWdlLCBpbnQgbnVtcGFnZXMsCisJdV9jaGFyICpvb2JfYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwsIGludCBjaGlwbnIsIGludCBvb2Jtb2RlKTsKKyNlbHNlCisjZGVmaW5lIG5hbmRfdmVyaWZ5X3BhZ2VzKC4uLikgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgbmFuZF9nZXRfZGV2aWNlIChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG5ld19zdGF0ZSk7CisKKy8qKgorICogbmFuZF9yZWxlYXNlX2RldmljZSAtIFtHRU5FUklDXSByZWxlYXNlIGNoaXAKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogRGVzZWxlY3QsIHJlbGVhc2UgY2hpcCBsb2NrIGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UKKyAqLworLyogWFhYIFUtQk9PVCBYWFggKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBuYW5kX3JlbGVhc2VfZGV2aWNlIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCS8qIERvIHdlIGhhdmUgYSBoYXJkd2FyZSBjb250cm9sbGVyID8gKi8KKwlpZiAodGhpcy0+Y29udHJvbGxlcikgeworCQlzcGluX2xvY2soJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOworCQl0aGlzLT5jb250cm9sbGVyLT5hY3RpdmUgPSBOVUxMOworCQlzcGluX3VubG9jaygmdGhpcy0+Y29udHJvbGxlci0+bG9jayk7CisJfQorCS8qIFJlbGVhc2UgdGhlIGNoaXAgKi8KKwlzcGluX2xvY2sgKCZ0aGlzLT5jaGlwX2xvY2spOworCXRoaXMtPnN0YXRlID0gRkxfUkVBRFk7CisJd2FrZV91cCAoJnRoaXMtPndxKTsKKwlzcGluX3VubG9jayAoJnRoaXMtPmNoaXBfbG9jayk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgbmFuZF9yZWxlYXNlX2RldmljZSAoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl0aGlzLT5zZWxlY3RfY2hpcChtdGQsIC0xKTsJLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworfQorI2VuZGlmCisKKy8qKgorICogbmFuZF9yZWFkX2J5dGUgLSBbREVGQVVMVF0gcmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aXRoCisgKi8KK3N0YXRpYyB1X2NoYXIgbmFuZF9yZWFkX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlyZXR1cm4gcmVhZGIodGhpcy0+SU9fQUREUl9SKTsKK30KKworLyoqCisgKiBuYW5kX3dyaXRlX2J5dGUgLSBbREVGQVVMVF0gd3JpdGUgb25lIGJ5dGUgdG8gdGhlIGNoaXAKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnl0ZToJcG9pbnRlciB0byBkYXRhIGJ5dGUgdG8gd3JpdGUKKyAqCisgKiBEZWZhdWx0IHdyaXRlIGZ1bmN0aW9uIGZvciA4aXQgYnVzd2l0aAorICovCitzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciBieXRlKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJd3JpdGViKGJ5dGUsIHRoaXMtPklPX0FERFJfVyk7Cit9CisKKy8qKgorICogbmFuZF9yZWFkX2J5dGUxNiAtIFtERUZBVUxUXSByZWFkIG9uZSBieXRlIGVuZGlhbmVzcyBhd2FyZSBmcm9tIHRoZSBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRoCisgKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICovCitzdGF0aWMgdV9jaGFyIG5hbmRfcmVhZF9ieXRlMTYoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlyZXR1cm4gKHVfY2hhcikgY3B1X3RvX2xlMTYocmVhZHcodGhpcy0+SU9fQUREUl9SKSk7Cit9CisKKy8qKgorICogbmFuZF93cml0ZV9ieXRlMTYgLSBbREVGQVVMVF0gd3JpdGUgb25lIGJ5dGUgZW5kaWFuZXNzIGF3YXJlIHRvIHRoZSBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ5dGU6CXBvaW50ZXIgdG8gZGF0YSBieXRlIHRvIHdyaXRlCisgKgorICogRGVmYXVsdCB3cml0ZSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRoCisgKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICovCitzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX2J5dGUxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyIGJ5dGUpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl3cml0ZXcobGUxNl90b19jcHUoKHUxNikgYnl0ZSksIHRoaXMtPklPX0FERFJfVyk7Cit9CisKKy8qKgorICogbmFuZF9yZWFkX3dvcmQgLSBbREVGQVVMVF0gcmVhZCBvbmUgd29yZCBmcm9tIHRoZSBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRob3V0CisgKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICovCitzdGF0aWMgdTE2IG5hbmRfcmVhZF93b3JkKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJcmV0dXJuIHJlYWR3KHRoaXMtPklPX0FERFJfUik7Cit9CisKKy8qKgorICogbmFuZF93cml0ZV93b3JkIC0gW0RFRkFVTFRdIHdyaXRlIG9uZSB3b3JkIHRvIHRoZSBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHdvcmQ6CWRhdGEgd29yZCB0byB3cml0ZQorICoKKyAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGggd2l0aG91dAorICogZW5kaWFuZXNzIGNvbnZlcnNpb24KKyAqLworc3RhdGljIHZvaWQgbmFuZF93cml0ZV93b3JkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1MTYgd29yZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXdyaXRldyh3b3JkLCB0aGlzLT5JT19BRERSX1cpOworfQorCisvKioKKyAqIG5hbmRfc2VsZWN0X2NoaXAgLSBbREVGQVVMVF0gY29udHJvbCBDRSBsaW5lCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNoaXA6CWNoaXBudW1iZXIgdG8gc2VsZWN0LCAtMSBmb3IgZGVzZWxlY3QKKyAqCisgKiBEZWZhdWx0IHNlbGVjdCBmdW5jdGlvbiBmb3IgMSBjaGlwIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3dpdGNoKGNoaXApIHsKKwljYXNlIC0xOgorCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJOQ0UpOworCQlicmVhazsKKwljYXNlIDA6CisJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVE5DRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKioKKyAqIG5hbmRfd3JpdGVfYnVmIC0gW0RFRkFVTFRdIHdyaXRlIGJ1ZmZlciB0byBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICovCitzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGk7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQl3cml0ZWIoYnVmW2ldLCB0aGlzLT5JT19BRERSX1cpOworfQorCisvKioKKyAqIG5hbmRfcmVhZF9idWYgLSBbREVGQVVMVF0gcmVhZCBjaGlwIGRhdGEgaW50byBidWZmZXIKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgZGF0ZQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICovCitzdGF0aWMgdm9pZCBuYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCWJ1ZltpXSA9IHJlYWRiKHRoaXMtPklPX0FERFJfUik7Cit9CisKKy8qKgorICogbmFuZF92ZXJpZnlfYnVmIC0gW0RFRkFVTFRdIFZlcmlmeSBjaGlwIGRhdGEgYWdhaW5zdCBidWZmZXIKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCisgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICoKKyAqIERlZmF1bHQgdmVyaWZ5IGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpdGgKKyAqLworc3RhdGljIGludCBuYW5kX3ZlcmlmeV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJaWYgKGJ1ZltpXSAhPSByZWFkYih0aGlzLT5JT19BRERSX1IpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuYW5kX3dyaXRlX2J1ZjE2IC0gW0RFRkFVTFRdIHdyaXRlIGJ1ZmZlciB0byBjaGlwCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqLworc3RhdGljIHZvaWQgbmFuZF93cml0ZV9idWYxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGk7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1MTYgKnAgPSAodTE2ICopIGJ1ZjsKKwlsZW4gPj49IDE7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJd3JpdGV3KHBbaV0sIHRoaXMtPklPX0FERFJfVyk7CisKK30KKworLyoqCisgKiBuYW5kX3JlYWRfYnVmMTYgLSBbREVGQVVMVF0gcmVhZCBjaGlwIGRhdGEgaW50byBidWZmZXIKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgZGF0ZQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqLworc3RhdGljIHZvaWQgbmFuZF9yZWFkX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXUxNiAqcCA9ICh1MTYgKikgYnVmOworCWxlbiA+Pj0gMTsKKworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQlwW2ldID0gcmVhZHcodGhpcy0+SU9fQUREUl9SKTsKK30KKworLyoqCisgKiBuYW5kX3ZlcmlmeV9idWYxNiAtIFtERUZBVUxUXSBWZXJpZnkgY2hpcCBkYXRhIGFnYWluc3QgYnVmZmVyCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29tcGFyZQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKKyAqCisgKiBEZWZhdWx0IHZlcmlmeSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aAorICovCitzdGF0aWMgaW50IG5hbmRfdmVyaWZ5X2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXUxNiAqcCA9ICh1MTYgKikgYnVmOworCWxlbiA+Pj0gMTsKKworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQlpZiAocFtpXSAhPSByZWFkdyh0aGlzLT5JT19BRERSX1IpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuYW5kX2Jsb2NrX2JhZCAtIFtERUZBVUxUXSBSZWFkIGJhZCBibG9jayBtYXJrZXIgZnJvbSB0aGUgY2hpcAorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZnM6CW9mZnNldCBmcm9tIGRldmljZSBzdGFydAorICogQGdldGNoaXA6CTAsIGlmIHRoZSBjaGlwIGlzIGFscmVhZHkgc2VsZWN0ZWQKKyAqCisgKiBDaGVjaywgaWYgdGhlIGJsb2NrIGlzIGJhZC4KKyAqLworc3RhdGljIGludCBuYW5kX2Jsb2NrX2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgaW50IGdldGNoaXApCit7CisJaW50IHBhZ2UsIGNoaXBuciwgcmVzID0gMDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXUxNiBiYWQ7CisKKwlpZiAoZ2V0Y2hpcCkgeworCQlwYWdlID0gKGludCkob2ZzID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCQljaGlwbnIgPSAoaW50KShvZnMgPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisKKwkJLyogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlICovCisJCW5hbmRfZ2V0X2RldmljZSAodGhpcywgbXRkLCBGTF9SRUFESU5HKTsKKworCQkvKiBTZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKwl9IGVsc2UKKwkJcGFnZSA9IChpbnQpIG9mczsKKworCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgeworCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1JFQURPT0IsIHRoaXMtPmJhZGJsb2NrcG9zICYgMHhGRSwgcGFnZSAmIHRoaXMtPnBhZ2VtYXNrKTsKKwkJYmFkID0gY3B1X3RvX2xlMTYodGhpcy0+cmVhZF93b3JkKG10ZCkpOworCQlpZiAodGhpcy0+YmFkYmxvY2twb3MgJiAweDEpCisJCQliYWQgPj49IDE7CisJCWlmICgoYmFkICYgMHhGRikgIT0gMHhmZikKKwkJCXJlcyA9IDE7CisJfSBlbHNlIHsKKwkJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9SRUFET09CLCB0aGlzLT5iYWRibG9ja3BvcywgcGFnZSAmIHRoaXMtPnBhZ2VtYXNrKTsKKwkJaWYgKHRoaXMtPnJlYWRfYnl0ZShtdGQpICE9IDB4ZmYpCisJCQlyZXMgPSAxOworCX0KKworCWlmIChnZXRjaGlwKSB7CisJCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KKwkJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogbmFuZF9kZWZhdWx0X2Jsb2NrX21hcmtiYWQgLSBbREVGQVVMVF0gbWFyayBhIGJsb2NrIGJhZAorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZnM6CW9mZnNldCBmcm9tIGRldmljZSBzdGFydAorICoKKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5CisgKiBhIGhhcmR3YXJlIHNwZWNpZmljIGRyaXZlci4KKyovCitzdGF0aWMgaW50IG5hbmRfZGVmYXVsdF9ibG9ja19tYXJrYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdV9jaGFyIGJ1ZlsyXSA9IHswLCAwfTsKKwlzaXplX3QJcmV0bGVuOworCWludCBibG9jazsKKworCS8qIEdldCBibG9jayBudW1iZXIgKi8KKwlibG9jayA9ICgoaW50KSBvZnMpID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKKwl0aGlzLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlID8gKi8KKwlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVCkKKwkJcmV0dXJuIG5hbmRfdXBkYXRlX2JidCAobXRkLCBvZnMpOworCisJLyogV2Ugd3JpdGUgdHdvIGJ5dGVzLCBzbyB3ZSBkb250IGhhdmUgdG8gbWVzcyB3aXRoIDE2IGJpdCBhY2Nlc3MgKi8KKwlvZnMgKz0gbXRkLT5vb2JzaXplICsgKHRoaXMtPmJhZGJsb2NrcG9zICYgfjB4MDEpOworCXJldHVybiBuYW5kX3dyaXRlX29vYiAobXRkLCBvZnMgLCAyLCAmcmV0bGVuLCBidWYpOworfQorCisvKioKKyAqIG5hbmRfY2hlY2tfd3AgLSBbR0VORVJJQ10gY2hlY2sgaWYgdGhlIGNoaXAgaXMgd3JpdGUgcHJvdGVjdGVkCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkCisgKgorICogVGhlIGZ1bmN0aW9uIGV4cGVjdHMsIHRoYXQgdGhlIGRldmljZSBpcyBhbHJlYWR5IHNlbGVjdGVkCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9jaGVja193cCAoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwkvKiBDaGVjayB0aGUgV1AgYml0ICovCisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9TVEFUVVMsIC0xLCAtMSk7CisJcmV0dXJuICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIDB4ODApID8gMCA6IDE7Cit9CisKKy8qKgorICogbmFuZF9ibG9ja19jaGVja2JhZCAtIFtHRU5FUklDXSBDaGVjayBpZiBhIGJsb2NrIGlzIG1hcmtlZCBiYWQKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZzOglvZmZzZXQgZnJvbSBkZXZpY2Ugc3RhcnQKKyAqIEBnZXRjaGlwOgkwLCBpZiB0aGUgY2hpcCBpcyBhbHJlYWR5IHNlbGVjdGVkCisgKiBAYWxsb3diYnQ6CTEsIGlmIGl0cyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgYmJ0IGFyZWEKKyAqCisgKiBDaGVjaywgaWYgdGhlIGJsb2NrIGlzIGJhZC4gRWl0aGVyIGJ5IHJlYWRpbmcgdGhlIGJhZCBibG9jayB0YWJsZSBvcgorICogY2FsbGluZyBvZiB0aGUgc2NhbiBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBuYW5kX2Jsb2NrX2NoZWNrYmFkIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgaW50IGdldGNoaXAsIGludCBhbGxvd2JidCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJaWYgKCF0aGlzLT5iYnQpCisJCXJldHVybiB0aGlzLT5ibG9ja19iYWQobXRkLCBvZnMsIGdldGNoaXApOworCisJLyogUmV0dXJuIGluZm8gZnJvbSB0aGUgdGFibGUgKi8KKwlyZXR1cm4gbmFuZF9pc2JhZF9iYnQgKG10ZCwgb2ZzLCBhbGxvd2JidCk7Cit9CisKKy8qKgorICogbmFuZF9jb21tYW5kIC0gW0RFRkFVTFRdIFNlbmQgY29tbWFuZCB0byBOQU5EIGRldmljZQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjb21tYW5kOgl0aGUgY29tbWFuZCB0byBiZSBzZW50CisgKiBAY29sdW1uOgl0aGUgY29sdW1uIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQorICogQHBhZ2VfYWRkcjoJdGhlIHBhZ2UgYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCisgKgorICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNtYWxsIHBhZ2UKKyAqIGRldmljZXMgKDI1Ni81MTIgQnl0ZXMgcGVyIHBhZ2UpCisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCit7CisJcmVnaXN0ZXIgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworCS8qIEJlZ2luIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KKwl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOworCS8qCisJICogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCisJICovCisJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfU0VRSU4pIHsKKwkJaW50IHJlYWRjbWQ7CisKKwkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7CisJCQkvKiBPT0IgYXJlYSAqLworCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7CisJCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKKwkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKKwkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KKwkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKKwkJfSBlbHNlIHsKKwkJCWNvbHVtbiAtPSAyNTY7CisJCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7CisJCX0KKwkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIHJlYWRjbWQpOworCX0KKwl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29tbWFuZCk7CisKKwkvKiBTZXQgQUxFIGFuZCBjbGVhciBDTEUgdG8gc3RhcnQgYWRkcmVzcyBjeWNsZSAqLworCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7CisKKwlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgeworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRBTEUpOworCisJCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KKwkJaWYgKGNvbHVtbiAhPSAtMSkgeworCQkJLyogQWRqdXN0IGNvbHVtbnMgZm9yIDE2IGJpdCBidXN3aWR0aCAqLworCQkJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQorCQkJCWNvbHVtbiA+Pj0gMTsKKwkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb2x1bW4pOworCQl9CisJCWlmIChwYWdlX2FkZHIgIT0gLTEpIHsKKwkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKHBhZ2VfYWRkciAmIDB4ZmYpKTsKKwkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gOCkgJiAweGZmKSk7CisJCQkvKiBPbmUgbW9yZSBhZGRyZXNzIGN5Y2xlIGZvciBkZXZpY2VzID4gMzJNaUIgKi8KKwkJCWlmICh0aGlzLT5jaGlwc2l6ZSA+ICgzMiA8PCAyMCkpCisJCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiAxNikgJiAweDBmKSk7CisJCX0KKwkJLyogTGF0Y2ggaW4gYWRkcmVzcyAqLworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOworCX0KKworCS8qCisJICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycworCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQorCSovCisJc3dpdGNoIChjb21tYW5kKSB7CisKKwljYXNlIE5BTkRfQ01EX1BBR0VQUk9HOgorCWNhc2UgTkFORF9DTURfRVJBU0UxOgorCWNhc2UgTkFORF9DTURfRVJBU0UyOgorCWNhc2UgTkFORF9DTURfU0VRSU46CisJY2FzZSBOQU5EX0NNRF9TVEFUVVM6CisJCXJldHVybjsKKworCWNhc2UgTkFORF9DTURfUkVTRVQ6CisJCWlmICh0aGlzLT5kZXZfcmVhZHkpCisJCQlicmVhazsKKwkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOworCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKKwkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKKwkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOworCQlyZXR1cm47CisKKwkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLworCWRlZmF1bHQ6CisJCS8qCisJCSAqIElmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBidXN5IHBpbiwgd2UgYXBwbHkgdGhlIGdpdmVuCisJCSAqIGNvbW1hbmQgZGVsYXkKKwkJKi8KKwkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIHsKKwkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgorCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLworCW5kZWxheSAoMTAwKTsKKwkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCisJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7Cit9CisKKy8qKgorICogbmFuZF9jb21tYW5kX2xwIC0gW0RFRkFVTFRdIFNlbmQgY29tbWFuZCB0byBOQU5EIGxhcmdlIHBhZ2UgZGV2aWNlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNvbW1hbmQ6CXRoZSBjb21tYW5kIHRvIGJlIHNlbnQKKyAqIEBjb2x1bW46CXRoZSBjb2x1bW4gYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCisgKiBAcGFnZV9hZGRyOgl0aGUgcGFnZSBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKKyAqCisgKiBTZW5kIGNvbW1hbmQgdG8gTkFORCBkZXZpY2UuIFRoaXMgaXMgdGhlIHZlcnNpb24gZm9yIHRoZSBuZXcgbGFyZ2UgcGFnZSBkZXZpY2VzCisgKiBXZSBkb250IGhhdmUgdGhlIHNlcGVyYXRlIHJlZ2lvbnMgYXMgd2UgaGF2ZSBpbiB0aGUgc21hbGwgcGFnZSBkZXZpY2VzLgorICogV2UgbXVzdCBlbXVsYXRlIE5BTkRfQ01EX1JFQURPT0IgdG8ga2VlcCB0aGUgY29kZSBjb21wYXRpYmxlLgorICoKKyAqLworc3RhdGljIHZvaWQgbmFuZF9jb21tYW5kX2xwIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwgaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJLyogRW11bGF0ZSBOQU5EX0NNRF9SRUFET09CICovCisJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfUkVBRE9PQikgeworCQljb2x1bW4gKz0gbXRkLT5vb2JibG9jazsKKwkJY29tbWFuZCA9IE5BTkRfQ01EX1JFQUQwOworCX0KKworCisJLyogQmVnaW4gY29tbWFuZCBsYXRjaCBjeWNsZSAqLworCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CisJLyogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuICovCisJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbW1hbmQpOworCS8qIEVuZCBjb21tYW5kIGxhdGNoIGN5Y2xlICovCisJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKKworCWlmIChjb2x1bW4gIT0gLTEgfHwgcGFnZV9hZGRyICE9IC0xKSB7CisJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVEFMRSk7CisKKwkJLyogU2VyaWFsbHkgaW5wdXQgYWRkcmVzcyAqLworCQlpZiAoY29sdW1uICE9IC0xKSB7CisJCQkvKiBBZGp1c3QgY29sdW1ucyBmb3IgMTYgYml0IGJ1c3dpZHRoICovCisJCQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpCisJCQkJY29sdW1uID4+PSAxOworCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbHVtbiAmIDB4ZmYpOworCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbHVtbiA+PiA4KTsKKwkJfQorCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7CisJCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpIChwYWdlX2FkZHIgJiAweGZmKSk7CisJCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDgpICYgMHhmZikpOworCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgZGV2aWNlcyA+IDEyOE1pQiAqLworCQkJaWYgKHRoaXMtPmNoaXBzaXplID4gKDEyOCA8PCAyMCkpCisJCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiAxNikgJiAweGZmKSk7CisJCX0KKwkJLyogTGF0Y2ggaW4gYWRkcmVzcyAqLworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOworCX0KKworCS8qCisJICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycworCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQorCSovCisJc3dpdGNoIChjb21tYW5kKSB7CisKKwljYXNlIE5BTkRfQ01EX0NBQ0hFRFBST0c6CisJY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzoKKwljYXNlIE5BTkRfQ01EX0VSQVNFMToKKwljYXNlIE5BTkRfQ01EX0VSQVNFMjoKKwljYXNlIE5BTkRfQ01EX1NFUUlOOgorCWNhc2UgTkFORF9DTURfU1RBVFVTOgorCQlyZXR1cm47CisKKworCWNhc2UgTkFORF9DTURfUkVTRVQ6CisJCWlmICh0aGlzLT5kZXZfcmVhZHkpCisJCQlicmVhazsKKwkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOworCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKKwkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKKwkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOworCQlyZXR1cm47CisKKwljYXNlIE5BTkRfQ01EX1JFQUQwOgorCQkvKiBCZWdpbiBjb21tYW5kIGxhdGNoIGN5Y2xlICovCisJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CisJCS8qIFdyaXRlIG91dCB0aGUgc3RhcnQgcmVhZCBjb21tYW5kICovCisJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9SRUFEU1RBUlQpOworCQkvKiBFbmQgY29tbWFuZCBsYXRjaCBjeWNsZSAqLworCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOworCQkvKiBGYWxsIHRocm91Z2ggaW50byByZWFkeSBjaGVjayAqLworCisJLyogVGhpcyBhcHBsaWVzIHRvIHJlYWQgY29tbWFuZHMgKi8KKwlkZWZhdWx0OgorCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgorCQkgKiBjb21tYW5kIGRlbGF5CisJCSovCisJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSB7CisJCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KKwkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KKwluZGVsYXkgKDEwMCk7CisJLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLworCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworfQorCisvKioKKyAqIG5hbmRfZ2V0X2RldmljZSAtIFtHRU5FUklDXSBHZXQgY2hpcCBmb3Igc2VsZWN0ZWQgYWNjZXNzCisgKiBAdGhpczoJdGhlIG5hbmQgY2hpcCBkZXNjcmlwdG9yCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19zdGF0ZToJdGhlIHN0YXRlIHdoaWNoIGlzIHJlcXVlc3RlZAorICoKKyAqIEdldCB0aGUgZGV2aWNlIGFuZCBsb2NrIGl0IGZvciBleGNsdXNpdmUgYWNjZXNzCisgKi8KKy8qIFhYWCBVLUJPT1QgWFhYICovCisjaWYgMAorc3RhdGljIHZvaWQgbmFuZF9nZXRfZGV2aWNlIChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICphY3RpdmUgPSB0aGlzOworCisJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOworCisJLyoKKwkgKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUKKwkqLworcmV0cnk6CisJLyogSGFyZHdhcmUgY29udHJvbGxlciBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbmQgZGV2aWNlcyAqLworCWlmICh0aGlzLT5jb250cm9sbGVyKSB7CisJCXNwaW5fbG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOworCQlpZiAodGhpcy0+Y29udHJvbGxlci0+YWN0aXZlKQorCQkJYWN0aXZlID0gdGhpcy0+Y29udHJvbGxlci0+YWN0aXZlOworCQllbHNlCisJCQl0aGlzLT5jb250cm9sbGVyLT5hY3RpdmUgPSB0aGlzOworCQlzcGluX3VubG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOworCX0KKworCWlmIChhY3RpdmUgPT0gdGhpcykgeworCQlzcGluX2xvY2sgKCZ0aGlzLT5jaGlwX2xvY2spOworCQlpZiAodGhpcy0+c3RhdGUgPT0gRkxfUkVBRFkpIHsKKwkJCXRoaXMtPnN0YXRlID0gbmV3X3N0YXRlOworCQkJc3Bpbl91bmxvY2sgKCZ0aGlzLT5jaGlwX2xvY2spOworCQkJcmV0dXJuOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUgKCZhY3RpdmUtPndxLCAmd2FpdCk7CisJc3Bpbl91bmxvY2sgKCZhY3RpdmUtPmNoaXBfbG9jayk7CisJc2NoZWR1bGUgKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUgKCZhY3RpdmUtPndxLCAmd2FpdCk7CisJZ290byByZXRyeTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBuYW5kX2dldF9kZXZpY2UgKHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbmV3X3N0YXRlKSB7fQorI2VuZGlmCisKKy8qKgorICogbmFuZF93YWl0IC0gW0RFRkFVTFRdICB3YWl0IHVudGlsIHRoZSBjb21tYW5kIGlzIGRvbmUKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGhpczoJTkFORCBjaGlwIHN0cnVjdHVyZQorICogQHN0YXRlOglzdGF0ZSB0byBzZWxlY3QgdGhlIG1heC4gdGltZW91dCB2YWx1ZQorICoKKyAqIFdhaXQgZm9yIGNvbW1hbmQgZG9uZS4gVGhpcyBhcHBsaWVzIHRvIGVyYXNlIGFuZCBwcm9ncmFtIG9ubHkKKyAqIEVyYXNlIGNhbiB0YWtlIHVwIHRvIDQwMG1zIGFuZCBwcm9ncmFtIHVwIHRvIDIwbXMgYWNjb3JkaW5nIHRvCisgKiBnZW5lcmFsIE5BTkQgYW5kIFNtYXJ0TWVkaWEgc3BlY3MKKyAqCisqLworLyogWFhYIFUtQk9PVCBYWFggKi8KKyNpZiAwCitzdGF0aWMgaW50IG5hbmRfd2FpdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcJdGltZW8gPSBqaWZmaWVzOworCWludAlzdGF0dXM7CisKKwlpZiAoc3RhdGUgPT0gRkxfRVJBU0lORykKKwkJIHRpbWVvICs9IChIWiAqIDQwMCkgLyAxMDAwOworCWVsc2UKKwkJIHRpbWVvICs9IChIWiAqIDIwKSAvIDEwMDA7CisKKwkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgorCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLworCW5kZWxheSAoMTAwKTsKKworCWlmICgoc3RhdGUgPT0gRkxfRVJBU0lORykgJiYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0lTX0FORCkpCisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX01VTFRJLCAtMSwgLTEpOworCWVsc2UKKwkJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9TVEFUVVMsIC0xLCAtMSk7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW8pKSB7CisJCS8qIENoZWNrLCBpZiB3ZSB3ZXJlIGludGVycnVwdGVkICovCisJCWlmICh0aGlzLT5zdGF0ZSAhPSBzdGF0ZSkKKwkJCXJldHVybiAwOworCisJCWlmICh0aGlzLT5kZXZfcmVhZHkpIHsKKwkJCWlmICh0aGlzLT5kZXZfcmVhZHkobXRkKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1JFQURZKQorCQkJCWJyZWFrOworCQl9CisJCXlpZWxkICgpOworCX0KKwlzdGF0dXMgPSAoaW50KSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBuYW5kX3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nCXRpbWVvOworCisJaWYgKHN0YXRlID09IEZMX0VSQVNJTkcpCisJCXRpbWVvID0gQ0ZHX0haICogNDAwOworCWVsc2UKKwkJdGltZW8gPSBDRkdfSFogKiAyMDsKKworCWlmICgoc3RhdGUgPT0gRkxfRVJBU0lORykgJiYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0lTX0FORCkpCisJCXRoaXMtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9TVEFUVVNfTVVMVEksIC0xLCAtMSk7CisJZWxzZQorCQl0aGlzLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfU1RBVFVTLCAtMSwgLTEpOworCisJcmVzZXRfdGltZXIoKTsKKworCXdoaWxlICgxKSB7CisJCWlmIChnZXRfdGltZXIoMCkgPiB0aW1lbykgeworCQkJcHJpbnRmKCJUaW1lb3V0ISIpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKHRoaXMtPmRldl9yZWFkeSkgeworCQkJaWYgKHRoaXMtPmRldl9yZWFkeShtdGQpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgTkFORF9TVEFUVVNfUkVBRFkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgUFBDSEFNRUxPTl9OQU5EX1RJTUVSX0hBQ0sKKwlyZXNldF90aW1lcigpOworCXdoaWxlIChnZXRfdGltZXIoMCkgPCAxMCk7CisjZW5kaWYgLyogIFBQQ0hBTUVMT05fTkFORF9USU1FUl9IQUNLICovCisKKwlyZXR1cm4gdGhpcy0+cmVhZF9ieXRlKG10ZCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBuYW5kX3dyaXRlX3BhZ2UgLSBbR0VORVJJQ10gd3JpdGUgb25lIHBhZ2UKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGhpczoJTkFORCBjaGlwIHN0cnVjdHVyZQorICogQHBhZ2U6IAlzdGFydHBhZ2UgaW5zaWRlIHRoZSBjaGlwLCBtdXN0IGJlIGNhbGxlZCB3aXRoIChwYWdlICYgdGhpcy0+cGFnZW1hc2spCisgKiBAb29iX2J1ZjoJb3V0IG9mIGJhbmQgZGF0YSBidWZmZXIKKyAqIEBvb2JzZWw6CW91dCBvZiBiYW5kIHNlbGVjdHRpb24gc3RydWN0cmUKKyAqIEBjYWNoZWQ6CTEgPSBlbmFibGUgY2FjaGVkIHByb2dyYW1taW5nIGlmIHN1cHBvcnRlZCBieSBjaGlwCisgKgorICogTmFuZF9wYWdlX3Byb2dyYW0gZnVuY3Rpb24gaXMgdXNlZCBmb3Igd3JpdGUgYW5kIHdyaXRldiAhCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHByb2dyYW0gYSBmdWxsIHBhZ2Ugb2YgZGF0YQorICogSWYgeW91IGNhbGwgaXQgd2l0aCBhIG5vbiBwYWdlIGFsaWduZWQgYnVmZmVyLCB5b3UncmUgbG9zdCA6KQorICoKKyAqIENhY2hlZCBwcm9ncmFtbWluZyBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyAqLworc3RhdGljIGludCBuYW5kX3dyaXRlX3BhZ2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBpbnQgcGFnZSwKKwl1X2NoYXIgKm9vYl9idWYsICBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwsIGludCBjYWNoZWQpCit7CisJaW50IAlpLCBzdGF0dXM7CisJdV9jaGFyCWVjY19jb2RlWzMyXTsKKwlpbnQJZWNjbW9kZSA9IG9vYnNlbC0+dXNlZWNjID8gdGhpcy0+ZWNjbW9kZSA6IE5BTkRfRUNDX05PTkU7CisJaW50ICAJKm9vYl9jb25maWcgPSBvb2JzZWwtPmVjY3BvczsKKwlpbnQJZGF0aWR4ID0gMCwgZWNjaWR4ID0gMCwgZWNjc3RlcHMgPSB0aGlzLT5lY2NzdGVwczsKKwlpbnQJZWNjYnl0ZXMgPSAwOworCisJLyogRklYTUU6IEVuYWJsZSBjYWNoZWQgcHJvZ3JhbW1pbmcgKi8KKwljYWNoZWQgPSAwOworCisJLyogU2VuZCBjb21tYW5kIHRvIGJlZ2luIGF1dG8gcGFnZSBwcm9ncmFtbWluZyAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU0VRSU4sIDB4MDAsIHBhZ2UpOworCisJLyogV3JpdGUgb3V0IGNvbXBsZXRlIHBhZ2Ugb2YgZGF0YSwgdGFrZSBjYXJlIG9mIGVjY21vZGUgKi8KKwlzd2l0Y2ggKGVjY21vZGUpIHsKKwkvKiBObyBlY2MsIHdyaXRlIGFsbCAqLworCWNhc2UgTkFORF9FQ0NfTk9ORToKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIldyaXRpbmcgZGF0YSB3aXRob3V0IEVDQyB0byBOQU5ELUZMQVNIIGlzIG5vdCByZWNvbW1lbmRlZFxuIik7CisJCXRoaXMtPndyaXRlX2J1ZihtdGQsIHRoaXMtPmRhdGFfcG9pLCBtdGQtPm9vYmJsb2NrKTsKKwkJYnJlYWs7CisKKwkvKiBTb2Z0d2FyZSBlY2MgMy8yNTYsIHdyaXRlIGFsbCAqLworCWNhc2UgTkFORF9FQ0NfU09GVDoKKwkJZm9yICg7IGVjY3N0ZXBzOyBlY2NzdGVwcy0tKSB7CisJCQl0aGlzLT5jYWxjdWxhdGVfZWNjKG10ZCwgJnRoaXMtPmRhdGFfcG9pW2RhdGlkeF0sIGVjY19jb2RlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyssIGVjY2lkeCsrKQorCQkJCW9vYl9idWZbb29iX2NvbmZpZ1tlY2NpZHhdXSA9IGVjY19jb2RlW2ldOworCQkJZGF0aWR4ICs9IHRoaXMtPmVjY3NpemU7CisJCX0KKwkJdGhpcy0+d3JpdGVfYnVmKG10ZCwgdGhpcy0+ZGF0YV9wb2ksIG10ZC0+b29iYmxvY2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY2NieXRlcyA9IHRoaXMtPmVjY2J5dGVzOworCQlmb3IgKDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0pIHsKKwkJCS8qIGVuYWJsZSBoYXJkd2FyZSBlY2MgbG9naWMgZm9yIHdyaXRlICovCisJCQl0aGlzLT5lbmFibGVfaHdlY2MobXRkLCBOQU5EX0VDQ19XUklURSk7CisJCQl0aGlzLT53cml0ZV9idWYobXRkLCAmdGhpcy0+ZGF0YV9wb2lbZGF0aWR4XSwgdGhpcy0+ZWNjc2l6ZSk7CisJCQl0aGlzLT5jYWxjdWxhdGVfZWNjKG10ZCwgJnRoaXMtPmRhdGFfcG9pW2RhdGlkeF0sIGVjY19jb2RlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBlY2NieXRlczsgaSsrLCBlY2NpZHgrKykKKwkJCQlvb2JfYnVmW29vYl9jb25maWdbZWNjaWR4XV0gPSBlY2NfY29kZVtpXTsKKwkJCS8qIElmIHRoZSBoYXJkd2FyZSBlY2MgcHJvdmlkZXMgc3luZHJvbWVzIHRoZW4KKwkJCSAqIHRoZSBlY2MgY29kZSBtdXN0IGJlIHdyaXR0ZW4gaW1taWRpYXRlbHkgYWZ0ZXIKKwkJCSAqIHRoZSBkYXRhIGJ5dGVzICh3b3JkcykgKi8KKwkJCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9IV0VDQ19TWU5EUk9NRSkKKwkJCQl0aGlzLT53cml0ZV9idWYobXRkLCBlY2NfY29kZSwgZWNjYnl0ZXMpOworCQkJZGF0aWR4ICs9IHRoaXMtPmVjY3NpemU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogV3JpdGUgb3V0IE9PQiBkYXRhICovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0hXRUNDX1NZTkRST01FKQorCQl0aGlzLT53cml0ZV9idWYobXRkLCAmb29iX2J1Zltvb2JzZWwtPmVjY2J5dGVzXSwgbXRkLT5vb2JzaXplIC0gb29ic2VsLT5lY2NieXRlcyk7CisJZWxzZQorCQl0aGlzLT53cml0ZV9idWYobXRkLCBvb2JfYnVmLCBtdGQtPm9vYnNpemUpOworCisJLyogU2VuZCBjb21tYW5kIHRvIGFjdHVhbGx5IHByb2dyYW0gdGhlIGRhdGEgKi8KKwl0aGlzLT5jbWRmdW5jIChtdGQsIGNhY2hlZCA/IE5BTkRfQ01EX0NBQ0hFRFBST0cgOiBOQU5EX0NNRF9QQUdFUFJPRywgLTEsIC0xKTsKKworCWlmICghY2FjaGVkKSB7CisJCS8qIGNhbGwgd2FpdCByZWFkeSBmdW5jdGlvbiAqLworCQlzdGF0dXMgPSB0aGlzLT53YWl0ZnVuYyAobXRkLCB0aGlzLCBGTF9XUklUSU5HKTsKKwkJLyogU2VlIGlmIGRldmljZSB0aGlua3MgaXQgc3VjY2VlZGVkICovCisJCWlmIChzdGF0dXMgJiAweDAxKSB7CisJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiAiICJGYWlsZWQgd3JpdGUsIHBhZ2UgMHglMDh4LCAiLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQkvKiBGSVhNRTogSW1wbGVtZW50IGNhY2hlZCBwcm9ncmFtbWluZyAhICovCisJCS8qIHdhaXQgdW50aWwgY2FjaGUgaXMgcmVhZHkqLworCQkvKiBzdGF0dXMgPSB0aGlzLT53YWl0ZnVuYyAobXRkLCB0aGlzLCBGTF9DQUNIRURSUEcpOyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUKKy8qKgorICogbmFuZF92ZXJpZnlfcGFnZXMgLSBbR0VORVJJQ10gdmVyaWZ5IHRoZSBjaGlwIGNvbnRlbnRzIGFmdGVyIGEgd3JpdGUKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGhpczoJTkFORCBjaGlwIHN0cnVjdHVyZQorICogQHBhZ2U6IAlzdGFydHBhZ2UgaW5zaWRlIHRoZSBjaGlwLCBtdXN0IGJlIGNhbGxlZCB3aXRoIChwYWdlICYgdGhpcy0+cGFnZW1hc2spCisgKiBAbnVtcGFnZXM6CW51bWJlciBvZiBwYWdlcyB0byB2ZXJpZnkKKyAqIEBvb2JfYnVmOglvdXQgb2YgYmFuZCBkYXRhIGJ1ZmZlcgorICogQG9vYnNlbDoJb3V0IG9mIGJhbmQgc2VsZWN0dGlvbiBzdHJ1Y3RyZQorICogQGNoaXBucjoJbnVtYmVyIG9mIHRoZSBjdXJyZW50IGNoaXAKKyAqIEBvb2Jtb2RlOgkxID0gZnVsbCBidWZmZXIgdmVyaWZ5LCAwID0gZWNjIG9ubHkKKyAqCisgKiBUaGUgTkFORCBkZXZpY2UgYXNzdW1lcyB0aGF0IGl0IGlzIGFsd2F5cyB3cml0aW5nIHRvIGEgY2xlYW5seSBlcmFzZWQgcGFnZS4KKyAqIEhlbmNlLCBpdCBwZXJmb3JtcyBpdHMgaW50ZXJuYWwgd3JpdGUgdmVyaWZpY2F0aW9uIG9ubHkgb24gYml0cyB0aGF0CisgKiB0cmFuc2l0aW9uZWQgZnJvbSAxIHRvIDAuIFRoZSBkZXZpY2UgZG9lcyBOT1QgdmVyaWZ5IHRoZSB3aG9sZSBwYWdlIG9uIGEKKyAqIGJ5dGUgYnkgYnl0ZSBiYXNpcy4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcGFnZSB3YXMgbm90IGNvbXBsZXRlbHkgZXJhc2VkCisgKiBvciB0aGUgcGFnZSBpcyBiZWNvbWluZyB1bnVzYWJsZSBkdWUgdG8gd2Vhci4gVGhlIHJlYWQgd2l0aCBFQ0Mgd291bGQgY2F0Y2gKKyAqIHRoZSBlcnJvciBsYXRlciB3aGVuIHRoZSBFQ0MgcGFnZSBjaGVjayBmYWlscywgYnV0IHdlIHdvdWxkIHJhdGhlciBjYXRjaAorICogaXQgZWFybHkgaW4gdGhlIHBhZ2Ugd3JpdGUgc3RhZ2UuIEJldHRlciB0byB3cml0ZSBubyBkYXRhIHRoYW4gaW52YWxpZCBkYXRhLgorICovCitzdGF0aWMgaW50IG5hbmRfdmVyaWZ5X3BhZ2VzIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgaW50IHBhZ2UsIGludCBudW1wYWdlcywKKwl1X2NoYXIgKm9vYl9idWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCwgaW50IGNoaXBuciwgaW50IG9vYm1vZGUpCit7CisJaW50IAlpLCBqLCBkYXRpZHggPSAwLCBvb2JvZnMgPSAwLCByZXMgPSAtRUlPOworCWludAllY2NzdGVwcyA9IHRoaXMtPmVjY3N0ZXBzOworCWludAlod2VjY2J5dGVzOworCXVfY2hhciAJb29iZGF0YVs2NF07CisKKwlod2VjY2J5dGVzID0gKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0hXRUNDX1NZTkRST01FKSA/IChvb2JzZWwtPmVjY2J5dGVzIC8gZWNjc3RlcHMpIDogMDsKKworCS8qIFNlbmQgY29tbWFuZCB0byByZWFkIGJhY2sgdGhlIGZpcnN0IHBhZ2UgKi8KKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1JFQUQwLCAwLCBwYWdlKTsKKworCWZvcig7OykgeworCQlmb3IgKGogPSAwOyBqIDwgZWNjc3RlcHM7IGorKykgeworCQkJLyogTG9vcCB0aHJvdWdoIGFuZCB2ZXJpZnkgdGhlIGRhdGEgKi8KKwkJCWlmICh0aGlzLT52ZXJpZnlfYnVmKG10ZCwgJnRoaXMtPmRhdGFfcG9pW2RhdGlkeF0sIG10ZC0+ZWNjc2l6ZSkpIHsKKwkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiAiICJGYWlsZWQgd3JpdGUgdmVyaWZ5LCBwYWdlIDB4JTA4eCAiLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZGF0aWR4ICs9IG10ZC0+ZWNjc2l6ZTsKKwkJCS8qIEhhdmUgd2UgYSBodyBnZW5lcmF0b3IgbGF5b3V0ID8gKi8KKwkJCWlmICghaHdlY2NieXRlcykKKwkJCQljb250aW51ZTsKKwkJCWlmICh0aGlzLT52ZXJpZnlfYnVmKG10ZCwgJnRoaXMtPm9vYl9idWZbb29ib2ZzXSwgaHdlY2NieXRlcykpIHsKKwkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiAiICJGYWlsZWQgd3JpdGUgdmVyaWZ5LCBwYWdlIDB4JTA4eCAiLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJb29ib2ZzICs9IGh3ZWNjYnl0ZXM7CisJCX0KKworCQkvKiBjaGVjaywgaWYgd2UgbXVzdCBjb21wYXJlIGFsbCBkYXRhIG9yIGlmIHdlIGp1c3QgaGF2ZSB0bworCQkgKiBjb21wYXJlIHRoZSBlY2MgYnl0ZXMKKwkJICovCisJCWlmIChvb2Jtb2RlKSB7CisJCQlpZiAodGhpcy0+dmVyaWZ5X2J1ZihtdGQsICZvb2JfYnVmW29vYm9mc10sIG10ZC0+b29ic2l6ZSAtIGh3ZWNjYnl0ZXMgKiBlY2NzdGVwcykpIHsKKwkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiAiICJGYWlsZWQgd3JpdGUgdmVyaWZ5LCBwYWdlIDB4JTA4eCAiLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUmVhZCBhbHdheXMsIGVsc2UgYXV0b2luY3JlbWVudCBmYWlscyAqLworCQkJdGhpcy0+cmVhZF9idWYobXRkLCBvb2JkYXRhLCBtdGQtPm9vYnNpemUgLSBod2VjY2J5dGVzICogZWNjc3RlcHMpOworCisJCQlpZiAob29ic2VsLT51c2VlY2MgIT0gTVREX05BTkRFQ0NfT0ZGICYmICFod2VjY2J5dGVzKSB7CisJCQkJaW50IGVjY2NudCA9IG9vYnNlbC0+ZWNjYnl0ZXM7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgZWNjY250OyBpKyspIHsKKwkJCQkJaW50IGlkeCA9IG9vYnNlbC0+ZWNjcG9zW2ldOworCQkJCQlpZiAob29iZGF0YVtpZHhdICE9IG9vYl9idWZbb29ib2ZzICsgaWR4XSApIHsKKwkJCQkJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLAorCQkJCQkgICAgICAgCSIlczogRmFpbGVkIEVDQyB3cml0ZSAiCisJCQkJCQkidmVyaWZ5LCBwYWdlIDB4JTA4eCwgIiAiJTZpIGJ5dGVzIHdlcmUgc3VjY2VzZnVsXG4iLCBfX0ZVTkNUSU9OX18sIHBhZ2UsIGkpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJb29ib2ZzICs9IG10ZC0+b29ic2l6ZSAtIGh3ZWNjYnl0ZXMgKiBlY2NzdGVwczsKKwkJcGFnZSsrOworCQludW1wYWdlcy0tOworCisJCS8qIEFwcGx5IGRlbGF5IG9yIHdhaXQgZm9yIHJlYWR5L2J1c3kgcGluCisJCSAqIERvIHRoaXMgYmVmb3JlIHRoZSBBVVRPSU5DUiBjaGVjaywgc28gbm8gcHJvYmxlbXMKKwkJICogYXJpc2UgaWYgYSBjaGlwIHdoaWNoIGRvZXMgYXV0byBpbmNyZW1lbnQKKwkJICogaXMgbWFya2VkIGFzIE5PQVVUT0lOQ1IgYnkgdGhlIGJvYXJkIGRyaXZlci4KKwkJICogRG8gdGhpcyBhbHNvIGJlZm9yZSByZXR1cm5pbmcsIHNvIHRoZSBjaGlwIGlzCisJCSAqIHJlYWR5IGZvciB0aGUgbmV4dCBjb21tYW5kLgorCQkqLworCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkKKwkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CisJCWVsc2UKKwkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJCS8qIEFsbCBkb25lLCByZXR1cm4gaGFwcHkgKi8KKwkJaWYgKCFudW1wYWdlcykKKwkJCXJldHVybiAwOworCisKKwkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQgKi8KKwkJaWYgKCFOQU5EX0NBTkFVVE9JTkNSKHRoaXMpKQorCQkJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9SRUFEMCwgMHgwMCwgcGFnZSk7CisJfQorCS8qCisJICogVGVybWluYXRlIHRoZSByZWFkIGNvbW1hbmQuIFdlIGNvbWUgaGVyZSBpbiBjYXNlIG9mIGFuIGVycm9yCisJICogU28gd2UgbXVzdCBpc3N1ZSBhIHJlc2V0IGNvbW1hbmQuCisJICovCitvdXQ6CisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9SRVNFVCwgLTEsIC0xKTsKKwlyZXR1cm4gcmVzOworfQorI2VuZGlmCisKKy8qKgorICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9yZWFkX2VjYworICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCisgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMKKyAqIEBidWY6CXRoZSBkYXRhYnVmZmVyIHRvIHB1dCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9yZWFkX2VjYyB3aXRoIG9vYiBidWZmZXIgYW5kIG9vYnNlbCA9IE5VTEwKKyovCitzdGF0aWMgaW50IG5hbmRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1ZikKK3sKKwlyZXR1cm4gbmFuZF9yZWFkX2VjYyAobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBOVUxMKTsKK30KKworCisvKioKKyAqIG5hbmRfcmVhZF9lY2MgLSBbTVREIEludGVyZmFjZV0gUmVhZCBkYXRhIHdpdGggRUNDCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcworICogQGJ1ZjoJdGhlIGRhdGFidWZmZXIgdG8gcHV0IGRhdGEKKyAqIEBvb2JfYnVmOglmaWxlc3lzdGVtIHN1cHBsaWVkIG9vYiBkYXRhIGJ1ZmZlcgorICogQG9vYnNlbDoJb29iIHNlbGVjdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBOQU5EIHJlYWQgd2l0aCBFQ0MKKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfZWNjIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQkgIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBvb2JfYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpCit7CisJaW50IGksIGosIGNvbCwgcmVhbHBhZ2UsIHBhZ2UsIGVuZCwgZWNjLCBjaGlwbnIsIHNuZGNtZCA9IDE7CisJaW50IHJlYWQgPSAwLCBvb2IgPSAwLCBlY2Nfc3RhdHVzID0gMCwgZWNjX2ZhaWxlZCA9IDA7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1X2NoYXIgKmRhdGFfcG9pLCAqb29iX2RhdGEgPSBvb2JfYnVmOworCXVfY2hhciBlY2NfY2FsY1szMl07CisJdV9jaGFyIGVjY19jb2RlWzMyXTsKKwlpbnQgZWNjbW9kZSwgZWNjc3RlcHM7CisJaW50CSpvb2JfY29uZmlnLCBkYXRpZHg7CisJaW50CWJsb2NrY2hlY2sgPSAoMSA8PCAodGhpcy0+cGh5c19lcmFzZV9zaGlmdCAtIHRoaXMtPnBhZ2Vfc2hpZnQpKSAtIDE7CisJaW50CWVjY2J5dGVzOworCWludAljb21wYXJlZWNjID0gMTsKKwlpbnQJb29icmVhZGxlbjsKKworCisJREVCVUcgKE1URF9ERUJVR19MRVZFTDMsICJuYW5kX3JlYWRfZWNjOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgZnJvbSwgKGludCkgbGVuKTsKKworCS8qIERvIG5vdCBhbGxvdyByZWFkcyBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KKwlpZiAoKGZyb20gKyBsZW4pID4gbXRkLT5zaXplKSB7CisJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAibmFuZF9yZWFkX2VjYzogQXR0ZW1wdCByZWFkIGJleW9uZCBlbmQgb2YgZGV2aWNlXG4iKTsKKwkJKnJldGxlbiA9IDA7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdyYWIgdGhlIGxvY2sgYW5kIHNlZSBpZiB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZSAqLworCW5hbmRfZ2V0X2RldmljZSAodGhpcywgbXRkICxGTF9SRUFESU5HKTsKKworCS8qIHVzZSB1c2Vyc3BhY2Ugc3VwcGxpZWQgb29iaW5mbywgaWYgemVybyAqLworCWlmIChvb2JzZWwgPT0gTlVMTCkKKwkJb29ic2VsID0gJm10ZC0+b29iaW5mbzsKKworCS8qIEF1dG9wbGFjZSBvZiBvb2IgZGF0YSA/IFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lICovCisJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkKKwkJb29ic2VsID0gdGhpcy0+YXV0b29vYjsKKworCWVjY21vZGUgPSBvb2JzZWwtPnVzZWVjYyA/IHRoaXMtPmVjY21vZGUgOiBOQU5EX0VDQ19OT05FOworCW9vYl9jb25maWcgPSBvb2JzZWwtPmVjY3BvczsKKworCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KKwljaGlwbnIgPSAoaW50KShmcm9tID4+IHRoaXMtPmNoaXBfc2hpZnQpOworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKworCS8qIEZpcnN0IHdlIGNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgcGFnZSAqLworCXJlYWxwYWdlID0gKGludCkgKGZyb20gPj4gdGhpcy0+cGFnZV9zaGlmdCk7CisJcGFnZSA9IHJlYWxwYWdlICYgdGhpcy0+cGFnZW1hc2s7CisKKwkvKiBHZXQgcmF3IHN0YXJ0aW5nIGNvbHVtbiAqLworCWNvbCA9IGZyb20gJiAobXRkLT5vb2JibG9jayAtIDEpOworCisJZW5kID0gbXRkLT5vb2JibG9jazsKKwllY2MgPSB0aGlzLT5lY2NzaXplOworCWVjY2J5dGVzID0gdGhpcy0+ZWNjYnl0ZXM7CisKKwlpZiAoKGVjY21vZGUgPT0gTkFORF9FQ0NfTk9ORSkgfHwgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0hXRUNDX1NZTkRST01FKSkKKwkJY29tcGFyZWVjYyA9IDA7CisKKwlvb2JyZWFkbGVuID0gbXRkLT5vb2JzaXplOworCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9IV0VDQ19TWU5EUk9NRSkKKwkJb29icmVhZGxlbiAtPSBvb2JzZWwtPmVjY2J5dGVzOworCisJLyogTG9vcCB1bnRpbCBhbGwgZGF0YSByZWFkICovCisJd2hpbGUgKHJlYWQgPCBsZW4pIHsKKworCQlpbnQgYWxpZ25lZCA9ICghY29sICYmIChsZW4gLSByZWFkKSA+PSBlbmQpOworCQkvKgorCQkgKiBJZiB0aGUgcmVhZCBpcyBub3QgcGFnZSBhbGlnbmVkLCB3ZSBoYXZlIHRvIHJlYWQgaW50byBkYXRhIGJ1ZmZlcgorCQkgKiBkdWUgdG8gZWNjLCBlbHNlIHdlIHJlYWQgaW50byByZXR1cm4gYnVmZmVyIGRpcmVjdAorCQkgKi8KKwkJaWYgKGFsaWduZWQpCisJCQlkYXRhX3BvaSA9ICZidWZbcmVhZF07CisJCWVsc2UKKwkJCWRhdGFfcG9pID0gdGhpcy0+ZGF0YV9idWY7CisKKwkJLyogQ2hlY2ssIGlmIHdlIGhhdmUgdGhpcyBwYWdlIGluIHRoZSBidWZmZXIKKwkJICoKKwkJICogRklYTUU6IE1ha2UgaXQgd29yayB3aGVuIHdlIG11c3QgcHJvdmlkZSBvb2IgZGF0YSB0b28sCisJCSAqIGNoZWNrIHRoZSB1c2FnZSBvZiBkYXRhX2J1ZiBvb2IgZmllbGQKKwkJICovCisJCWlmIChyZWFscGFnZSA9PSB0aGlzLT5wYWdlYnVmICYmICFvb2JfYnVmKSB7CisJCQkvKiBhbGlnbmVkIHJlYWQgPyAqLworCQkJaWYgKGFsaWduZWQpCisJCQkJbWVtY3B5IChkYXRhX3BvaSwgdGhpcy0+ZGF0YV9idWYsIGVuZCk7CisJCQlnb3RvIHJlYWRkYXRhOworCQl9CisKKwkJLyogQ2hlY2ssIGlmIHdlIG11c3Qgc2VuZCB0aGUgcmVhZCBjb21tYW5kICovCisJCWlmIChzbmRjbWQpIHsKKwkJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfUkVBRDAsIDB4MDAsIHBhZ2UpOworCQkJc25kY21kID0gMDsKKwkJfQorCisJCS8qIGdldCBvb2IgYXJlYSwgaWYgd2UgaGF2ZSBubyBvb2IgYnVmZmVyIGZyb20gZnMtZHJpdmVyICovCisJCWlmICghb29iX2J1ZiB8fCBvb2JzZWwtPnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExBQ0UgfHwKKwkJCW9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTF9VU1IpCisJCQlvb2JfZGF0YSA9ICZ0aGlzLT5kYXRhX2J1ZltlbmRdOworCisJCWVjY3N0ZXBzID0gdGhpcy0+ZWNjc3RlcHM7CisKKwkJc3dpdGNoIChlY2Ntb2RlKSB7CisJCWNhc2UgTkFORF9FQ0NfTk9ORTogewkvKiBObyBFQ0MsIFJlYWQgaW4gYSBwYWdlICovCisvKiBYWFggVS1CT09UIFhYWCAqLworI2lmIDAKKwkJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3R3aGluZ2UgPSAwOworCQkJaWYgKChsYXN0d2hpbmdlIC8gSFopICE9IChqaWZmaWVzIC8gSFopKSB7CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIlJlYWRpbmcgZGF0YSBmcm9tIE5BTkQgRkxBU0ggd2l0aG91dCBFQ0MgaXMgbm90IHJlY29tbWVuZGVkXG4iKTsKKwkJCQlsYXN0d2hpbmdlID0gamlmZmllczsKKwkJCX0KKyNlbHNlCisJCQlwdXRzKCJSZWFkaW5nIGRhdGEgZnJvbSBOQU5EIEZMQVNIIHdpdGhvdXQgRUNDIGlzIG5vdCByZWNvbW1lbmRlZFxuIik7CisjZW5kaWYKKwkJCXRoaXMtPnJlYWRfYnVmKG10ZCwgZGF0YV9wb2ksIGVuZCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgTkFORF9FQ0NfU09GVDoJLyogU29mdHdhcmUgRUNDIDMvMjU2OiBSZWFkIGluIGEgcGFnZSArIG9vYiBkYXRhICovCisJCQl0aGlzLT5yZWFkX2J1ZihtdGQsIGRhdGFfcG9pLCBlbmQpOworCQkJZm9yIChpID0gMCwgZGF0aWR4ID0gMDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkrPTMsIGRhdGlkeCArPSBlY2MpCisJCQkJdGhpcy0+Y2FsY3VsYXRlX2VjYyhtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmZWNjX2NhbGNbaV0pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWZvciAoaSA9IDAsIGRhdGlkeCA9IDA7IGVjY3N0ZXBzOyBlY2NzdGVwcy0tLCBpKz1lY2NieXRlcywgZGF0aWR4ICs9IGVjYykgeworCQkJCXRoaXMtPmVuYWJsZV9od2VjYyhtdGQsIE5BTkRfRUNDX1JFQUQpOworCQkJCXRoaXMtPnJlYWRfYnVmKG10ZCwgJmRhdGFfcG9pW2RhdGlkeF0sIGVjYyk7CisKKwkJCQkvKiBIVyBlY2Mgd2l0aCBzeW5kcm9tZSBjYWxjdWxhdGlvbiBtdXN0IHJlYWQgdGhlCisJCQkJICogc3luZHJvbWUgZnJvbSBmbGFzaCBpbW1pZGlhdGVseSBhZnRlciB0aGUgZGF0YSAqLworCQkJCWlmICghY29tcGFyZWVjYykgeworCQkJCQkvKiBTb21lIGh3IGVjYyBnZW5lcmF0b3JzIG5lZWQgdG8ga25vdyB3aGVuIHRoZQorCQkJCQkgKiBzeW5kcm9tZSBpcyByZWFkIGZyb20gZmxhc2ggKi8KKwkJCQkJdGhpcy0+ZW5hYmxlX2h3ZWNjKG10ZCwgTkFORF9FQ0NfUkVBRFNZTik7CisJCQkJCXRoaXMtPnJlYWRfYnVmKG10ZCwgJm9vYl9kYXRhW2ldLCBlY2NieXRlcyk7CisJCQkJCS8qIFdlIGNhbGMgZXJyb3IgY29ycmVjdGlvbiBkaXJlY3RseSwgaXQgY2hlY2tzIHRoZSBodworCQkJCQkgKiBnZW5lcmF0b3IgZm9yIGFuIGVycm9yLCByZWFkcyBiYWNrIHRoZSBzeW5kcm9tZSBhbmQKKwkJCQkJICogZG9lcyB0aGUgZXJyb3IgY29ycmVjdGlvbiBvbiB0aGUgZmx5ICovCisJCQkJCWlmICh0aGlzLT5jb3JyZWN0X2RhdGEobXRkLCAmZGF0YV9wb2lbZGF0aWR4XSwgJm9vYl9kYXRhW2ldLCAmZWNjX2NvZGVbaV0pID09IC0xKSB7CisJCQkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfcmVhZF9lY2M6ICIKKwkJCQkJCQkiRmFpbGVkIEVDQyByZWFkLCBwYWdlIDB4JTA4eCBvbiBjaGlwICVkXG4iLCBwYWdlLCBjaGlwbnIpOworCQkJCQkJZWNjX2ZhaWxlZCsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy0+Y2FsY3VsYXRlX2VjYyhtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmZWNjX2NhbGNbaV0pOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmVhZCBvb2JkYXRhICovCisJCXRoaXMtPnJlYWRfYnVmKG10ZCwgJm9vYl9kYXRhW210ZC0+b29ic2l6ZSAtIG9vYnJlYWRsZW5dLCBvb2JyZWFkbGVuKTsKKworCQkvKiBTa2lwIEVDQyBjaGVjaywgaWYgbm90IHJlcXVlc3RlZCAoRUNDX05PTkUgb3IgSFdfRUNDIHdpdGggc3luZHJvbWVzKSAqLworCQlpZiAoIWNvbXBhcmVlY2MpCisJCQlnb3RvIHJlYWRvb2I7CisKKwkJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwkJZm9yIChqID0gMDsgaiA8IG9vYnNlbC0+ZWNjYnl0ZXM7IGorKykKKwkJCWVjY19jb2RlW2pdID0gb29iX2RhdGFbb29iX2NvbmZpZ1tqXV07CisKKwkJLyogY29ycmVjdCBkYXRhLCBpZiBuZWNjZWNhcnkgKi8KKwkJZm9yIChpID0gMCwgaiA9IDAsIGRhdGlkeCA9IDA7IGkgPCB0aGlzLT5lY2NzdGVwczsgaSsrLCBkYXRpZHggKz0gZWNjKSB7CisJCQllY2Nfc3RhdHVzID0gdGhpcy0+Y29ycmVjdF9kYXRhKG10ZCwgJmRhdGFfcG9pW2RhdGlkeF0sICZlY2NfY29kZVtqXSwgJmVjY19jYWxjW2pdKTsKKworCQkJLyogR2V0IG5leHQgY2h1bmsgb2YgZWNjIGJ5dGVzICovCisJCQlqICs9IGVjY2J5dGVzOworCisJCQkvKiBDaGVjaywgaWYgd2UgaGF2ZSBhIGZzIHN1cHBsaWVkIG9vYi1idWZmZXIsCisJCQkgKiBUaGlzIGlzIHRoZSBsZWdhY3kgbW9kZS4gVXNlZCBieSBZQUZGUzEKKwkJCSAqIFNob3VsZCBnbyBhd2F5IHNvbWUgZGF5CisJCQkgKi8KKwkJCWlmIChvb2JfYnVmICYmIG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX1BMQUNFKSB7CisJCQkJaW50ICpwID0gKGludCAqKSgmb29iX2RhdGFbbXRkLT5vb2JzaXplXSk7CisJCQkJcFtpXSA9IGVjY19zdGF0dXM7CisJCQl9CisKKwkJCWlmIChlY2Nfc3RhdHVzID09IC0xKSB7CisJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3JlYWRfZWNjOiAiICJGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKKwkJCQllY2NfZmFpbGVkKys7CisJCQl9CisJCX0KKworCXJlYWRvb2I6CisJCS8qIGNoZWNrLCBpZiB3ZSBoYXZlIGEgZnMgc3VwcGxpZWQgb29iLWJ1ZmZlciAqLworCQlpZiAob29iX2J1ZikgeworCQkJLyogd2l0aG91dCBhdXRvcGxhY2UuIExlZ2FjeSBtb2RlIHVzZWQgYnkgWUFGRlMxICovCisJCQlzd2l0Y2gob29ic2VsLT51c2VlY2MpIHsKKwkJCWNhc2UgTVREX05BTkRFQ0NfQVVUT1BMQUNFOgorCQkJY2FzZSBNVERfTkFOREVDQ19BVVRPUExfVVNSOgorCQkJCS8qIFdhbGsgdGhyb3VnaCB0aGUgYXV0b3BsYWNlIGNodW5rcyAqLworCQkJCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgbXRkLT5vb2JhdmFpbDsgaSsrKSB7CisJCQkJCWludCBmcm9tID0gb29ic2VsLT5vb2JmcmVlW2ldWzBdOworCQkJCQlpbnQgbnVtID0gb29ic2VsLT5vb2JmcmVlW2ldWzFdOworCQkJCQltZW1jcHkoJm9vYl9idWZbb29iXSwgJm9vYl9kYXRhW2Zyb21dLCBudW0pOworCQkJCQlqKz0gbnVtOworCQkJCX0KKwkJCQlvb2IgKz0gbXRkLT5vb2JhdmFpbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTVREX05BTkRFQ0NfUExBQ0U6CisJCQkJLyogWUFGRlMxIGxlZ2FjeSBtb2RlICovCisJCQkJb29iX2RhdGEgKz0gdGhpcy0+ZWNjc3RlcHMgKiBzaXplb2YgKGludCk7CisJCQlkZWZhdWx0OgorCQkJCW9vYl9kYXRhICs9IG10ZC0+b29ic2l6ZTsKKwkJCX0KKwkJfQorCXJlYWRkYXRhOgorCQkvKiBQYXJ0aWFsIHBhZ2UgcmVhZCwgdHJhbnNmZXIgZGF0YSBpbnRvIGZzIGJ1ZmZlciAqLworCQlpZiAoIWFsaWduZWQpIHsKKwkJCWZvciAoaiA9IGNvbDsgaiA8IGVuZCAmJiByZWFkIDwgbGVuOyBqKyspCisJCQkJYnVmW3JlYWQrK10gPSBkYXRhX3BvaVtqXTsKKwkJCXRoaXMtPnBhZ2VidWYgPSByZWFscGFnZTsKKwkJfSBlbHNlCisJCQlyZWFkICs9IG10ZC0+b29iYmxvY2s7CisKKwkJLyogQXBwbHkgZGVsYXkgb3Igd2FpdCBmb3IgcmVhZHkvYnVzeSBwaW4KKwkJICogRG8gdGhpcyBiZWZvcmUgdGhlIEFVVE9JTkNSIGNoZWNrLCBzbyBubyBwcm9ibGVtcworCQkgKiBhcmlzZSBpZiBhIGNoaXAgd2hpY2ggZG9lcyBhdXRvIGluY3JlbWVudAorCQkgKiBpcyBtYXJrZWQgYXMgTk9BVVRPSU5DUiBieSB0aGUgYm9hcmQgZHJpdmVyLgorCQkqLworCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkKKwkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CisJCWVsc2UKKwkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJCWlmIChyZWFkID09IGxlbikKKwkJCWJyZWFrOworCisJCS8qIEZvciBzdWJzZXF1ZW50IHJlYWRzIGFsaWduIHRvIHBhZ2UgYm91bmRhcnkuICovCisJCWNvbCA9IDA7CisJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgKi8KKwkJcmVhbHBhZ2UrKzsKKworCQlwYWdlID0gcmVhbHBhZ2UgJiB0aGlzLT5wYWdlbWFzazsKKwkJLyogQ2hlY2ssIGlmIHdlIGNyb3NzIGEgY2hpcCBib3VuZGFyeSAqLworCQlpZiAoIXBhZ2UpIHsKKwkJCWNoaXBucisrOworCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCAtMSk7CisJCQl0aGlzLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CisJCX0KKwkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQKKwkJICogb3IgaWYgd2UgaGF2ZSBoaXQgYSBibG9jayBib3VuZGFyeS4KKwkJKi8KKwkJaWYgKCFOQU5EX0NBTkFVVE9JTkNSKHRoaXMpIHx8ICEocGFnZSAmIGJsb2NrY2hlY2spKQorCQkJc25kY21kID0gMTsKKwl9CisKKwkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCisJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCisJLyoKKwkgKiBSZXR1cm4gc3VjY2VzcywgaWYgbm8gRUNDIGZhaWx1cmVzLCBlbHNlIC1FQkFETVNHCisJICogZnMgZHJpdmVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoYXQsIGJlY2F1c2UKKwkgKiByZXRsZW4gPT0gZGVzaXJlZCBsZW4gYW5kIHJlc3VsdCA9PSAtRUJBRE1TRworCSAqLworCSpyZXRsZW4gPSByZWFkOworCXJldHVybiBlY2NfZmFpbGVkID8gLUVCQURNU0cgOiAwOworfQorCisvKioKKyAqIG5hbmRfcmVhZF9vb2IgLSBbTVREIEludGVyZmFjZV0gTkFORCByZWFkIG91dC1vZi1iYW5kCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcworICogQGJ1ZjoJdGhlIGRhdGFidWZmZXIgdG8gcHV0IGRhdGEKKyAqCisgKiBOQU5EIHJlYWQgb3V0LW9mLWJhbmQgZGF0YSBmcm9tIHRoZSBzcGFyZSBhcmVhCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1ZikKK3sKKwlpbnQgaSwgY29sLCBwYWdlLCBjaGlwbnI7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlpbnQJYmxvY2tjaGVjayA9ICgxIDw8ICh0aGlzLT5waHlzX2VyYXNlX3NoaWZ0IC0gdGhpcy0+cGFnZV9zaGlmdCkpIC0gMTsKKworCURFQlVHIChNVERfREVCVUdfTEVWRUwzLCAibmFuZF9yZWFkX29vYjogZnJvbSA9IDB4JTA4eCwgbGVuID0gJWlcbiIsICh1bnNpZ25lZCBpbnQpIGZyb20sIChpbnQpIGxlbik7CisKKwkvKiBTaGlmdCB0byBnZXQgcGFnZSAqLworCXBhZ2UgPSAoaW50KShmcm9tID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCWNoaXBuciA9IChpbnQpKGZyb20gPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisKKwkvKiBNYXNrIHRvIGdldCBjb2x1bW4gKi8KKwljb2wgPSBmcm9tICYgKG10ZC0+b29ic2l6ZSAtIDEpOworCisJLyogSW5pdGlhbGl6ZSByZXR1cm4gbGVuZ3RoIHZhbHVlICovCisJKnJldGxlbiA9IDA7CisKKwkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKChmcm9tICsgbGVuKSA+IG10ZC0+c2l6ZSkgeworCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfcmVhZF9vb2I6IEF0dGVtcHQgcmVhZCBiZXlvbmQgZW5kIG9mIGRldmljZVxuIik7CisJCSpyZXRsZW4gPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KKwluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCAsIEZMX1JFQURJTkcpOworCisJLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKworCS8qIFNlbmQgdGhlIHJlYWQgY29tbWFuZCAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfUkVBRE9PQiwgY29sLCBwYWdlICYgdGhpcy0+cGFnZW1hc2spOworCS8qCisJICogUmVhZCB0aGUgZGF0YSwgaWYgd2UgcmVhZCBtb3JlIHRoYW4gb25lIHBhZ2UKKwkgKiBvb2IgZGF0YSwgbGV0IHRoZSBkZXZpY2UgdHJhbnNmZXIgdGhlIGRhdGEgIQorCSAqLworCWkgPSAwOworCXdoaWxlIChpIDwgbGVuKSB7CisJCWludCB0aGlzbGVuID0gbXRkLT5vb2JzaXplIC0gY29sOworCQl0aGlzbGVuID0gbWluX3QoaW50LCB0aGlzbGVuLCBsZW4pOworCQl0aGlzLT5yZWFkX2J1ZihtdGQsICZidWZbaV0sIHRoaXNsZW4pOworCQlpICs9IHRoaXNsZW47CisKKwkJLyogQXBwbHkgZGVsYXkgb3Igd2FpdCBmb3IgcmVhZHkvYnVzeSBwaW4KKwkJICogRG8gdGhpcyBiZWZvcmUgdGhlIEFVVE9JTkNSIGNoZWNrLCBzbyBubyBwcm9ibGVtcworCQkgKiBhcmlzZSBpZiBhIGNoaXAgd2hpY2ggZG9lcyBhdXRvIGluY3JlbWVudAorCQkgKiBpcyBtYXJrZWQgYXMgTk9BVVRPSU5DUiBieSB0aGUgYm9hcmQgZHJpdmVyLgorCQkqLworCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkKKwkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CisJCWVsc2UKKwkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJCS8qIFJlYWQgbW9yZSA/ICovCisJCWlmIChpIDwgbGVuKSB7CisJCQlwYWdlKys7CisJCQljb2wgPSAwOworCisJCQkvKiBDaGVjaywgaWYgd2UgY3Jvc3MgYSBjaGlwIGJvdW5kYXJ5ICovCisJCQlpZiAoIShwYWdlICYgdGhpcy0+cGFnZW1hc2spKSB7CisJCQkJY2hpcG5yKys7CisJCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCAtMSk7CisJCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCQkJfQorCisJCQkvKiBDaGVjaywgaWYgdGhlIGNoaXAgc3VwcG9ydHMgYXV0byBwYWdlIGluY3JlbWVudAorCQkJICogb3IgaWYgd2UgaGF2ZSBoaXQgYSBibG9jayBib3VuZGFyeS4KKwkJCSovCisJCQlpZiAoIU5BTkRfQ0FOQVVUT0lOQ1IodGhpcykgfHwgIShwYWdlICYgYmxvY2tjaGVjaykpIHsKKwkJCQkvKiBGb3Igc3Vic2VxdWVudCBwYWdlIHJlYWRzIHNldCBvZmZzZXQgdG8gMCAqLworCQkJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfUkVBRE9PQiwgMHgwLCBwYWdlICYgdGhpcy0+cGFnZW1hc2spOworCQkJfQorCQl9CisJfQorCisJLyogRGVzZWxlY3QgYW5kIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIGRldmljZSAqLworCW5hbmRfcmVsZWFzZV9kZXZpY2UobXRkKTsKKworCS8qIFJldHVybiBoYXBweSAqLworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmFuZF9yZWFkX3JhdyAtIFtHRU5FUklDXSBSZWFkIHJhdyBkYXRhIGluY2x1ZGluZyBvb2IgaW50byBidWZmZXIKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCisgKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBvb2JsZW46CW51bWJlciBvZiBvb2IgZGF0YSBieXRlcyB0byByZWFkCisgKgorICogUmVhZCByYXcgZGF0YSBpbmNsdWRpbmcgb29iIGludG8gYnVmZmVyCisgKi8KK2ludCBuYW5kX3JlYWRfcmF3IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90IG9vYmxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCBwYWdlID0gKGludCkgKGZyb20gPj4gdGhpcy0+cGFnZV9zaGlmdCk7CisJaW50IGNoaXAgPSAoaW50KSAoZnJvbSA+PiB0aGlzLT5jaGlwX3NoaWZ0KTsKKwlpbnQgc25kY21kID0gMTsKKwlpbnQgY250ID0gMDsKKwlpbnQgcGFnZXNpemUgPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOworCWludAlibG9ja2NoZWNrID0gKDEgPDwgKHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KSkgLSAxOworCisJLyogRG8gbm90IGFsbG93IHJlYWRzIHBhc3QgZW5kIG9mIGRldmljZSAqLworCWlmICgoZnJvbSArIGxlbikgPiBtdGQtPnNpemUpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3JlYWRfcmF3OiBBdHRlbXB0IHJlYWQgYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KKwluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCAsIEZMX1JFQURJTkcpOworCisJdGhpcy0+c2VsZWN0X2NoaXAgKG10ZCwgY2hpcCk7CisKKwkvKiBBZGQgcmVxdWVzdGVkIG9vYiBsZW5ndGggKi8KKwlsZW4gKz0gb29ibGVuOworCisJd2hpbGUgKGxlbikgeworCQlpZiAoc25kY21kKQorCQkJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9SRUFEMCwgMCwgcGFnZSAmIHRoaXMtPnBhZ2VtYXNrKTsKKwkJc25kY21kID0gMDsKKworCQl0aGlzLT5yZWFkX2J1ZiAobXRkLCAmYnVmW2NudF0sIHBhZ2VzaXplKTsKKworCQlsZW4gLT0gcGFnZXNpemU7CisJCWNudCArPSBwYWdlc2l6ZTsKKwkJcGFnZSsrOworCisJCWlmICghdGhpcy0+ZGV2X3JlYWR5KQorCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKKwkJZWxzZQorCQkJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CisKKwkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQgKi8KKwkJaWYgKCFOQU5EX0NBTkFVVE9JTkNSKHRoaXMpIHx8ICEocGFnZSAmIGJsb2NrY2hlY2spKQorCQkJc25kY21kID0gMTsKKwl9CisKKwkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCisJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCXJldHVybiAwOworfQorCisKKy8qKgorICogbmFuZF9wcmVwYXJlX29vYmJ1ZiAtIFtHRU5FUklDXSBQcmVwYXJlIHRoZSBvdXQgb2YgYmFuZCBidWZmZXIKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZnNidWY6CWJ1ZmZlciBnaXZlbiBieSBmcyBkcml2ZXIKKyAqIEBvb2JzZWw6CW91dCBvZiBiYW5kIHNlbGVjdGlvbiBzdHJ1Y3RyZQorICogQGF1dG9wbGFjZToJMSA9IHBsYWNlIGdpdmVuIGJ1ZmZlciBpbnRvIHRoZSBvb2IgYnl0ZXMKKyAqIEBudW1wYWdlczoJbnVtYmVyIG9mIHBhZ2VzIHRvIHByZXBhcmUKKyAqCisgKiBSZXR1cm46CisgKiAxLiBGaWxlc3lzdGVtIGJ1ZmZlciBhdmFpbGFibGUgYW5kIGF1dG9wbGFjZW1lbnQgaXMgb2ZmLAorICogICAgcmV0dXJuIGZpbGVzeXN0ZW0gYnVmZmVyCisgKiAyLiBObyBmaWxlc3lzdGVtIGJ1ZmZlciBvciBhdXRvcGxhY2UgaXMgb2ZmLCByZXR1cm4gaW50ZXJuYWwKKyAqICAgIGJ1ZmZlcgorICogMy4gRmlsZXN5c3RlbSBidWZmZXIgaXMgZ2l2ZW4gYW5kIGF1dG9wbGFjZSBzZWxlY3RlZAorICogICAgcHV0IGRhdGEgZnJvbSBmcyBidWZmZXIgaW50byBpbnRlcm5hbCBidWZmZXIgYW5kCisgKiAgICByZXRydW4gaW50ZXJuYWwgYnVmZmVyCisgKgorICogTm90ZTogVGhlIGludGVybmFsIGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCAweGZmLiBUaGlzIG11c3QKKyAqIGJlIGRvbmUgb25seSBvbmNlLCB3aGVuIG5vIGF1dG9wbGFjZW1lbnQgaGFwcGVucworICogQXV0b3BsYWNlbWVudCBzZXRzIHRoZSBidWZmZXIgZGlydHkgZmxhZywgd2hpY2gKKyAqIGZvcmNlcyB0aGUgMHhmZiBmaWxsIGJlZm9yZSB1c2luZyB0aGUgYnVmZmVyIGFnYWluLgorICoKKyovCitzdGF0aWMgdV9jaGFyICogbmFuZF9wcmVwYXJlX29vYmJ1ZiAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZnNidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCwKKwkJaW50IGF1dG9wbGFjZSwgaW50IG51bXBhZ2VzKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJaW50IGksIGxlbiwgb2ZzOworCisJLyogWmVybyBjb3B5IGZzIHN1cHBsaWVkIGJ1ZmZlciAqLworCWlmIChmc2J1ZiAmJiAhYXV0b3BsYWNlKQorCQlyZXR1cm4gZnNidWY7CisKKwkvKiBDaGVjaywgaWYgdGhlIGJ1ZmZlciBtdXN0IGJlIGZpbGxlZCB3aXRoIGZmIGFnYWluICovCisJaWYgKHRoaXMtPm9vYmRpcnR5KSB7CisJCW1lbXNldCAodGhpcy0+b29iX2J1ZiwgMHhmZiwKKwkJCW10ZC0+b29ic2l6ZSA8PCAodGhpcy0+cGh5c19lcmFzZV9zaGlmdCAtIHRoaXMtPnBhZ2Vfc2hpZnQpKTsKKwkJdGhpcy0+b29iZGlydHkgPSAwOworCX0KKworCS8qIElmIHdlIGhhdmUgbm8gYXV0b3BsYWNlbWVudCBvciBubyBmcyBidWZmZXIgdXNlIHRoZSBpbnRlcm5hbCBvbmUgKi8KKwlpZiAoIWF1dG9wbGFjZSB8fCAhZnNidWYpCisJCXJldHVybiB0aGlzLT5vb2JfYnVmOworCisJLyogV2FsayB0aHJvdWdoIHRoZSBwYWdlcyBhbmQgcGxhY2UgdGhlIGRhdGEgKi8KKwl0aGlzLT5vb2JkaXJ0eSA9IDE7CisJb2ZzID0gMDsKKwl3aGlsZSAobnVtcGFnZXMtLSkgeworCQlmb3IgKGkgPSAwLCBsZW4gPSAwOyBsZW4gPCBtdGQtPm9vYmF2YWlsOyBpKyspIHsKKwkJCWludCB0byA9IG9mcyArIG9vYnNlbC0+b29iZnJlZVtpXVswXTsKKwkJCWludCBudW0gPSBvb2JzZWwtPm9vYmZyZWVbaV1bMV07CisJCQltZW1jcHkgKCZ0aGlzLT5vb2JfYnVmW3RvXSwgZnNidWYsIG51bSk7CisJCQlsZW4gKz0gbnVtOworCQkJZnNidWYgKz0gbnVtOworCQl9CisJCW9mcyArPSBtdGQtPm9vYmF2YWlsOworCX0KKwlyZXR1cm4gdGhpcy0+b29iX2J1ZjsKK30KKworI2RlZmluZSBOT1RBTElHTkVEKHgpICh4ICYgKG10ZC0+b29iYmxvY2stMSkpICE9IDAKKworLyoqCisgKiBuYW5kX3dyaXRlIC0gW01URCBJbnRlcmZhY2VdIGNvbXBhYmlsaXR5IGZ1bmN0aW9uIGZvciBuYW5kX3dyaXRlX2VjYworICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bworICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcworICogQGJ1ZjoJdGhlIGRhdGEgdG8gd3JpdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBuYW5kX3dyaXRlX2VjYyB3aXRoIG9vYiBidWZmZXIgYW5kIG9vYnNlbCA9IE5VTEwKKyAqCisqLworc3RhdGljIGludCBuYW5kX3dyaXRlIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIGNvbnN0IHVfY2hhciAqIGJ1ZikKK3sKKwlyZXR1cm4gKG5hbmRfd3JpdGVfZWNjIChtdGQsIHRvLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBOVUxMKSk7Cit9CisKKy8qKgorICogbmFuZF93cml0ZV9lY2MgLSBbTVREIEludGVyZmFjZV0gTkFORCB3cml0ZSB3aXRoIEVDQworICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bworICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcworICogQGJ1ZjoJdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBlY2NidWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyCisgKiBAb29ic2VsOglvb2Igc2VsZWN0aW9uIHN0cnVjdHVyZQorICoKKyAqIE5BTkQgd3JpdGUgd2l0aCBFQ0MKKyAqLworc3RhdGljIGludCBuYW5kX3dyaXRlX2VjYyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKKwkJCSAgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmLCB1X2NoYXIgKiBlY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCkKK3sKKwlpbnQgc3RhcnRwYWdlLCBwYWdlLCByZXQgPSAtRUlPLCBvb2IgPSAwLCB3cml0dGVuID0gMCwgY2hpcG5yOworCWludCBhdXRvcGxhY2UgPSAwLCBudW1wYWdlcywgdG90YWxwYWdlczsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVfY2hhciAqb29iYnVmLCAqYnVmc3RhcnQ7CisJaW50CXBwYmxvY2sgPSAoMSA8PCAodGhpcy0+cGh5c19lcmFzZV9zaGlmdCAtIHRoaXMtPnBhZ2Vfc2hpZnQpKTsKKworCURFQlVHIChNVERfREVCVUdfTEVWRUwzLCAibmFuZF93cml0ZV9lY2M6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgdG8sIChpbnQpIGxlbik7CisKKwkvKiBJbml0aWFsaXplIHJldGxlbiwgaW4gY2FzZSBvZiBlYXJseSBleGl0ICovCisJKnJldGxlbiA9IDA7CisKKwkvKiBEbyBub3QgYWxsb3cgd3JpdGUgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKCh0byArIGxlbikgPiBtdGQtPnNpemUpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3dyaXRlX2VjYzogQXR0ZW1wdCB0byB3cml0ZSBwYXN0IGVuZCBvZiBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVqZWN0IHdyaXRlcywgd2hpY2ggYXJlIG5vdCBwYWdlIGFsaWduZWQgKi8KKwlpZiAoTk9UQUxJR05FRCAodG8pIHx8IE5PVEFMSUdORUQobGVuKSkgeworCQlwcmludGsgKEtFUk5fTk9USUNFICJuYW5kX3dyaXRlX2VjYzogQXR0ZW1wdCB0byB3cml0ZSBub3QgcGFnZSBhbGlnbmVkIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KKwluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCwgRkxfV1JJVElORyk7CisKKwkvKiBDYWxjdWxhdGUgY2hpcG5yICovCisJY2hpcG5yID0gKGludCkodG8gPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisJLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKworCS8qIENoZWNrLCBpZiBpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKwlpZiAobmFuZF9jaGVja193cChtdGQpKQorCQlnb3RvIG91dDsKKworCS8qIGlmIG9vYnNlbCBpcyBOVUxMLCB1c2UgY2hpcCBkZWZhdWx0cyAqLworCWlmIChvb2JzZWwgPT0gTlVMTCkKKwkJb29ic2VsID0gJm10ZC0+b29iaW5mbzsKKworCS8qIEF1dG9wbGFjZSBvZiBvb2IgZGF0YSA/IFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lICovCisJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkgeworCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOworCQlhdXRvcGxhY2UgPSAxOworCX0KKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKKworCS8qIFNldHVwIHZhcmlhYmxlcyBhbmQgb29iIGJ1ZmZlciAqLworCXRvdGFscGFnZXMgPSBsZW4gPj4gdGhpcy0+cGFnZV9zaGlmdDsKKwlwYWdlID0gKGludCkgKHRvID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCS8qIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUsIGlmIHdlIHdyaXRlIHRvIHRoZSBjYWNoZWQgcGFnZSAqLworCWlmIChwYWdlIDw9IHRoaXMtPnBhZ2VidWYgJiYgdGhpcy0+cGFnZWJ1ZiA8IChwYWdlICsgdG90YWxwYWdlcykpCisJCXRoaXMtPnBhZ2VidWYgPSAtMTsKKworCS8qIFNldCBpdCByZWxhdGl2ZSB0byBjaGlwICovCisJcGFnZSAmPSB0aGlzLT5wYWdlbWFzazsKKwlzdGFydHBhZ2UgPSBwYWdlOworCS8qIENhbGMgbnVtYmVyIG9mIHBhZ2VzIHdlIGNhbiB3cml0ZSBpbiBvbmUgZ28gKi8KKwludW1wYWdlcyA9IG1pbiAocHBibG9jayAtIChzdGFydHBhZ2UgICYgKHBwYmxvY2sgLSAxKSksIHRvdGFscGFnZXMpOworCW9vYmJ1ZiA9IG5hbmRfcHJlcGFyZV9vb2JidWYgKG10ZCwgZWNjYnVmLCBvb2JzZWwsIGF1dG9wbGFjZSwgbnVtcGFnZXMpOworCWJ1ZnN0YXJ0ID0gKHVfY2hhciAqKWJ1ZjsKKworCS8qIExvb3AgdW50aWwgYWxsIGRhdGEgaXMgd3JpdHRlbiAqLworCXdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisKKwkJdGhpcy0+ZGF0YV9wb2kgPSAodV9jaGFyKikgJmJ1Zlt3cml0dGVuXTsKKwkJLyogV3JpdGUgb25lIHBhZ2UuIElmIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSB0byB3cml0ZQorCQkgKiBvciB0aGUgbGFzdCBwYWdlIGluIHRoaXMgYmxvY2ssIHRoZW4gdXNlIHRoZQorCQkgKiByZWFsIHBhZ2Vwcm9ncmFtIGNvbW1hbmQsIGVsc2Ugc2VsZWN0IGNhY2hlZCBwcm9ncmFtbWluZworCQkgKiBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAuCisJCSAqLworCQlyZXQgPSBuYW5kX3dyaXRlX3BhZ2UgKG10ZCwgdGhpcywgcGFnZSwgJm9vYmJ1Zltvb2JdLCBvb2JzZWwsICgtLW51bXBhZ2VzID4gMCkpOworCQlpZiAocmV0KSB7CisJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfd3JpdGVfZWNjOiB3cml0ZV9wYWdlIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIE5leHQgb29iIHBhZ2UgKi8KKwkJb29iICs9IG10ZC0+b29ic2l6ZTsKKwkJLyogVXBkYXRlIHdyaXR0ZW4gYnl0ZXMgY291bnQgKi8KKwkJd3JpdHRlbiArPSBtdGQtPm9vYmJsb2NrOworCQlpZiAod3JpdHRlbiA9PSBsZW4pCisJCQlnb3RvIGNtcDsKKworCQkvKiBJbmNyZW1lbnQgcGFnZSBhZGRyZXNzICovCisJCXBhZ2UrKzsKKworCQkvKiBIYXZlIHdlIGhpdCBhIGJsb2NrIGJvdW5kYXJ5ID8gVGhlbiB3ZSBoYXZlIHRvIHZlcmlmeSBhbmQKKwkJICogaWYgdmVyaWZ5IGlzIG9rLCB3ZSBoYXZlIHRvIHNldHVwIHRoZSBvb2IgYnVmZmVyIGZvcgorCQkgKiB0aGUgbmV4dCBwYWdlcy4KKwkJKi8KKwkJaWYgKCEocGFnZSAmIChwcGJsb2NrIC0gMSkpKXsKKwkJCWludCBvZnM7CisJCQl0aGlzLT5kYXRhX3BvaSA9IGJ1ZnN0YXJ0OworCQkJcmV0ID0gbmFuZF92ZXJpZnlfcGFnZXMgKG10ZCwgdGhpcywgc3RhcnRwYWdlLAorCQkJCXBhZ2UgLSBzdGFydHBhZ2UsCisJCQkJb29iYnVmLCBvb2JzZWwsIGNoaXBuciwgKGVjY2J1ZiAhPSBOVUxMKSk7CisJCQlpZiAocmV0KSB7CisJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3dyaXRlX2VjYzogdmVyaWZ5X3BhZ2VzIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCSpyZXRsZW4gPSB3cml0dGVuOworCisJCQlvZnMgPSBhdXRvcGxhY2UgPyBtdGQtPm9vYmF2YWlsIDogbXRkLT5vb2JzaXplOworCQkJaWYgKGVjY2J1ZikKKwkJCQllY2NidWYgKz0gKHBhZ2UgLSBzdGFydHBhZ2UpICogb2ZzOworCQkJdG90YWxwYWdlcyAtPSBwYWdlIC0gc3RhcnRwYWdlOworCQkJbnVtcGFnZXMgPSBtaW4gKHRvdGFscGFnZXMsIHBwYmxvY2spOworCQkJcGFnZSAmPSB0aGlzLT5wYWdlbWFzazsKKwkJCXN0YXJ0cGFnZSA9IHBhZ2U7CisJCQlvb2JidWYgPSBuYW5kX3ByZXBhcmVfb29iYnVmIChtdGQsIGVjY2J1Ziwgb29ic2VsLAorCQkJCQlhdXRvcGxhY2UsIG51bXBhZ2VzKTsKKwkJCS8qIENoZWNrLCBpZiB3ZSBjcm9zcyBhIGNoaXAgYm91bmRhcnkgKi8KKwkJCWlmICghcGFnZSkgeworCQkJCWNoaXBucisrOworCQkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCQkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBWZXJpZnkgdGhlIHJlbWFpbmluZyBwYWdlcyAqLworY21wOgorCXRoaXMtPmRhdGFfcG9pID0gYnVmc3RhcnQ7CisgCXJldCA9IG5hbmRfdmVyaWZ5X3BhZ2VzIChtdGQsIHRoaXMsIHN0YXJ0cGFnZSwgdG90YWxwYWdlcywKKwkJb29iYnVmLCBvb2JzZWwsIGNoaXBuciwgKGVjY2J1ZiAhPSBOVUxMKSk7CisJaWYgKCFyZXQpCisJCSpyZXRsZW4gPSB3cml0dGVuOworCWVsc2UKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3dyaXRlX2VjYzogdmVyaWZ5X3BhZ2VzIGZhaWxlZCAlZFxuIiwgcmV0KTsKKworb3V0OgorCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KKwluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogbmFuZF93cml0ZV9vb2IgLSBbTVREIEludGVyZmFjZV0gTkFORCB3cml0ZSBvdXQtb2YtYmFuZAorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bworICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcworICogQGJ1ZjoJdGhlIGRhdGEgdG8gd3JpdGUKKyAqCisgKiBOQU5EIHdyaXRlIG91dC1vZi1iYW5kCisgKi8KK3N0YXRpYyBpbnQgbmFuZF93cml0ZV9vb2IgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmKQoreworCWludCBjb2x1bW4sIHBhZ2UsIHN0YXR1cywgcmV0ID0gLUVJTywgY2hpcG5yOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlERUJVRyAoTVREX0RFQlVHX0xFVkVMMywgIm5hbmRfd3JpdGVfb29iOiB0byA9IDB4JTA4eCwgbGVuID0gJWlcbiIsICh1bnNpZ25lZCBpbnQpIHRvLCAoaW50KSBsZW4pOworCisJLyogU2hpZnQgdG8gZ2V0IHBhZ2UgKi8KKwlwYWdlID0gKGludCkgKHRvID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCWNoaXBuciA9IChpbnQpICh0byA+PiB0aGlzLT5jaGlwX3NoaWZ0KTsKKworCS8qIE1hc2sgdG8gZ2V0IGNvbHVtbiAqLworCWNvbHVtbiA9IHRvICYgKG10ZC0+b29ic2l6ZSAtIDEpOworCisJLyogSW5pdGlhbGl6ZSByZXR1cm4gbGVuZ3RoIHZhbHVlICovCisJKnJldGxlbiA9IDA7CisKKwkvKiBEbyBub3QgYWxsb3cgd3JpdGUgcGFzdCBlbmQgb2YgcGFnZSAqLworCWlmICgoY29sdW1uICsgbGVuKSA+IG10ZC0+b29ic2l6ZSkgeworCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfd3JpdGVfb29iOiBBdHRlbXB0IHRvIHdyaXRlIHBhc3QgZW5kIG9mIHBhZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KKwluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCwgRkxfV1JJVElORyk7CisKKwkvKiBTZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCisJLyogUmVzZXQgdGhlIGNoaXAuIFNvbWUgY2hpcHMgKGxpa2UgdGhlIFRvc2hpYmEgVEM1ODMyREMgZm91bmQKKwkgICBpbiBvbmUgb2YgbXkgRGlza09uQ2hpcCAyMDAwIHRlc3QgdW5pdHMpIHdpbGwgY2xlYXIgdGhlIHdob2xlCisJICAgZGF0YSBwYWdlIHRvbyBpZiB3ZSBkb24ndCBkbyB0aGlzLiBJIGhhdmUgbm8gY2x1ZSB3aHksIGJ1dAorCSAgIEkgc2VlbSB0byBoYXZlICdmaXhlZCcgaXQgaW4gdGhlIGRvYzIwMDAgZHJpdmVyIGluCisJICAgQXVndXN0IDE5OTkuICBkd213Mi4gKi8KKwl0aGlzLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIC0xLCAtMSk7CisKKwkvKiBDaGVjaywgaWYgaXQgaXMgd3JpdGUgcHJvdGVjdGVkICovCisJaWYgKG5hbmRfY2hlY2tfd3AobXRkKSkKKwkJZ290byBvdXQ7CisKKwkvKiBJbnZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlLCBpZiB3ZSB3cml0ZSB0byB0aGUgY2FjaGVkIHBhZ2UgKi8KKwlpZiAocGFnZSA9PSB0aGlzLT5wYWdlYnVmKQorCQl0aGlzLT5wYWdlYnVmID0gLTE7CisKKwlpZiAoTkFORF9NVVNUX1BBRCh0aGlzKSkgeworCQkvKiBXcml0ZSBvdXQgZGVzaXJlZCBkYXRhICovCisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU0VRSU4sIG10ZC0+b29iYmxvY2ssIHBhZ2UgJiB0aGlzLT5wYWdlbWFzayk7CisJCS8qIHByZXBhZCAweGZmIGZvciBwYXJ0aWFsIHByb2dyYW1taW5nICovCisJCXRoaXMtPndyaXRlX2J1ZihtdGQsIGZmY2hhcnMsIGNvbHVtbik7CisJCS8qIHdyaXRlIGRhdGEgKi8KKwkJdGhpcy0+d3JpdGVfYnVmKG10ZCwgYnVmLCBsZW4pOworCQkvKiBwb3N0cGFkIDB4ZmYgZm9yIHBhcnRpYWwgcHJvZ3JhbW1pbmcgKi8KKwkJdGhpcy0+d3JpdGVfYnVmKG10ZCwgZmZjaGFycywgbXRkLT5vb2JzaXplIC0gKGxlbitjb2x1bW4pKTsKKwl9IGVsc2UgeworCQkvKiBXcml0ZSBvdXQgZGVzaXJlZCBkYXRhICovCisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU0VRSU4sIG10ZC0+b29iYmxvY2sgKyBjb2x1bW4sIHBhZ2UgJiB0aGlzLT5wYWdlbWFzayk7CisJCS8qIHdyaXRlIGRhdGEgKi8KKwkJdGhpcy0+d3JpdGVfYnVmKG10ZCwgYnVmLCBsZW4pOworCX0KKwkvKiBTZW5kIGNvbW1hbmQgdG8gcHJvZ3JhbSB0aGUgT09CIGRhdGEgKi8KKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1BBR0VQUk9HLCAtMSwgLTEpOworCisJc3RhdHVzID0gdGhpcy0+d2FpdGZ1bmMgKG10ZCwgdGhpcywgRkxfV1JJVElORyk7CisKKwkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KKwlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfd3JpdGVfb29iOiAiICJGYWlsZWQgd3JpdGUsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCS8qIFJldHVybiBoYXBweSAqLworCSpyZXRsZW4gPSBsZW47CisKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFCisJLyogU2VuZCBjb21tYW5kIHRvIHJlYWQgYmFjayB0aGUgZGF0YSAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfUkVBRE9PQiwgY29sdW1uLCBwYWdlICYgdGhpcy0+cGFnZW1hc2spOworCisJaWYgKHRoaXMtPnZlcmlmeV9idWYobXRkLCBidWYsIGxlbikpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3dyaXRlX29vYjogIiAiRmFpbGVkIHdyaXRlIHZlcmlmeSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwlyZXQgPSAwOworb3V0OgorCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KKwluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBYWFggVS1CT09UIFhYWCAqLworI2lmIDAKKy8qKgorICogbmFuZF93cml0ZXYgLSBbTVREIEludGVyZmFjZV0gY29tcGFiaWx0eSBmdW5jdGlvbiBmb3IgbmFuZF93cml0ZXZfZWNjCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHZlY3M6CXRoZSBpb3ZlY3RvcnMgdG8gd3JpdGUKKyAqIEBjb3VudDoJbnVtYmVyIG9mIHZlY3RvcnMKKyAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bworICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKKyAqCisgKiBOQU5EIHdyaXRlIHdpdGgga3ZlYy4gVGhpcyBqdXN0IGNhbGxzIHRoZSBlY2MgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBuYW5kX3dyaXRldiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LAorCQlsb2ZmX3QgdG8sIHNpemVfdCAqIHJldGxlbikKK3sKKwlyZXR1cm4gKG5hbmRfd3JpdGV2X2VjYyAobXRkLCB2ZWNzLCBjb3VudCwgdG8sIHJldGxlbiwgTlVMTCwgTlVMTCkpOworfQorCisvKioKKyAqIG5hbmRfd3JpdGV2X2VjYyAtIFtNVEQgSW50ZXJmYWNlXSB3cml0ZSB3aXRoIGlvdmVjIHdpdGggZWNjCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHZlY3M6CXRoZSBpb3ZlY3RvcnMgdG8gd3JpdGUKKyAqIEBjb3VudDoJbnVtYmVyIG9mIHZlY3RvcnMKKyAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bworICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKKyAqIEBlY2NidWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyCisgKiBAb29ic2VsOglvb2Igc2VsZWN0aW9uIHN0cnVjdHVyZQorICoKKyAqIE5BTkQgd3JpdGUgd2l0aCBpb3ZlYyB3aXRoIGVjYworICovCitzdGF0aWMgaW50IG5hbmRfd3JpdGV2X2VjYyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LAorCQlsb2ZmX3QgdG8sIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCkKK3sKKwlpbnQgaSwgcGFnZSwgbGVuLCB0b3RhbF9sZW4sIHJldCA9IC1FSU8sIHdyaXR0ZW4gPSAwLCBjaGlwbnI7CisJaW50IG9vYiwgbnVtcGFnZXMsIGF1dG9wbGFjZSA9IDAsIHN0YXJ0cGFnZTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludAlwcGJsb2NrID0gKDEgPDwgKHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KSk7CisJdV9jaGFyICpvb2JidWYsICpidWZzdGFydDsKKworCS8qIFByZXNldCB3cml0dGVuIGxlbiBmb3IgZWFybHkgZXhpdCAqLworCSpyZXRsZW4gPSAwOworCisJLyogQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiBkYXRhICovCisJdG90YWxfbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJdG90YWxfbGVuICs9IChpbnQpIHZlY3NbaV0uaW92X2xlbjsKKworCURFQlVHIChNVERfREVCVUdfTEVWRUwzLAorCSAgICAgICAibmFuZF93cml0ZXY6IHRvID0gMHglMDh4LCBsZW4gPSAlaSwgY291bnQgPSAlbGRcbiIsICh1bnNpZ25lZCBpbnQpIHRvLCAodW5zaWduZWQgaW50KSB0b3RhbF9sZW4sIGNvdW50KTsKKworCS8qIERvIG5vdCBhbGxvdyB3cml0ZSBwYXN0IGVuZCBvZiBwYWdlICovCisJaWYgKCh0byArIHRvdGFsX2xlbikgPiBtdGQtPnNpemUpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3dyaXRldjogQXR0ZW1wdGVkIHdyaXRlIHBhc3QgZW5kIG9mIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJlamVjdCB3cml0ZXMsIHdoaWNoIGFyZSBub3QgcGFnZSBhbGlnbmVkICovCisJaWYgKE5PVEFMSUdORUQgKHRvKSB8fCBOT1RBTElHTkVEKHRvdGFsX2xlbikpIHsKKwkJcHJpbnRrIChLRVJOX05PVElDRSAibmFuZF93cml0ZV9lY2M6IEF0dGVtcHQgdG8gd3JpdGUgbm90IHBhZ2UgYWxpZ25lZCBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlICovCisJbmFuZF9nZXRfZGV2aWNlICh0aGlzLCBtdGQsIEZMX1dSSVRJTkcpOworCisJLyogR2V0IHRoZSBjdXJyZW50IGNoaXAtbnIgKi8KKwljaGlwbnIgPSAoaW50KSAodG8gPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisJLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKKworCS8qIENoZWNrLCBpZiBpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKwlpZiAobmFuZF9jaGVja193cChtdGQpKQorCQlnb3RvIG91dDsKKworCS8qIGlmIG9vYnNlbCBpcyBOVUxMLCB1c2UgY2hpcCBkZWZhdWx0cyAqLworCWlmIChvb2JzZWwgPT0gTlVMTCkKKwkJb29ic2VsID0gJm10ZC0+b29iaW5mbzsKKworCS8qIEF1dG9wbGFjZSBvZiBvb2IgZGF0YSA/IFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lICovCisJaWYgKG9vYnNlbC0+dXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkgeworCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOworCQlhdXRvcGxhY2UgPSAxOworCX0KKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKKworCS8qIFNldHVwIHN0YXJ0IHBhZ2UgKi8KKwlwYWdlID0gKGludCkgKHRvID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOworCS8qIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUsIGlmIHdlIHdyaXRlIHRvIHRoZSBjYWNoZWQgcGFnZSAqLworCWlmIChwYWdlIDw9IHRoaXMtPnBhZ2VidWYgJiYgdGhpcy0+cGFnZWJ1ZiA8ICgodG8gKyB0b3RhbF9sZW4pID4+IHRoaXMtPnBhZ2Vfc2hpZnQpKQorCQl0aGlzLT5wYWdlYnVmID0gLTE7CisKKwlzdGFydHBhZ2UgPSBwYWdlICYgdGhpcy0+cGFnZW1hc2s7CisKKwkvKiBMb29wIHVudGlsIGFsbCBrdmVjJyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gKi8KKwlsZW4gPSAwOworCXdoaWxlIChjb3VudCkgeworCQkvKiBJZiB0aGUgZ2l2ZW4gdHVwbGUgaXMgPj0gcGFnZXNpemUgdGhlbgorCQkgKiB3cml0ZSBpdCBvdXQgZnJvbSB0aGUgaW92CisJCSAqLworCQlpZiAoKHZlY3MtPmlvdl9sZW4gLSBsZW4pID49IG10ZC0+b29iYmxvY2spIHsKKwkJCS8qIENhbGMgbnVtYmVyIG9mIHBhZ2VzIHdlIGNhbiB3cml0ZQorCQkJICogb3V0IG9mIHRoaXMgaW92IGluIG9uZSBnbyAqLworCQkJbnVtcGFnZXMgPSAodmVjcy0+aW92X2xlbiAtIGxlbikgPj4gdGhpcy0+cGFnZV9zaGlmdDsKKwkJCS8qIERvIG5vdCBjcm9zcyBibG9jayBib3VuZGFyaWVzICovCisJCQludW1wYWdlcyA9IG1pbiAocHBibG9jayAtIChzdGFydHBhZ2UgJiAocHBibG9jayAtIDEpKSwgbnVtcGFnZXMpOworCQkJb29iYnVmID0gbmFuZF9wcmVwYXJlX29vYmJ1ZiAobXRkLCBOVUxMLCBvb2JzZWwsIGF1dG9wbGFjZSwgbnVtcGFnZXMpOworCQkJYnVmc3RhcnQgPSAodV9jaGFyICopdmVjcy0+aW92X2Jhc2U7CisJCQlidWZzdGFydCArPSBsZW47CisJCQl0aGlzLT5kYXRhX3BvaSA9IGJ1ZnN0YXJ0OworCQkJb29iID0gMDsKKwkJCWZvciAoaSA9IDE7IGkgPD0gbnVtcGFnZXM7IGkrKykgeworCQkJCS8qIFdyaXRlIG9uZSBwYWdlLiBJZiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UgdG8gd3JpdGUKKwkJCQkgKiB0aGVuIHVzZSB0aGUgcmVhbCBwYWdlcHJvZ3JhbSBjb21tYW5kLCBlbHNlIHNlbGVjdAorCQkJCSAqIGNhY2hlZCBwcm9ncmFtbWluZyBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAuCisJCQkJICovCisJCQkJcmV0ID0gbmFuZF93cml0ZV9wYWdlIChtdGQsIHRoaXMsIHBhZ2UgJiB0aGlzLT5wYWdlbWFzaywKKwkJCQkJJm9vYmJ1Zltvb2JdLCBvb2JzZWwsIGkgIT0gbnVtcGFnZXMpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCQkJCXRoaXMtPmRhdGFfcG9pICs9IG10ZC0+b29iYmxvY2s7CisJCQkJbGVuICs9IG10ZC0+b29iYmxvY2s7CisJCQkJb29iICs9IG10ZC0+b29ic2l6ZTsKKwkJCQlwYWdlKys7CisJCQl9CisJCQkvKiBDaGVjaywgaWYgd2UgaGF2ZSB0byBzd2l0Y2ggdG8gdGhlIG5leHQgdHVwbGUgKi8KKwkJCWlmIChsZW4gPj0gKGludCkgdmVjcy0+aW92X2xlbikgeworCQkJCXZlY3MrKzsKKwkJCQlsZW4gPSAwOworCQkJCWNvdW50LS07CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXZSBtdXN0IHVzZSB0aGUgaW50ZXJuYWwgYnVmZmVyLCByZWFkIGRhdGEgb3V0IG9mIGVhY2gKKwkJCSAqIHR1cGxlIHVudGlsIHdlIGhhdmUgYSBmdWxsIHBhZ2UgdG8gd3JpdGUKKwkJCSAqLworCQkJaW50IGNudCA9IDA7CisJCQl3aGlsZSAoY250IDwgbXRkLT5vb2JibG9jaykgeworCQkJCWlmICh2ZWNzLT5pb3ZfYmFzZSAhPSBOVUxMICYmIHZlY3MtPmlvdl9sZW4pCisJCQkJCXRoaXMtPmRhdGFfYnVmW2NudCsrXSA9ICgodV9jaGFyICopIHZlY3MtPmlvdl9iYXNlKVtsZW4rK107CisJCQkJLyogQ2hlY2ssIGlmIHdlIGhhdmUgdG8gc3dpdGNoIHRvIHRoZSBuZXh0IHR1cGxlICovCisJCQkJaWYgKGxlbiA+PSAoaW50KSB2ZWNzLT5pb3ZfbGVuKSB7CisJCQkJCXZlY3MrKzsKKwkJCQkJbGVuID0gMDsKKwkJCQkJY291bnQtLTsKKwkJCQl9CisJCQl9CisJCQl0aGlzLT5wYWdlYnVmID0gcGFnZTsKKwkJCXRoaXMtPmRhdGFfcG9pID0gdGhpcy0+ZGF0YV9idWY7CisJCQlidWZzdGFydCA9IHRoaXMtPmRhdGFfcG9pOworCQkJbnVtcGFnZXMgPSAxOworCQkJb29iYnVmID0gbmFuZF9wcmVwYXJlX29vYmJ1ZiAobXRkLCBOVUxMLCBvb2JzZWwsIGF1dG9wbGFjZSwgbnVtcGFnZXMpOworCQkJcmV0ID0gbmFuZF93cml0ZV9wYWdlIChtdGQsIHRoaXMsIHBhZ2UgJiB0aGlzLT5wYWdlbWFzaywKKwkJCQlvb2JidWYsIG9vYnNlbCwgMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJcGFnZSsrOworCQl9CisKKwkJdGhpcy0+ZGF0YV9wb2kgPSBidWZzdGFydDsKKwkJcmV0ID0gbmFuZF92ZXJpZnlfcGFnZXMgKG10ZCwgdGhpcywgc3RhcnRwYWdlLCBudW1wYWdlcywgb29iYnVmLCBvb2JzZWwsIGNoaXBuciwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQl3cml0dGVuICs9IG10ZC0+b29iYmxvY2sgKiBudW1wYWdlczsKKwkJLyogQWxsIGRvbmUgPyAqLworCQlpZiAoIWNvdW50KQorCQkJYnJlYWs7CisKKwkJc3RhcnRwYWdlID0gcGFnZSAmIHRoaXMtPnBhZ2VtYXNrOworCQkvKiBDaGVjaywgaWYgd2UgY3Jvc3MgYSBjaGlwIGJvdW5kYXJ5ICovCisJCWlmICghc3RhcnRwYWdlKSB7CisJCQljaGlwbnIrKzsKKwkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCQl9CisJfQorCXJldCA9IDA7CitvdXQ6CisJLyogRGVzZWxlY3QgYW5kIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIGRldmljZSAqLworCW5hbmRfcmVsZWFzZV9kZXZpY2UobXRkKTsKKworCSpyZXRsZW4gPSB3cml0dGVuOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBzaW5nbGVfZXJlYXNlX2NtZCAtIFtHRU5FUklDXSBOQU5EIHN0YW5kYXJkIGJsb2NrIGVyYXNlIGNvbW1hbmQgZnVuY3Rpb24KKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFnZToJdGhlIHBhZ2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBlcmFzZWQKKyAqCisgKiBTdGFuZGFyZCBlcmFzZSBjb21tYW5kIGZvciBOQU5EIGNoaXBzCisgKi8KK3N0YXRpYyB2b2lkIHNpbmdsZV9lcmFzZV9jbWQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCS8qIFNlbmQgY29tbWFuZHMgdG8gZXJhc2UgYSBibG9jayAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfRVJBU0UxLCAtMSwgcGFnZSk7CisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9FUkFTRTIsIC0xLCAtMSk7Cit9CisKKy8qKgorICogbXVsdGlfZXJlYXNlX2NtZCAtIFtHRU5FUklDXSBBTkQgc3BlY2lmaWMgYmxvY2sgZXJhc2UgY29tbWFuZCBmdW5jdGlvbgorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYWdlOgl0aGUgcGFnZSBhZGRyZXNzIG9mIHRoZSBibG9jayB3aGljaCB3aWxsIGJlIGVyYXNlZAorICoKKyAqIEFORCBtdWx0aSBibG9jayBlcmFzZSBjb21tYW5kIGZ1bmN0aW9uCisgKiBFcmFzZSA0IGNvbnNlY3V0aXZlIGJsb2NrcworICovCitzdGF0aWMgdm9pZCBtdWx0aV9lcmFzZV9jbWQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCS8qIFNlbmQgY29tbWFuZHMgdG8gZXJhc2UgYSBibG9jayAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfRVJBU0UxLCAtMSwgcGFnZSsrKTsKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX0VSQVNFMSwgLTEsIHBhZ2UrKyk7CisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9FUkFTRTEsIC0xLCBwYWdlKyspOworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfRVJBU0UxLCAtMSwgcGFnZSk7CisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9FUkFTRTIsIC0xLCAtMSk7Cit9CisKKy8qKgorICogbmFuZF9lcmFzZSAtIFtNVEQgSW50ZXJmYWNlXSBlcmFzZSBibG9jayhzKQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpbnN0cjoJZXJhc2UgaW5zdHJ1Y3Rpb24KKyAqCisgKiBFcmFzZSBvbmUgb3JlIG1vcmUgYmxvY2tzCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9lcmFzZSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlyZXR1cm4gbmFuZF9lcmFzZV9uYW5kIChtdGQsIGluc3RyLCAwKTsKK30KKworLyoqCisgKiBuYW5kX2VyYXNlX2ludGVybiAtIFtOQU5EIEludGVyZmFjZV0gZXJhc2UgYmxvY2socykKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaW5zdHI6CWVyYXNlIGluc3RydWN0aW9uCisgKiBAYWxsb3diYnQ6CWFsbG93IGVyYXNpbmcgdGhlIGJidCBhcmVhCisgKgorICogRXJhc2Ugb25lIG9yZSBtb3JlIGJsb2NrcworICovCitpbnQgbmFuZF9lcmFzZV9uYW5kIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyLCBpbnQgYWxsb3diYnQpCit7CisJaW50IHBhZ2UsIGxlbiwgc3RhdHVzLCBwYWdlc19wZXJfYmxvY2ssIHJldCwgY2hpcG5yOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlERUJVRyAoTVREX0RFQlVHX0xFVkVMMywKKwkgICAgICAgIm5hbmRfZXJhc2U6IHN0YXJ0ID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgaW5zdHItPmFkZHIsICh1bnNpZ25lZCBpbnQpIGluc3RyLT5sZW4pOworCisJLyogU3RhcnQgYWRkcmVzcyBtdXN0IGFsaWduIG9uIGJsb2NrIGJvdW5kYXJ5ICovCisJaWYgKGluc3RyLT5hZGRyICYgKCgxIDw8IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpIC0gMSkpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX2VyYXNlOiBVbmFsaWduZWQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIExlbmd0aCBtdXN0IGFsaWduIG9uIGJsb2NrIGJvdW5kYXJ5ICovCisJaWYgKGluc3RyLT5sZW4gJiAoKDEgPDwgdGhpcy0+cGh5c19lcmFzZV9zaGlmdCkgLSAxKSkgeworCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2U6IExlbmd0aCBub3QgYmxvY2sgYWxpZ25lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERvIG5vdCBhbGxvdyBlcmFzZSBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KKwlpZiAoKGluc3RyLT5sZW4gKyBpbnN0ci0+YWRkcikgPiBtdGQtPnNpemUpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX2VyYXNlOiBFcmFzZSBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbnN0ci0+ZmFpbF9hZGRyID0gMHhmZmZmZmZmZjsKKworCS8qIEdyYWIgdGhlIGxvY2sgYW5kIHNlZSBpZiB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZSAqLworCW5hbmRfZ2V0X2RldmljZSAodGhpcywgbXRkLCBGTF9FUkFTSU5HKTsKKworCS8qIFNoaWZ0IHRvIGdldCBmaXJzdCBwYWdlICovCisJcGFnZSA9IChpbnQpIChpbnN0ci0+YWRkciA+PiB0aGlzLT5wYWdlX3NoaWZ0KTsKKwljaGlwbnIgPSAoaW50KSAoaW5zdHItPmFkZHIgPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisKKwkvKiBDYWxjdWxhdGUgcGFnZXMgaW4gZWFjaCBibG9jayAqLworCXBhZ2VzX3Blcl9ibG9jayA9IDEgPDwgKHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KTsKKworCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KKwl0aGlzLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CisKKwkvKiBDaGVjayB0aGUgV1AgYml0ICovCisJLyogQ2hlY2ssIGlmIGl0IGlzIHdyaXRlIHByb3RlY3RlZCAqLworCWlmIChuYW5kX2NoZWNrX3dwKG10ZCkpIHsKKwkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX2VyYXNlOiBEZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkISEhXG4iKTsKKwkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKKwkJZ290byBlcmFzZV9leGl0OworCX0KKworCS8qIExvb3AgdGhyb3VnaCB0aGUgcGFnZXMgKi8KKwlsZW4gPSBpbnN0ci0+bGVuOworCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNJTkc7CisKKwl3aGlsZSAobGVuKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBiYWQgYmxvY2ssIHdlIGRvIG5vdCBlcmFzZSBiYWQgYmxvY2tzICEgKi8KKwkJaWYgKG5hbmRfYmxvY2tfY2hlY2tiYWQobXRkLCAoKGxvZmZfdCkgcGFnZSkgPDwgdGhpcy0+cGFnZV9zaGlmdCwgMCwgYWxsb3diYnQpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAibmFuZF9lcmFzZTogYXR0ZW1wdCB0byBlcmFzZSBhIGJhZCBibG9jayBhdCBwYWdlIDB4JTA4eFxuIiwgcGFnZSk7CisJCQlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOworCQkJZ290byBlcmFzZV9leGl0OworCQl9CisKKwkJLyogSW52YWxpZGF0ZSB0aGUgcGFnZSBjYWNoZSwgaWYgd2UgZXJhc2UgdGhlIGJsb2NrIHdoaWNoIGNvbnRhaW5zCisJCSAgIHRoZSBjdXJyZW50IGNhY2hlZCBwYWdlICovCisJCWlmIChwYWdlIDw9IHRoaXMtPnBhZ2VidWYgJiYgdGhpcy0+cGFnZWJ1ZiA8IChwYWdlICsgcGFnZXNfcGVyX2Jsb2NrKSkKKwkJCXRoaXMtPnBhZ2VidWYgPSAtMTsKKworCQl0aGlzLT5lcmFzZV9jbWQgKG10ZCwgcGFnZSAmIHRoaXMtPnBhZ2VtYXNrKTsKKworCQlzdGF0dXMgPSB0aGlzLT53YWl0ZnVuYyAobXRkLCB0aGlzLCBGTF9FUkFTSU5HKTsKKworCQkvKiBTZWUgaWYgYmxvY2sgZXJhc2Ugc3VjY2VlZGVkICovCisJCWlmIChzdGF0dXMgJiAweDAxKSB7CisJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2U6ICIgIkZhaWxlZCBlcmFzZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOworCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKKwkJCWluc3RyLT5mYWlsX2FkZHIgPSAocGFnZSA8PCB0aGlzLT5wYWdlX3NoaWZ0KTsKKwkJCWdvdG8gZXJhc2VfZXhpdDsKKwkJfQorCisJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgYW5kIGRlY3JlbWVudCBsZW5ndGggKi8KKwkJbGVuIC09ICgxIDw8IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpOworCQlwYWdlICs9IHBhZ2VzX3Blcl9ibG9jazsKKworCQkvKiBDaGVjaywgaWYgd2UgY3Jvc3MgYSBjaGlwIGJvdW5kYXJ5ICovCisJCWlmIChsZW4gJiYgIShwYWdlICYgdGhpcy0+cGFnZW1hc2spKSB7CisJCQljaGlwbnIrKzsKKwkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCQl9CisJfQorCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCitlcmFzZV9leGl0OgorCisJcmV0ID0gaW5zdHItPnN0YXRlID09IE1URF9FUkFTRV9ET05FID8gMCA6IC1FSU87CisJLyogRG8gY2FsbCBiYWNrIGZ1bmN0aW9uICovCisJaWYgKCFyZXQpCisJCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCisJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCisJLyogUmV0dXJuIG1vcmUgb3IgbGVzcyBoYXBweSAqLworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbmFuZF9zeW5jIC0gW01URCBJbnRlcmZhY2VdIHN5bmMKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogU3luYyBpcyBhY3R1YWxseSBhIHdhaXQgZm9yIGNoaXAgcmVhZHkgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgbmFuZF9zeW5jIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJREVCVUcgKE1URF9ERUJVR19MRVZFTDMsICJuYW5kX3N5bmM6IGNhbGxlZFxuIik7CisKKwkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KKwluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCwgRkxfU1lOQ0lORyk7CisJLyogUmVsZWFzZSBpdCBhbmQgZ28gYmFjayAqLworCW5hbmRfcmVsZWFzZV9kZXZpY2UgKG10ZCk7Cit9CisKKworLyoqCisgKiBuYW5kX2Jsb2NrX2lzYmFkIC0gW01URCBJbnRlcmZhY2VdIENoZWNrIHdoZXRoZXIgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBvZmZzZXQgaXMgYmFkCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mczoJb2Zmc2V0IHJlbGF0aXZlIHRvIG10ZCBzdGFydAorICovCitzdGF0aWMgaW50IG5hbmRfYmxvY2tfaXNiYWQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKQoreworCS8qIENoZWNrIGZvciBpbnZhbGlkIG9mZnNldCAqLworCWlmIChvZnMgPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG5hbmRfYmxvY2tfY2hlY2tiYWQgKG10ZCwgb2ZzLCAxLCAwKTsKK30KKworLyoqCisgKiBuYW5kX2Jsb2NrX21hcmtiYWQgLSBbTVREIEludGVyZmFjZV0gTWFyayB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIG9mZnNldCBhcyBiYWQKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZzOglvZmZzZXQgcmVsYXRpdmUgdG8gbXRkIHN0YXJ0CisgKi8KK3N0YXRpYyBpbnQgbmFuZF9ibG9ja19tYXJrYmFkIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IG5hbmRfYmxvY2tfaXNiYWQobXRkLCBvZnMpKSkgeworCQkvKiBJZiBpdCB3YXMgYmFkIGFscmVhZHksIHJldHVybiBzdWNjZXNzIGFuZCBkbyBub3RoaW5nLiAqLworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB0aGlzLT5ibG9ja19tYXJrYmFkKG10ZCwgb2ZzKTsKK30KKworLyoqCisgKiBuYW5kX3NjYW4gLSBbTkFORCBJbnRlcmZhY2VdIFNjYW4gZm9yIHRoZSBOQU5EIGRldmljZQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtYXhjaGlwczoJTnVtYmVyIG9mIGNoaXBzIHRvIHNjYW4gZm9yCisgKgorICogVGhpcyBmaWxscyBvdXQgYWxsIHRoZSBub3QgaW5pdGlhbGl6ZWQgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIHdpdGggdGhlIGRlZmF1bHRzLgorICogVGhlIGZsYXNoIElEIGlzIHJlYWQgYW5kIHRoZSBtdGQvY2hpcCBzdHJ1Y3R1cmVzIGFyZQorICogZmlsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcy4gQnVmZmVycyBhcmUgYWxsb2NhdGVkIGlmCisgKiB0aGV5IGFyZSBub3QgcHJvdmlkZWQgYnkgdGhlIGJvYXJkIGRyaXZlcgorICoKKyAqLworaW50IG5hbmRfc2NhbiAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtYXhjaGlwcykKK3sKKwlpbnQgaSwgaiwgbmFuZF9tYWZfaWQsIG5hbmRfZGV2X2lkLCBidXN3OworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwkvKiBHZXQgYnVzd2lkdGggdG8gc2VsZWN0IHRoZSBjb3JyZWN0IGZ1bmN0aW9ucyovCisJYnVzdyA9IHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2OworCisJLyogY2hlY2sgZm9yIHByb3BlciBjaGlwX2RlbGF5IHNldHVwLCBzZXQgMjB1cyBpZiBub3QgKi8KKwlpZiAoIXRoaXMtPmNoaXBfZGVsYXkpCisJCXRoaXMtPmNoaXBfZGVsYXkgPSAyMDsKKworCS8qIGNoZWNrLCBpZiBhIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBmdW5jdGlvbiBnaXZlbiAqLworCWlmICh0aGlzLT5jbWRmdW5jID09IE5VTEwpCisJCXRoaXMtPmNtZGZ1bmMgPSBuYW5kX2NvbW1hbmQ7CisKKwkvKiBjaGVjaywgaWYgYSB1c2VyIHN1cHBsaWVkIHdhaXQgZnVuY3Rpb24gZ2l2ZW4gKi8KKwlpZiAodGhpcy0+d2FpdGZ1bmMgPT0gTlVMTCkKKwkJdGhpcy0+d2FpdGZ1bmMgPSBuYW5kX3dhaXQ7CisKKwlpZiAoIXRoaXMtPnNlbGVjdF9jaGlwKQorCQl0aGlzLT5zZWxlY3RfY2hpcCA9IG5hbmRfc2VsZWN0X2NoaXA7CisJaWYgKCF0aGlzLT53cml0ZV9ieXRlKQorCQl0aGlzLT53cml0ZV9ieXRlID0gYnVzdyA/IG5hbmRfd3JpdGVfYnl0ZTE2IDogbmFuZF93cml0ZV9ieXRlOworCWlmICghdGhpcy0+cmVhZF9ieXRlKQorCQl0aGlzLT5yZWFkX2J5dGUgPSBidXN3ID8gbmFuZF9yZWFkX2J5dGUxNiA6IG5hbmRfcmVhZF9ieXRlOworCWlmICghdGhpcy0+d3JpdGVfd29yZCkKKwkJdGhpcy0+d3JpdGVfd29yZCA9IG5hbmRfd3JpdGVfd29yZDsKKwlpZiAoIXRoaXMtPnJlYWRfd29yZCkKKwkJdGhpcy0+cmVhZF93b3JkID0gbmFuZF9yZWFkX3dvcmQ7CisJaWYgKCF0aGlzLT5ibG9ja19iYWQpCisJCXRoaXMtPmJsb2NrX2JhZCA9IG5hbmRfYmxvY2tfYmFkOworCWlmICghdGhpcy0+YmxvY2tfbWFya2JhZCkKKwkJdGhpcy0+YmxvY2tfbWFya2JhZCA9IG5hbmRfZGVmYXVsdF9ibG9ja19tYXJrYmFkOworCWlmICghdGhpcy0+d3JpdGVfYnVmKQorCQl0aGlzLT53cml0ZV9idWYgPSBidXN3ID8gbmFuZF93cml0ZV9idWYxNiA6IG5hbmRfd3JpdGVfYnVmOworCWlmICghdGhpcy0+cmVhZF9idWYpCisJCXRoaXMtPnJlYWRfYnVmID0gYnVzdyA/IG5hbmRfcmVhZF9idWYxNiA6IG5hbmRfcmVhZF9idWY7CisJaWYgKCF0aGlzLT52ZXJpZnlfYnVmKQorCQl0aGlzLT52ZXJpZnlfYnVmID0gYnVzdyA/IG5hbmRfdmVyaWZ5X2J1ZjE2IDogbmFuZF92ZXJpZnlfYnVmOworCWlmICghdGhpcy0+c2Nhbl9iYnQpCisJCXRoaXMtPnNjYW5fYmJ0ID0gbmFuZF9kZWZhdWx0X2JidDsKKworCS8qIFNlbGVjdCB0aGUgZGV2aWNlICovCisJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCAwKTsKKworCS8qIFNlbmQgdGhlIGNvbW1hbmQgZm9yIHJlYWRpbmcgZGV2aWNlIElEICovCisJdGhpcy0+Y21kZnVuYyAobXRkLCBOQU5EX0NNRF9SRUFESUQsIDB4MDAsIC0xKTsKKworCS8qIFJlYWQgbWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSURzICovCisJbmFuZF9tYWZfaWQgPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwluYW5kX2Rldl9pZCA9IHRoaXMtPnJlYWRfYnl0ZShtdGQpOworCisJLyogUHJpbnQgYW5kIHN0b3JlIGZsYXNoIGRldmljZSBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IG5hbmRfZmxhc2hfaWRzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisKKwkJaWYgKG5hbmRfZGV2X2lkICE9IG5hbmRfZmxhc2hfaWRzW2ldLmlkKQorCQkJY29udGludWU7CisKKwkJaWYgKCFtdGQtPm5hbWUpIG10ZC0+bmFtZSA9IG5hbmRfZmxhc2hfaWRzW2ldLm5hbWU7CisJCXRoaXMtPmNoaXBzaXplID0gbmFuZF9mbGFzaF9pZHNbaV0uY2hpcHNpemUgPDwgMjA7CisKKwkJLyogTmV3IGRldmljZXMgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uYWwgaWQgYnl0ZXMgKi8KKwkJaWYgKCFuYW5kX2ZsYXNoX2lkc1tpXS5wYWdlc2l6ZSkgeworCQkJaW50IGV4dGlkOworCQkJLyogVGhlIDNyZCBpZCBieXRlIGNvbnRhaW5zIG5vbiByZWxldmFudCBkYXRhIEFUTSAqLworCQkJZXh0aWQgPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwkJCS8qIFRoZSA0dGggaWQgYnl0ZSBpcyB0aGUgaW1wb3J0YW50IG9uZSAqLworCQkJZXh0aWQgPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwkJCS8qIENhbGMgcGFnZXNpemUgKi8KKwkJCW10ZC0+b29iYmxvY2sgPSAxMDI0IDw8IChleHRpZCAmIDB4Myk7CisJCQlleHRpZCA+Pj0gMjsKKwkJCS8qIENhbGMgb29ic2l6ZSAqLworCQkJbXRkLT5vb2JzaXplID0gKDggPDwgKGV4dGlkICYgMHgwMykpICogKG10ZC0+b29iYmxvY2sgLyA1MTIpOworCQkJZXh0aWQgPj49IDI7CisJCQkvKiBDYWxjIGJsb2Nrc2l6ZS4gQmxvY2tzaXplIGlzIG11bHRpcGxlcyBvZiA2NEtpQiAqLworCQkJbXRkLT5lcmFzZXNpemUgPSAoNjQgKiAxMDI0KSAgPDwgKGV4dGlkICYgMHgwMyk7CisJCQlleHRpZCA+Pj0gMjsKKwkJCS8qIEdldCBidXN3aWR0aCBpbmZvcm1hdGlvbiAqLworCQkJYnVzdyA9IChleHRpZCAmIDB4MDEpID8gTkFORF9CVVNXSURUSF8xNiA6IDA7CisKKwkJfSBlbHNlIHsKKwkJCS8qIE9sZCBkZXZpY2VzIGhhdmUgdGhpcyBkYXRhIGhhcmRjb2RlZCBpbiB0aGUKKwkJCSAqIGRldmljZSBpZCB0YWJsZSAqLworCQkJbXRkLT5lcmFzZXNpemUgPSBuYW5kX2ZsYXNoX2lkc1tpXS5lcmFzZXNpemU7CisJCQltdGQtPm9vYmJsb2NrID0gbmFuZF9mbGFzaF9pZHNbaV0ucGFnZXNpemU7CisJCQltdGQtPm9vYnNpemUgPSBtdGQtPm9vYmJsb2NrIC8gMzI7CisJCQlidXN3ID0gbmFuZF9mbGFzaF9pZHNbaV0ub3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTY7CisJCX0KKworCQkvKiBDaGVjaywgaWYgYnVzd2lkdGggaXMgY29ycmVjdC4gSGFyZHdhcmUgZHJpdmVycyBzaG91bGQgc2V0CisJCSAqIHRoaXMgY29ycmVjdCAhICovCisJCWlmIChidXN3ICE9ICh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJOQU5EIGRldmljZTogTWFudWZhY3R1cmVyIElEOiIKKwkJCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwKKwkJCQluYW5kX21hbnVmX2lkc1tpXS5uYW1lICwgbXRkLT5uYW1lKTsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJIk5BTkQgYnVzIHdpZHRoICVkIGluc3RlYWQgJWQgYml0XG4iLAorCQkJCQkodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpID8gMTYgOiA4LAorCQkJCQlidXN3ID8gMTYgOiA4KTsKKwkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgc2hpZnQgZnJvbSB0aGUgcGFnZSBzaXplICovCisJCXRoaXMtPnBhZ2Vfc2hpZnQgPSBmZnMobXRkLT5vb2JibG9jaykgLSAxOworCQl0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgPSB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0ID0gZmZzKG10ZC0+ZXJhc2VzaXplKSAtIDE7CisJCXRoaXMtPmNoaXBfc2hpZnQgPSBmZnModGhpcy0+Y2hpcHNpemUpIC0gMTsKKworCQkvKiBTZXQgdGhlIGJhZCBibG9jayBwb3NpdGlvbiAqLworCQl0aGlzLT5iYWRibG9ja3BvcyA9IG10ZC0+b29iYmxvY2sgPiA1MTIgPworCQkJTkFORF9MQVJHRV9CQURCTE9DS19QT1MgOiBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUzsKKworCQkvKiBHZXQgY2hpcCBvcHRpb25zLCBwcmVzZXJ2ZSBub24gY2hpcCBiYXNlZCBvcHRpb25zICovCisJCXRoaXMtPm9wdGlvbnMgJj0gfk5BTkRfQ0hJUE9QVElPTlNfTVNLOworCQl0aGlzLT5vcHRpb25zIHw9IG5hbmRfZmxhc2hfaWRzW2ldLm9wdGlvbnMgJiBOQU5EX0NISVBPUFRJT05TX01TSzsKKwkJLyogU2V0IHRoaXMgYXMgYSBkZWZhdWx0LiBCb2FyZCBkcml2ZXJzIGNhbiBvdmVycmlkZSBpdCwgaWYgbmVjY2VjYXJ5ICovCisJCXRoaXMtPm9wdGlvbnMgfD0gTkFORF9OT19BVVRPSU5DUjsKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIG5vdCBhIHNhbXN1bmcgZGV2aWNlLiBEbyBub3QgY2xlYXIgdGhlIG9wdGlvbnMKKwkJICogZm9yIGNoaXBzIHdoaWNoIGFyZSBub3QgaGF2aW5nIGFuIGV4dGVuZGVkIGlkLgorCQkgKi8KKwkJaWYgKG5hbmRfbWFmX2lkICE9IE5BTkRfTUZSX1NBTVNVTkcgJiYgIW5hbmRfZmxhc2hfaWRzW2ldLnBhZ2VzaXplKQorCQkJdGhpcy0+b3B0aW9ucyAmPSB+TkFORF9TQU1TVU5HX0xQX09QVElPTlM7CisKKwkJLyogQ2hlY2sgZm9yIEFORCBjaGlwcyB3aXRoIDQgcGFnZSBwbGFuZXMgKi8KKwkJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EXzRQQUdFX0FSUkFZKQorCQkJdGhpcy0+ZXJhc2VfY21kID0gbXVsdGlfZXJhc2VfY21kOworCQllbHNlCisJCQl0aGlzLT5lcmFzZV9jbWQgPSBzaW5nbGVfZXJhc2VfY21kOworCisJCS8qIERvIG5vdCByZXBsYWNlIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBmdW5jdGlvbiAhICovCisJCWlmIChtdGQtPm9vYmJsb2NrID4gNTEyICYmIHRoaXMtPmNtZGZ1bmMgPT0gbmFuZF9jb21tYW5kKQorCQkJdGhpcy0+Y21kZnVuYyA9IG5hbmRfY29tbWFuZF9scDsKKworCQkvKiBUcnkgdG8gaWRlbnRpZnkgbWFudWZhY3R1cmVyICovCisJCWZvciAoaiA9IDA7IG5hbmRfbWFudWZfaWRzW2pdLmlkICE9IDB4MDsgaisrKSB7CisJCQlpZiAobmFuZF9tYW51Zl9pZHNbal0uaWQgPT0gbmFuZF9tYWZfaWQpCisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKCFuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJObyBOQU5EIGRldmljZSBmb3VuZCEhIVxuIik7CisJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGk9MTsgaSA8IG1heGNoaXBzOyBpKyspIHsKKwkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBpKTsKKworCQkvKiBTZW5kIHRoZSBjb21tYW5kIGZvciByZWFkaW5nIGRldmljZSBJRCAqLworCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1JFQURJRCwgMHgwMCwgLTEpOworCisJCS8qIFJlYWQgbWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSURzICovCisJCWlmIChuYW5kX21hZl9pZCAhPSB0aGlzLT5yZWFkX2J5dGUobXRkKSB8fAorCQkgICAgbmFuZF9kZXZfaWQgIT0gdGhpcy0+cmVhZF9ieXRlKG10ZCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlZCBOQU5EIGNoaXBzIGRldGVjdGVkXG4iLCBpKTsKKworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMsIGlmIG5lY2NlY2FyeSAqLworCWlmICghdGhpcy0+b29iX2J1ZikgeworCQlzaXplX3QgbGVuOworCQlsZW4gPSBtdGQtPm9vYnNpemUgPDwgKHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KTsKKwkJdGhpcy0+b29iX2J1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGhpcy0+b29iX2J1ZikgeworCQkJcHJpbnRrIChLRVJOX0VSUiAibmFuZF9zY2FuKCk6IENhbm5vdCBhbGxvY2F0ZSBvb2JfYnVmXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXRoaXMtPm9wdGlvbnMgfD0gTkFORF9PT0JCVUZfQUxMT0M7CisJfQorCisJaWYgKCF0aGlzLT5kYXRhX2J1ZikgeworCQlzaXplX3QgbGVuOworCQlsZW4gPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOworCQl0aGlzLT5kYXRhX2J1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGhpcy0+ZGF0YV9idWYpIHsKKwkJCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9PT0JCVUZfQUxMT0MpCisJCQkJa2ZyZWUgKHRoaXMtPm9vYl9idWYpOworCQkJcHJpbnRrIChLRVJOX0VSUiAibmFuZF9zY2FuKCk6IENhbm5vdCBhbGxvY2F0ZSBkYXRhX2J1ZlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl0aGlzLT5vcHRpb25zIHw9IE5BTkRfREFUQUJVRl9BTExPQzsKKwl9CisKKwkvKiBTdG9yZSB0aGUgbnVtYmVyIG9mIGNoaXBzIGFuZCBjYWxjIHRvdGFsIHNpemUgZm9yIG10ZCAqLworCXRoaXMtPm51bWNoaXBzID0gaTsKKwltdGQtPnNpemUgPSBpICogdGhpcy0+Y2hpcHNpemU7CisJLyogQ29udmVydCBjaGlwc2l6ZSB0byBudW1iZXIgb2YgcGFnZXMgcGVyIGNoaXAgLTEuICovCisJdGhpcy0+cGFnZW1hc2sgPSAodGhpcy0+Y2hpcHNpemUgPj4gdGhpcy0+cGFnZV9zaGlmdCkgLSAxOworCS8qIFByZXNldCB0aGUgaW50ZXJuYWwgb29iIGJ1ZmZlciAqLworCW1lbXNldCh0aGlzLT5vb2JfYnVmLCAweGZmLCBtdGQtPm9vYnNpemUgPDwgKHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KSk7CisKKwkvKiBJZiBubyBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgaXMgZ2l2ZW4sIHNlbGVjdCBhbgorCSAqIGFwcHJvcHJpYXRlIG9uZSAqLworCWlmICghdGhpcy0+YXV0b29vYikgeworCQkvKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgb29iIHBsYWNlbWVudCBzY2hlbWUgZm9yCisJCSAqIHBsYWNlbWVudCBhZ25vc3RpYyBmaWxlc3lzdGVtcyAqLworCQlzd2l0Y2ggKG10ZC0+b29ic2l6ZSkgeworCQljYXNlIDg6CisJCQl0aGlzLT5hdXRvb29iID0gJm5hbmRfb29iXzg7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXRoaXMtPmF1dG9vb2IgPSAmbmFuZF9vb2JfMTY7CisJCQlicmVhazsKKwkJY2FzZSA2NDoKKwkJCXRoaXMtPmF1dG9vb2IgPSAmbmFuZF9vb2JfNjQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJObyBvb2Igc2NoZW1lIGRlZmluZWQgZm9yIG9vYnNpemUgJWRcbiIsCisJCQkJbXRkLT5vb2JzaXplKTsKKy8qCQkJQlVHKCk7ICovCisJCX0KKwl9CisKKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgdGhlIGZpbGVzeXN0ZW0gdG8gcGxhY2UgZnMgZGVwZW5kZW5kCisJICogb29iIGRhdGEgKi8KKwlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpIHsKKwkJbXRkLT5vb2JhdmFpbCA9IG10ZC0+b29ic2l6ZSAtICh0aGlzLT5hdXRvb29iLT5lY2NieXRlcyArIDIpOworCQlpZiAodGhpcy0+YXV0b29vYi0+ZWNjYnl0ZXMgJiAweDAxKQorCQkJbXRkLT5vb2JhdmFpbC0tOworCX0gZWxzZQorCQltdGQtPm9vYmF2YWlsID0gbXRkLT5vb2JzaXplIC0gKHRoaXMtPmF1dG9vb2ItPmVjY2J5dGVzICsgMSk7CisKKwkvKgorCSAqIGNoZWNrIEVDQyBtb2RlLCBkZWZhdWx0IHRvIHNvZnR3YXJlCisJICogaWYgM2J5dGUvNTEyYnl0ZSBoYXJkd2FyZSBFQ0MgaXMgc2VsZWN0ZWQgYW5kIHdlIGhhdmUgMjU2IGJ5dGUgcGFnZXNpemUKKwkgKiBmYWxsYmFjayB0byBzb2Z0d2FyZSBFQ0MKKwkqLworCXRoaXMtPmVjY3NpemUgPSAyNTY7CS8qIHNldCBkZWZhdWx0IGVjY3NpemUgKi8KKwl0aGlzLT5lY2NieXRlcyA9IDM7CisKKwlzd2l0Y2ggKHRoaXMtPmVjY21vZGUpIHsKKwljYXNlIE5BTkRfRUNDX0hXMTJfMjA0ODoKKwkJaWYgKG10ZC0+b29iYmxvY2sgPCAyMDQ4KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIyMDQ4IGJ5dGUgSFcgRUNDIG5vdCBwb3NzaWJsZSBvbiAlZCBieXRlIHBhZ2Ugc2l6ZSwgZmFsbGJhY2sgdG8gU1cgRUNDXG4iLAorCQkJICAgICAgIG10ZC0+b29iYmxvY2spOworCQkJdGhpcy0+ZWNjbW9kZSA9IE5BTkRfRUNDX1NPRlQ7CisJCQl0aGlzLT5jYWxjdWxhdGVfZWNjID0gbmFuZF9jYWxjdWxhdGVfZWNjOworCQkJdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7CisJCX0gZWxzZQorCQkJdGhpcy0+ZWNjc2l6ZSA9IDIwNDg7CisJCWJyZWFrOworCisJY2FzZSBOQU5EX0VDQ19IVzNfNTEyOgorCWNhc2UgTkFORF9FQ0NfSFc2XzUxMjoKKwljYXNlIE5BTkRfRUNDX0hXOF81MTI6CisJCWlmIChtdGQtPm9vYmJsb2NrID09IDI1NikgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIjUxMiBieXRlIEhXIEVDQyBub3QgcG9zc2libGUgb24gMjU2IEJ5dGUgcGFnZXNpemUsIGZhbGxiYWNrIHRvIFNXIEVDQyBcbiIpOworCQkJdGhpcy0+ZWNjbW9kZSA9IE5BTkRfRUNDX1NPRlQ7CisJCQl0aGlzLT5jYWxjdWxhdGVfZWNjID0gbmFuZF9jYWxjdWxhdGVfZWNjOworCQkJdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7CisJCX0gZWxzZQorCQkJdGhpcy0+ZWNjc2l6ZSA9IDUxMjsgLyogc2V0IGVjY3NpemUgdG8gNTEyICovCisJCWJyZWFrOworCisJY2FzZSBOQU5EX0VDQ19IVzNfMjU2OgorCQlicmVhazsKKworCWNhc2UgTkFORF9FQ0NfTk9ORToKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIk5BTkRfRUNDX05PTkUgc2VsZWN0ZWQgYnkgYm9hcmQgZHJpdmVyLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCAhIVxuIik7CisJCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19OT05FOworCQlicmVhazsKKworCWNhc2UgTkFORF9FQ0NfU09GVDoKKwkJdGhpcy0+Y2FsY3VsYXRlX2VjYyA9IG5hbmRfY2FsY3VsYXRlX2VjYzsKKwkJdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkludmFsaWQgTkFORF9FQ0NfTU9ERSAlZFxuIiwgdGhpcy0+ZWNjbW9kZSk7CisvKgkJQlVHKCk7ICovCisJfQorCisJLyogQ2hlY2sgaGFyZHdhcmUgZWNjIGZ1bmN0aW9uIGF2YWlsYWJpbGl0eSBhbmQgYWRqdXN0IG51bWJlciBvZiBlY2MgYnl0ZXMgcGVyCisJICogY2FsY3VsYXRpb24gc3RlcAorCSovCisJc3dpdGNoICh0aGlzLT5lY2Ntb2RlKSB7CisJY2FzZSBOQU5EX0VDQ19IVzEyXzIwNDg6CisJCXRoaXMtPmVjY2J5dGVzICs9IDQ7CisJY2FzZSBOQU5EX0VDQ19IVzhfNTEyOgorCQl0aGlzLT5lY2NieXRlcyArPSAyOworCWNhc2UgTkFORF9FQ0NfSFc2XzUxMjoKKwkJdGhpcy0+ZWNjYnl0ZXMgKz0gMzsKKwljYXNlIE5BTkRfRUNDX0hXM181MTI6CisJY2FzZSBOQU5EX0VDQ19IVzNfMjU2OgorCQlpZiAodGhpcy0+Y2FsY3VsYXRlX2VjYyAmJiB0aGlzLT5jb3JyZWN0X2RhdGEgJiYgdGhpcy0+ZW5hYmxlX2h3ZWNjKQorCQkJYnJlYWs7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJObyBFQ0MgZnVuY3Rpb25zIHN1cHBsaWVkLCBIYXJkd2FyZSBFQ0Mgbm90IHBvc3NpYmxlXG4iKTsKKy8qCQlCVUcoKTsJKi8KKwl9CisKKwltdGQtPmVjY3NpemUgPSB0aGlzLT5lY2NzaXplOworCisJLyogU2V0IHRoZSBudW1iZXIgb2YgcmVhZCAvIHdyaXRlIHN0ZXBzIGZvciBvbmUgcGFnZSB0byBlbnN1cmUgRUNDIGdlbmVyYXRpb24gKi8KKwlzd2l0Y2ggKHRoaXMtPmVjY21vZGUpIHsKKwljYXNlIE5BTkRfRUNDX0hXMTJfMjA0ODoKKwkJdGhpcy0+ZWNjc3RlcHMgPSBtdGQtPm9vYmJsb2NrIC8gMjA0ODsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0VDQ19IVzNfNTEyOgorCWNhc2UgTkFORF9FQ0NfSFc2XzUxMjoKKwljYXNlIE5BTkRfRUNDX0hXOF81MTI6CisJCXRoaXMtPmVjY3N0ZXBzID0gbXRkLT5vb2JibG9jayAvIDUxMjsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0VDQ19IVzNfMjU2OgorCWNhc2UgTkFORF9FQ0NfU09GVDoKKwkJdGhpcy0+ZWNjc3RlcHMgPSBtdGQtPm9vYmJsb2NrIC8gMjU2OworCQlicmVhazsKKworCWNhc2UgTkFORF9FQ0NfTk9ORToKKwkJdGhpcy0+ZWNjc3RlcHMgPSAxOworCQlicmVhazsKKwl9CisKKy8qIFhYWCBVLUJPT1QgWFhYICovCisjaWYgMAorCS8qIEluaXRpYWxpemUgc3RhdGUsIHdhaXRxdWV1ZSBhbmQgc3BpbmxvY2sgKi8KKwl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZ0aGlzLT53cSk7CisJc3Bpbl9sb2NrX2luaXQgKCZ0aGlzLT5jaGlwX2xvY2spOworI2VuZGlmCisKKwkvKiBEZS1zZWxlY3QgdGhlIGRldmljZSAqLworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCisJLyogSW52YWxpZGF0ZSB0aGUgcGFnZWJ1ZmZlciByZWZlcmVuY2UgKi8KKwl0aGlzLT5wYWdlYnVmID0gLTE7CisKKwkvKiBGaWxsIGluIHJlbWFpbmluZyBNVEQgZHJpdmVyIGRhdGEgKi8KKwltdGQtPnR5cGUgPSBNVERfTkFOREZMQVNIOworCW10ZC0+ZmxhZ3MgPSBNVERfQ0FQX05BTkRGTEFTSCB8IE1URF9FQ0M7CisJbXRkLT5lY2N0eXBlID0gTVREX0VDQ19TVzsKKwltdGQtPmVyYXNlID0gbmFuZF9lcmFzZTsKKwltdGQtPnBvaW50ID0gTlVMTDsKKwltdGQtPnVucG9pbnQgPSBOVUxMOworCW10ZC0+cmVhZCA9IG5hbmRfcmVhZDsKKwltdGQtPndyaXRlID0gbmFuZF93cml0ZTsKKwltdGQtPnJlYWRfZWNjID0gbmFuZF9yZWFkX2VjYzsKKwltdGQtPndyaXRlX2VjYyA9IG5hbmRfd3JpdGVfZWNjOworCW10ZC0+cmVhZF9vb2IgPSBuYW5kX3JlYWRfb29iOworCW10ZC0+d3JpdGVfb29iID0gbmFuZF93cml0ZV9vb2I7CisvKiBYWFggVS1CT09UIFhYWCAqLworI2lmIDAKKwltdGQtPnJlYWR2ID0gTlVMTDsKKwltdGQtPndyaXRldiA9IG5hbmRfd3JpdGV2OworCW10ZC0+d3JpdGV2X2VjYyA9IG5hbmRfd3JpdGV2X2VjYzsKKyNlbmRpZgorCW10ZC0+c3luYyA9IG5hbmRfc3luYzsKKy8qIFhYWCBVLUJPT1QgWFhYICovCisjaWYgMAorCW10ZC0+bG9jayA9IE5VTEw7CisJbXRkLT51bmxvY2sgPSBOVUxMOworCW10ZC0+c3VzcGVuZCA9IE5VTEw7CisJbXRkLT5yZXN1bWUgPSBOVUxMOworI2VuZGlmCisJbXRkLT5ibG9ja19pc2JhZCA9IG5hbmRfYmxvY2tfaXNiYWQ7CisJbXRkLT5ibG9ja19tYXJrYmFkID0gbmFuZF9ibG9ja19tYXJrYmFkOworCisJLyogYW5kIG1ha2UgdGhlIGF1dG9vb2IgdGhlIGRlZmF1bHQgb25lICovCisJbWVtY3B5KCZtdGQtPm9vYmluZm8sIHRoaXMtPmF1dG9vb2IsIHNpemVvZihtdGQtPm9vYmluZm8pKTsKKy8qIFhYWCBVLUJPT1QgWFhYICovCisjaWYgMAorCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZgorCS8qIEJ1aWxkIGJhZCBibG9jayB0YWJsZSAqLworCXJldHVybiB0aGlzLT5zY2FuX2JidCAobXRkKTsKK30KKworLyoqCisgKiBuYW5kX3JlbGVhc2UgLSBbTkFORCBJbnRlcmZhY2VdIEZyZWUgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIE5BTkQgZGV2aWNlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICovCit2b2lkIG5hbmRfcmVsZWFzZSAoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCS8qIERlcmVnaXN0ZXIgcGFydGl0aW9ucyAqLworCWRlbF9tdGRfcGFydGl0aW9ucyAobXRkKTsKKyNlbmRpZgorCS8qIERlcmVnaXN0ZXIgdGhlIGRldmljZSAqLworLyogWFhYIFUtQk9PVCBYWFggKi8KKyNpZiAwCisJZGVsX210ZF9kZXZpY2UgKG10ZCk7CisjZW5kaWYKKwkvKiBGcmVlIGJhZCBibG9jayB0YWJsZSBtZW1vcnksIGlmIGFsbG9jYXRlZCAqLworCWlmICh0aGlzLT5iYnQpCisJCWtmcmVlICh0aGlzLT5iYnQpOworCS8qIEJ1ZmZlciBhbGxvY2F0ZWQgYnkgbmFuZF9zY2FuID8gKi8KKwlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfT09CQlVGX0FMTE9DKQorCQlrZnJlZSAodGhpcy0+b29iX2J1Zik7CisJLyogQnVmZmVyIGFsbG9jYXRlZCBieSBuYW5kX3NjYW4gPyAqLworCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9EQVRBQlVGX0FMTE9DKQorCQlrZnJlZSAodGhpcy0+ZGF0YV9idWYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2JidC5jIGIvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxNjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kX2JidC5jCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoKKyAqICBkcml2ZXJzL210ZC9uYW5kX2JidC5jCisgKgorICogIE92ZXJ2aWV3OgorICogICBCYWQgYmxvY2sgdGFibGUgc3VwcG9ydCBmb3IgdGhlIE5BTkQgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBUaG9tYXMgR2xlaXhuZXIgKHRnbHhAbGludXRyb25peC5kZSkKKyAqCisgKiAkSWQ6IG5hbmRfYmJ0LmMsdiAxLjI4IDIwMDQvMTEvMTMgMTA6MTk6MDkgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFdoZW4gbmFuZF9zY2FuX2JidCBpcyBjYWxsZWQsIHRoZW4gaXQgdHJpZXMgdG8gZmluZCB0aGUgYmFkIGJsb2NrIHRhYmxlCisgKiBkZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgaW4gdGhlIGJidCBkZXNjcmlwdG9yKHMpLiBJZiBhIGJidCBpcyBmb3VuZAorICogdGhlbiB0aGUgY29udGVudHMgYXJlIHJlYWQgYW5kIHRoZSBtZW1vcnkgYmFzZWQgYmJ0IGlzIGNyZWF0ZWQuIElmIGEKKyAqIG1pcnJvcmVkIGJidCBpcyBzZWxlY3RlZCB0aGVuIHRoZSBtaXJyb3IgaXMgc2VhcmNoZWQgdG9vIGFuZCB0aGUKKyAqIHZlcnNpb25zIGFyZSBjb21wYXJlZC4gSWYgdGhlIG1pcnJvciBoYXMgYSBncmVhdGVyIHZlcnNpb24gbnVtYmVyCisgKiB0aGFuIHRoZSBtaXJyb3IgYmJ0IGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1lbW9yeSBiYXNlZCBiYnQuCisgKiBJZiB0aGUgdGFibGVzIGFyZSBub3QgdmVyc2lvbmVkLCB0aGVuIHdlICJvciIgdGhlIGJhZCBibG9jayBpbmZvcm1hdGlvbi4KKyAqIElmIG9uZSBvZiB0aGUgYmJ0J3MgaXMgb3V0IG9mIGRhdGUgb3IgZG9lcyBub3QgZXhpc3QgaXQgaXMgKHJlKWNyZWF0ZWQuCisgKiBJZiBubyBiYnQgZXhpc3RzIGF0IGFsbCB0aGVuIHRoZSBkZXZpY2UgaXMgc2Nhbm5lZCBmb3IgZmFjdG9yeSBtYXJrZWQKKyAqIGdvb2QgLyBiYWQgYmxvY2tzIGFuZCB0aGUgYmFkIGJsb2NrIHRhYmxlcyBhcmUgY3JlYXRlZC4KKyAqCisgKiBGb3IgbWFudWZhY3R1cmVyIGNyZWF0ZWQgYmJ0cyBsaWtlIHRoZSBvbmUgZm91bmQgb24gTS1TWVMgRE9DIGRldmljZXMKKyAqIHRoZSBiYnQgaXMgc2VhcmNoZWQgYW5kIHJlYWQgYnV0IG5ldmVyIGNyZWF0ZWQKKyAqCisgKiBUaGUgYXV0b2dlbmVyYXRlZCBiYWQgYmxvY2sgdGFibGUgaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCBnb29kIGJsb2NrcworICogb2YgdGhlIGRldmljZS4gVGhlIHRhYmxlIGlzIG1pcnJvcmVkLCBzbyBpdCBjYW4gYmUgdXBkYXRlZCBldmVudHVhbGx5LgorICogVGhlIHRhYmxlIGlzIG1hcmtlZCBpbiB0aGUgb29iIGFyZWEgd2l0aCBhbiBpZGVudCBwYXR0ZXJuIGFuZCBhIHZlcnNpb24KKyAqIG51bWJlciB3aGljaCBpbmRpY2F0ZXMgd2hpY2ggb2YgYm90aCB0YWJsZXMgaXMgbW9yZSB1cCB0byBkYXRlLgorICoKKyAqIFRoZSB0YWJsZSB1c2VzIDIgYml0cyBwZXIgYmxvY2sKKyAqIDExYjogCWJsb2NrIGlzIGdvb2QKKyAqIDAwYjogCWJsb2NrIGlzIGZhY3RvcnkgbWFya2VkIGJhZAorICogMDFiLCAxMGI6IAlibG9jayBpcyBtYXJrZWQgYmFkIGR1ZSB0byB3ZWFyCisgKgorICogVGhlIG1lbW9yeSBiYWQgYmxvY2sgdGFibGUgdXNlcyB0aGUgZm9sbG93aW5nIHNjaGVtZToKKyAqIDAwYjoJCWJsb2NrIGlzIGdvb2QKKyAqIDAxYjoJCWJsb2NrIGlzIG1hcmtlZCBiYWQgZHVlIHRvIHdlYXIKKyAqIDEwYjoJCWJsb2NrIGlzIHJlc2VydmVkICh0byBwcm90ZWN0IHRoZSBiYnQgYXJlYSkKKyAqIDExYjoJCWJsb2NrIGlzIGZhY3RvcnkgbWFya2VkIGJhZAorICoKKyAqIE11bHRpY2hpcCBkZXZpY2VzIGxpa2UgRE9DIHN0b3JlIHRoZSBiYWQgYmxvY2sgaW5mbyBwZXIgZmxvb3IuCisgKgorICogRm9sbG93aW5nIGFzc3VtcHRpb25zIGFyZSBtYWRlOgorICogLSBiYnRzIHN0YXJ0IGF0IGEgcGFnZSBib3VuZGFyeSwgaWYgYXV0b2xvY2F0ZWQgb24gYSBibG9jayBib3VuZGFyeQorICogLSB0aGUgc3BhY2UgbmVjY2VjYXJ5IGZvciBhIGJidCBpbiBGTEFTSCBkb2VzIG5vdCBleGNlZWQgYSBibG9jayBib3VuZGFyeQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9MRUdBQ1kKKyNlcnJvciBDRkdfTkFORF9MRUdBQ1kgZGVmaW5lZCBpbiBhIGZpbGUgbm90IHVzaW5nIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0IQorI2VuZGlmCisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKy8qKgorICogY2hlY2tfcGF0dGVybiAtIFtHRU5FUklDXSBjaGVjayBpZiBhIHBhdHRlcm4gaXMgaW4gdGhlIGJ1ZmZlcgorICogQGJ1ZjoJdGhlIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEBsZW46CXRoZSBsZW5ndGggb2YgYnVmZmVyIHRvIHNlYXJjaAorICogQHBhZ2xlbjoJdGhlIHBhZ2VsZW5ndGgKKyAqIEB0ZDoJCXNlYXJjaCBwYXR0ZXJuIGRlc2NyaXB0b3IKKyAqCisgKiBDaGVjayBmb3IgYSBwYXR0ZXJuIGF0IHRoZSBnaXZlbiBwbGFjZS4gVXNlZCB0byBzZWFyY2ggYmFkIGJsb2NrCisgKiB0YWJsZXMgYW5kIGdvb2QgLyBiYWQgYmxvY2sgaWRlbnRpZmllcnMuCisgKiBJZiB0aGUgU0NBTl9FTVBUWSBvcHRpb24gaXMgc2V0IHRoZW4gY2hlY2ssIGlmIGFsbCBieXRlcyBleGNlcHQgdGhlCisgKiBwYXR0ZXJuIGFyZWEgY29udGFpbiAweGZmCisgKgorKi8KK3N0YXRpYyBpbnQgY2hlY2tfcGF0dGVybiAodWludDhfdCAqYnVmLCBpbnQgbGVuLCBpbnQgcGFnbGVuLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQoreworCWludCBpLCBlbmQ7CisJdWludDhfdCAqcCA9IGJ1ZjsKKworCWVuZCA9IHBhZ2xlbiArIHRkLT5vZmZzOworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkgeworCQlmb3IgKGkgPSAwOyBpIDwgZW5kOyBpKyspIHsKKwkJCWlmIChwW2ldICE9IDB4ZmYpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXAgKz0gZW5kOworCisJLyogQ29tcGFyZSB0aGUgcGF0dGVybiAqLworCWZvciAoaSA9IDA7IGkgPCB0ZC0+bGVuOyBpKyspIHsKKwkJaWYgKHBbaV0gIT0gdGQtPnBhdHRlcm5baV0pCisJCQlyZXR1cm4gLTE7CisJfQorCisJcCArPSB0ZC0+bGVuOworCWVuZCArPSB0ZC0+bGVuOworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkgeworCQlmb3IgKGkgPSBlbmQ7IGkgPCBsZW47IGkrKykgeworCQkJaWYgKCpwKysgIT0gMHhmZikKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVhZF9iYnQgLSBbR0VORVJJQ10gUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIHN0YXJ0aW5nIGZyb20gcGFnZQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKKyAqIEBwYWdlOgl0aGUgc3RhcnRpbmcgcGFnZQorICogQG51bToJdGhlIG51bWJlciBvZiBiYnQgZGVzY3JpcHRvcnMgdG8gcmVhZAorICogQGJpdHM6CW51bWJlciBvZiBiaXRzIHBlciBibG9jaworICogQG9mZnM6CW9mZnNldCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgKiBAcmVzZXJ2ZWRfYmxvY2tfY29kZToJUGF0dGVybiB0byBpZGVudGlmeSByZXNlcnZlZCBibG9ja3MKKyAqCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgZnJvbSBwYWdlLgorICoKKyAqLworc3RhdGljIGludCByZWFkX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UsIGludCBudW0sCisJaW50IGJpdHMsIGludCBvZmZzLCBpbnQgcmVzZXJ2ZWRfYmxvY2tfY29kZSkKK3sKKwlpbnQgcmVzLCBpLCBqLCBhY3QgPSAwOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc2l6ZV90IHJldGxlbiwgbGVuLCB0b3RsZW47CisJbG9mZl90IGZyb207CisJdWludDhfdCBtc2sgPSAodWludDhfdCkgKCgxIDw8IGJpdHMpIC0gMSk7CisKKwl0b3RsZW4gPSAobnVtICogYml0cykgPj4gMzsKKwlmcm9tID0gKChsb2ZmX3QpcGFnZSkgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKworCXdoaWxlICh0b3RsZW4pIHsKKwkJbGVuID0gbWluICh0b3RsZW4sIChzaXplX3QpICgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCkpOworCQlyZXMgPSBtdGQtPnJlYWRfZWNjIChtdGQsIGZyb20sIGxlbiwgJnJldGxlbiwgYnVmLCBOVUxMLCB0aGlzLT5hdXRvb29iKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCWlmIChyZXRsZW4gIT0gbGVuKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gIm5hbmRfYmJ0OiBFcnJvciByZWFkaW5nIGJhZCBibG9jayB0YWJsZVxuIik7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJuYW5kX2JidDogRUNDIGVycm9yIHdoaWxlIHJlYWRpbmcgYmFkIGJsb2NrIHRhYmxlXG4iKTsKKwkJfQorCisJCS8qIEFuYWx5c2UgZGF0YSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXVpbnQ4X3QgZGF0ID0gYnVmW2ldOworCQkJZm9yIChqID0gMDsgaiA8IDg7IGogKz0gYml0cywgYWN0ICs9IDIpIHsKKwkJCQl1aW50OF90IHRtcCA9IChkYXQgPj4gaikgJiBtc2s7CisJCQkJaWYgKHRtcCA9PSBtc2spCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChyZXNlcnZlZF9ibG9ja19jb2RlICYmCisJCQkJICAgICh0bXAgPT0gcmVzZXJ2ZWRfYmxvY2tfY29kZSkpIHsKKwkJCQkJcHJpbnRrIChLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBSZXNlcnZlZCBibG9jayBhdCAweCUwOHhcbiIsCisJCQkJCQkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MiA8PCAoYWN0ICYgMHgwNik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBMZWF2ZSBpdCBmb3Igbm93LCBpZiBpdHMgbWF0dXJlZCB3ZSBjYW4gbW92ZSB0aGlzCisJCQkJICogbWVzc2FnZSB0byBNVERfREVCVUdfTEVWRUwwICovCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBCYWQgYmxvY2sgYXQgMHglMDh4XG4iLAorCQkJCQkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCS8qIEZhY3RvcnkgbWFya2VkIGJhZCBvciB3b3JuIG91dCA/ICovCisJCQkJaWYgKHRtcCA9PSAwKQorCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MyA8PCAoYWN0ICYgMHgwNik7CisJCQkJZWxzZQorCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MSA8PCAoYWN0ICYgMHgwNik7CisJCQl9CisJCX0KKwkJdG90bGVuIC09IGxlbjsKKwkJZnJvbSArPSBsZW47CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHJlYWRfYWJzX2JidCAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgYXQgYSBnaXZlbiBwYWdlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgorICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQGNoaXA6CXJlYWQgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmljIGNoaXAsIC0xIHJlYWQgYWxsIGNoaXBzLgorICoJCUFwcGxpZXMgb25seSBpZiBOQU5EX0JCVF9QRVJDSElQIG9wdGlvbiBpcyBzZXQKKyAqCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKKyAqIFdlIGFzc3VtZSB0aGF0IHRoZSBiYnQgYml0cyBhcmUgaW4gY29uc2VjdXRpdmUgb3JkZXIuCisqLworc3RhdGljIGludCByZWFkX2Fic19iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQsIGludCBjaGlwKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJaW50IHJlcyA9IDAsIGk7CisJaW50IGJpdHM7CisKKwliaXRzID0gdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OUkJJVFNfTVNLOworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1BFUkNISVApIHsKKwkJaW50IG9mZnMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy0+bnVtY2hpcHM7IGkrKykgeworCQkJaWYgKGNoaXAgPT0gLTEgfHwgY2hpcCA9PSBpKQorCQkJCXJlcyA9IHJlYWRfYmJ0IChtdGQsIGJ1ZiwgdGQtPnBhZ2VzW2ldLCB0aGlzLT5jaGlwc2l6ZSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQsIGJpdHMsIG9mZnMsIHRkLT5yZXNlcnZlZF9ibG9ja19jb2RlKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJCW9mZnMgKz0gdGhpcy0+Y2hpcHNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCArIDIpOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gcmVhZF9iYnQgKG10ZCwgYnVmLCB0ZC0+cGFnZXNbMF0sIG10ZC0+c2l6ZSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQsIGJpdHMsIDAsIHRkLT5yZXNlcnZlZF9ibG9ja19jb2RlKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHJlYWRfYWJzX2JidHMgLSBbR0VORVJJQ10gUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpIGZvciBhbGwgY2hpcHMgc3RhcnRpbmcgYXQgYSBnaXZlbiBwYWdlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgorICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQG1kOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKKyAqCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUocykgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKKyAqIFdlIGFzc3VtZSB0aGF0IHRoZSBiYnQgYml0cyBhcmUgaW4gY29uc2VjdXRpdmUgb3JkZXIuCisgKgorKi8KK3N0YXRpYyBpbnQgcmVhZF9hYnNfYmJ0cyAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1Ziwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwkvKiBSZWFkIHRoZSBwcmltYXJ5IHZlcnNpb24sIGlmIGF2YWlsYWJsZSAqLworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pIHsKKwkJbmFuZF9yZWFkX3JhdyAobXRkLCBidWYsIHRkLT5wYWdlc1swXSA8PCB0aGlzLT5wYWdlX3NoaWZ0LCBtdGQtPm9vYmJsb2NrLCBtdGQtPm9vYnNpemUpOworCQl0ZC0+dmVyc2lvblswXSA9IGJ1ZlttdGQtPm9vYmJsb2NrICsgdGQtPnZlcm9mZnNdOworCQlwcmludGsgKEtFUk5fREVCVUcgIkJhZCBibG9jayB0YWJsZSBhdCBwYWdlICVkLCB2ZXJzaW9uIDB4JTAyWFxuIiwgdGQtPnBhZ2VzWzBdLCB0ZC0+dmVyc2lvblswXSk7CisJfQorCisJLyogUmVhZCB0aGUgbWlycm9yIHZlcnNpb24sIGlmIGF2YWlsYWJsZSAqLworCWlmIChtZCAmJiAobWQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKSkgeworCQluYW5kX3JlYWRfcmF3IChtdGQsIGJ1ZiwgbWQtPnBhZ2VzWzBdIDw8IHRoaXMtPnBhZ2Vfc2hpZnQsIG10ZC0+b29iYmxvY2ssIG10ZC0+b29ic2l6ZSk7CisJCW1kLT52ZXJzaW9uWzBdID0gYnVmW210ZC0+b29iYmxvY2sgKyBtZC0+dmVyb2Zmc107CisJCXByaW50ayAoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLCBtZC0+cGFnZXNbMF0sIG1kLT52ZXJzaW9uWzBdKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBjcmVhdGVfYmJ0IC0gW0dFTkVSSUNdIENyZWF0ZSBhIGJhZCBibG9jayB0YWJsZSBieSBzY2FubmluZyB0aGUgZGV2aWNlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgorICogQGJkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCisgKiBAY2hpcDoJY3JlYXRlIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSByZWFkIGFsbCBjaGlwcy4KKyAqCQlBcHBsaWVzIG9ubHkgaWYgTkFORF9CQlRfUEVSQ0hJUCBvcHRpb24gaXMgc2V0CisgKgorICogQ3JlYXRlIGEgYmFkIGJsb2NrIHRhYmxlIGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UKKyAqIGZvciB0aGUgZ2l2ZW4gZ29vZC9iYWQgYmxvY2sgaWRlbnRpZnkgcGF0dGVybgorICovCitzdGF0aWMgdm9pZCBjcmVhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLCBpbnQgY2hpcCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCBpLCBqLCBudW1ibG9ja3MsIGxlbiwgc2NhbmxlbjsKKwlpbnQgc3RhcnRibG9jazsKKwlsb2ZmX3QgZnJvbTsKKwlzaXplX3QgcmVhZGxlbiwgb29ibGVuOworCisJaWYgKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkFMTFBBR0VTKQorCQlsZW4gPSAxIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KTsKKwllbHNlIHsKKwkJaWYgKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTjJORFBBR0UpCisJCQlsZW4gPSAyOworCQllbHNlCisJCQlsZW4gPSAxOworCX0KKwlzY2FubGVuCT0gbXRkLT5vb2JibG9jayArIG10ZC0+b29ic2l6ZTsKKwlyZWFkbGVuID0gbGVuICogbXRkLT5vb2JibG9jazsKKwlvb2JsZW4gPSBsZW4gKiBtdGQtPm9vYnNpemU7CisKKwlpZiAoY2hpcCA9PSAtMSkgeworCQkvKiBOb3RlIHRoYXQgbnVtYmxvY2tzIGlzIDIgKiAocmVhbCBudW1ibG9ja3MpIGhlcmUsIHNlZSBpKz0yIGJlbG93IGFzIGl0CisJCSAqIG1ha2VzIHNoaWZ0aW5nIGFuZCBtYXNraW5nIGxlc3MgcGFpbmZ1bCAqLworCQludW1ibG9ja3MgPSBtdGQtPnNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpOworCQlzdGFydGJsb2NrID0gMDsKKwkJZnJvbSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAgPj0gdGhpcy0+bnVtY2hpcHMpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJjcmVhdGVfYmJ0KCk6IGNoaXBuciAoJWQpID4gYXZhaWxhYmxlIGNoaXBzICglZClcbiIsCisJCQkJY2hpcCArIDEsIHRoaXMtPm51bWNoaXBzKTsKKwkJCXJldHVybjsKKwkJfQorCQludW1ibG9ja3MgPSB0aGlzLT5jaGlwc2l6ZSA+PiAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gMSk7CisJCXN0YXJ0YmxvY2sgPSBjaGlwICogbnVtYmxvY2tzOworCQludW1ibG9ja3MgKz0gc3RhcnRibG9jazsKKwkJZnJvbSA9IHN0YXJ0YmxvY2sgPDwgKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpOworCX0KKworCWZvciAoaSA9IHN0YXJ0YmxvY2s7IGkgPCBudW1ibG9ja3M7KSB7CisJCW5hbmRfcmVhZF9yYXcgKG10ZCwgYnVmLCBmcm9tLCByZWFkbGVuLCBvb2JsZW4pOworCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKwkJCWlmIChjaGVja19wYXR0ZXJuICgmYnVmW2ogKiBzY2FubGVuXSwgc2NhbmxlbiwgbXRkLT5vb2JibG9jaywgYmQpKSB7CisJCQkJdGhpcy0+YmJ0W2kgPj4gM10gfD0gMHgwMyA8PCAoaSAmIDB4Nik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaSArPSAyOworCQlmcm9tICs9ICgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CisJfQorfQorCisvKioKKyAqIHNlYXJjaF9iYnQgLSBbR0VORVJJQ10gc2NhbiB0aGUgZGV2aWNlIGZvciBhIHNwZWNpZmljIGJhZCBibG9jayB0YWJsZQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgYnkgc2VhcmNoaW5nIGZvciBhIGdpdmVuIGlkZW50IHBhdHRlcm4uCisgKiBTZWFyY2ggaXMgcHJlZm9ybWVkIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcgdXAgb3IgZnJvbSB0aGUgZW5kIG9mCisgKiB0aGUgZGV2aWNlIGRvd253YXJkcy4gVGhlIHNlYXJjaCBzdGFydHMgYWx3YXlzIGF0IHRoZSBzdGFydCBvZiBhCisgKiBibG9jay4KKyAqIElmIHRoZSBvcHRpb24gTkFORF9CQlRfUEVSQ0hJUCBpcyBnaXZlbiwgZWFjaCBjaGlwIGlzIHNlYXJjaGVkCisgKiBmb3IgYSBiYnQsIHdoaWNoIGNvbnRhaW5zIHRoZSBiYWQgYmxvY2sgaW5mb3JtYXRpb24gb2YgdGhpcyBjaGlwLgorICogVGhpcyBpcyBuZWNjZWNhcnkgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBjZXJ0YWluIERPQyBkZXZpY2VzLgorICoKKyAqIFRoZSBiYnQgaWRlbnQgcGF0dGVybiByZXNpZGVzIGluIHRoZSBvb2IgYXJlYSBvZiB0aGUgZmlyc3QgcGFnZQorICogaW4gYSBibG9jay4KKyAqLworc3RhdGljIGludCBzZWFyY2hfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJaW50IGksIGNoaXBzOworCWludCBiaXRzLCBzdGFydGJsb2NrLCBibG9jaywgZGlyOworCWludCBzY2FubGVuID0gbXRkLT5vb2JibG9jayArIG10ZC0+b29ic2l6ZTsKKwlpbnQgYmJ0YmxvY2tzOworCisJLyogU2VhcmNoIGRpcmVjdGlvbiB0b3AgLT4gZG93biA/ICovCisJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfTEFTVEJMT0NLKSB7CisJCXN0YXJ0YmxvY2sgPSAobXRkLT5zaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCkgLTE7CisJCWRpciA9IC0xOworCX0gZWxzZSB7CisJCXN0YXJ0YmxvY2sgPSAwOworCQlkaXIgPSAxOworCX0KKworCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXAgPyAqLworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1BFUkNISVApIHsKKwkJY2hpcHMgPSB0aGlzLT5udW1jaGlwczsKKwkJYmJ0YmxvY2tzID0gdGhpcy0+Y2hpcHNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OworCQlzdGFydGJsb2NrICY9IGJidGJsb2NrcyAtIDE7CisJfSBlbHNlIHsKKwkJY2hpcHMgPSAxOworCQliYnRibG9ja3MgPSBtdGQtPnNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OworCX0KKworCS8qIE51bWJlciBvZiBiaXRzIGZvciBlYWNoIGVyYXNlIGJsb2NrIGluIHRoZSBiYnQgKi8KKwliaXRzID0gdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OUkJJVFNfTVNLOworCisJZm9yIChpID0gMDsgaSA8IGNoaXBzOyBpKyspIHsKKwkJLyogUmVzZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworCQl0ZC0+dmVyc2lvbltpXSA9IDA7CisJCXRkLT5wYWdlc1tpXSA9IC0xOworCQkvKiBTY2FuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgKi8KKwkJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgdGQtPm1heGJsb2NrczsgYmxvY2srKykgeworCQkJaW50IGFjdGJsb2NrID0gc3RhcnRibG9jayArIGRpciAqIGJsb2NrOworCQkJLyogUmVhZCBmaXJzdCBwYWdlICovCisJCQluYW5kX3JlYWRfcmF3IChtdGQsIGJ1ZiwgYWN0YmxvY2sgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0LCBtdGQtPm9vYmJsb2NrLCBtdGQtPm9vYnNpemUpOworCQkJaWYgKCFjaGVja19wYXR0ZXJuKGJ1Ziwgc2NhbmxlbiwgbXRkLT5vb2JibG9jaywgdGQpKSB7CisJCQkJdGQtPnBhZ2VzW2ldID0gYWN0YmxvY2sgPDwgKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIHRoaXMtPnBhZ2Vfc2hpZnQpOworCQkJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pIHsKKwkJCQkJdGQtPnZlcnNpb25baV0gPSBidWZbbXRkLT5vb2JibG9jayArIHRkLT52ZXJvZmZzXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3RhcnRibG9jayArPSB0aGlzLT5jaGlwc2l6ZSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CisJfQorCS8qIENoZWNrLCBpZiB3ZSBmb3VuZCBhIGJidCBmb3IgZWFjaCByZXF1ZXN0ZWQgY2hpcCAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwczsgaSsrKSB7CisJCWlmICh0ZC0+cGFnZXNbaV0gPT0gLTEpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiQmFkIGJsb2NrIHRhYmxlIG5vdCBmb3VuZCBmb3IgY2hpcCAlZFxuIiwgaSk7CisJCWVsc2UKKwkJCXByaW50ayAoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIGZvdW5kIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLCB0ZC0+cGFnZXNbaV0sIHRkLT52ZXJzaW9uW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2VhcmNoX3JlYWRfYmJ0cyAtIFtHRU5FUklDXSBzY2FuIHRoZSBkZXZpY2UgZm9yIGJhZCBibG9jayB0YWJsZShzKQorICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUgbWlycm9yCisgKgorICogU2VhcmNoIGFuZCByZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUocykKKyovCitzdGF0aWMgaW50IHNlYXJjaF9yZWFkX2JidHMgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsCisJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCkKK3sKKwkvKiBTZWFyY2ggdGhlIHByaW1hcnkgdGFibGUgKi8KKwlzZWFyY2hfYmJ0IChtdGQsIGJ1ZiwgdGQpOworCisJLyogU2VhcmNoIHRoZSBtaXJyb3IgdGFibGUgKi8KKwlpZiAobWQpCisJCXNlYXJjaF9iYnQgKG10ZCwgYnVmLCBtZCk7CisKKwkvKiBGb3JjZSByZXN1bHQgY2hlY2sgKi8KKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqIHdyaXRlX2JidCAtIFtHRU5FUklDXSAoUmUpd3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZQorICoKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCisgKiBAdGQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlCisgKiBAbWQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlIG1pcnJvcgorICogQGNoaXBzZWw6CXNlbGVjdG9yIGZvciBhIHNwZWNpZmljIGNoaXAsIC0xIGZvciBhbGwKKyAqCisgKiAoUmUpd3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZQorICoKKyovCitzdGF0aWMgaW50IHdyaXRlX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kLCBpbnQgY2hpcHNlbCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBuYW5kX29vYmluZm8gb29iaW5mbzsKKwlzdHJ1Y3QgZXJhc2VfaW5mbyBlaW5mbzsKKwlpbnQgaSwgaiwgcmVzLCBjaGlwID0gMDsKKwlpbnQgYml0cywgc3RhcnRibG9jaywgZGlyLCBwYWdlLCBvZmZzLCBudW1ibG9ja3MsIHNmdCwgc2Z0bXNrOworCWludCBucmNoaXBzLCBiYnRvZmZzLCBwYWdlb2ZmczsKKwl1aW50OF90IG1za1s0XTsKKwl1aW50OF90IHJjb2RlID0gdGQtPnJlc2VydmVkX2Jsb2NrX2NvZGU7CisJc2l6ZV90IHJldGxlbiwgbGVuID0gMDsKKwlsb2ZmX3QgdG87CisKKwlpZiAoIXJjb2RlKQorCQlyY29kZSA9IDB4ZmY7CisJLyogV3JpdGUgYmFkIGJsb2NrIHRhYmxlIHBlciBjaGlwIHJhdGhlciB0aGFuIHBlciBkZXZpY2UgPyAqLworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1BFUkNISVApIHsKKwkJbnVtYmxvY2tzID0gKGludCkgKHRoaXMtPmNoaXBzaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CisJCS8qIEZ1bGwgZGV2aWNlIHdyaXRlIG9yIHNwZWNpZmljIGNoaXAgPyAqLworCQlpZiAoY2hpcHNlbCA9PSAtMSkgeworCQkJbnJjaGlwcyA9IHRoaXMtPm51bWNoaXBzOworCQl9IGVsc2UgeworCQkJbnJjaGlwcyA9IGNoaXBzZWwgKyAxOworCQkJY2hpcCA9IGNoaXBzZWw7CisJCX0KKwl9IGVsc2UgeworCQludW1ibG9ja3MgPSAoaW50KSAobXRkLT5zaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CisJCW5yY2hpcHMgPSAxOworCX0KKworCS8qIExvb3AgdGhyb3VnaCB0aGUgY2hpcHMgKi8KKwlmb3IgKDsgY2hpcCA8IG5yY2hpcHM7IGNoaXArKykgeworCisJCS8qIFRoZXJlIHdhcyBhbHJlYWR5IGEgdmVyc2lvbiBvZiB0aGUgdGFibGUsIHJldXNlIHRoZSBwYWdlCisJCSAqIFRoaXMgYXBwbGllcyBmb3IgYWJzb2x1dGUgcGxhY2VtZW50IHRvbywgYXMgd2UgaGF2ZSB0aGUKKwkJICogcGFnZSBuci4gaW4gdGQtPnBhZ2VzLgorCQkgKi8KKwkJaWYgKHRkLT5wYWdlc1tjaGlwXSAhPSAtMSkgeworCQkJcGFnZSA9IHRkLT5wYWdlc1tjaGlwXTsKKwkJCWdvdG8gd3JpdGU7CisJCX0KKworCQkvKiBBdXRvbWF0aWMgcGxhY2VtZW50IG9mIHRoZSBiYWQgYmxvY2sgdGFibGUgKi8KKwkJLyogU2VhcmNoIGRpcmVjdGlvbiB0b3AgLT4gZG93biA/ICovCisJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0xBU1RCTE9DSykgeworCQkJc3RhcnRibG9jayA9IG51bWJsb2NrcyAqIChjaGlwICsgMSkgLSAxOworCQkJZGlyID0gLTE7CisJCX0gZWxzZSB7CisJCQlzdGFydGJsb2NrID0gY2hpcCAqIG51bWJsb2NrczsKKwkJCWRpciA9IDE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdGQtPm1heGJsb2NrczsgaSsrKSB7CisJCQlpbnQgYmxvY2sgPSBzdGFydGJsb2NrICsgZGlyICogaTsKKwkJCS8qIENoZWNrLCBpZiB0aGUgYmxvY2sgaXMgYmFkICovCisJCQlzd2l0Y2ggKCh0aGlzLT5iYnRbYmxvY2sgPj4gMl0gPj4gKDIgKiAoYmxvY2sgJiAweDAzKSkpICYgMHgwMykgeworCQkJY2FzZSAweDAxOgorCQkJY2FzZSAweDAzOgorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGFnZSA9IGJsb2NrIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KTsKKwkJCS8qIENoZWNrLCBpZiB0aGUgYmxvY2sgaXMgdXNlZCBieSB0aGUgbWlycm9yIHRhYmxlICovCisJCQlpZiAoIW1kIHx8IG1kLT5wYWdlc1tjaGlwXSAhPSBwYWdlKQorCQkJCWdvdG8gd3JpdGU7CisJCX0KKwkJcHJpbnRrIChLRVJOX0VSUiAiTm8gc3BhY2UgbGVmdCB0byB3cml0ZSBiYWQgYmxvY2sgdGFibGVcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsKK3dyaXRlOgorCisJCS8qIFNldCB1cCBzaGlmdCBjb3VudCBhbmQgbWFza3MgZm9yIHRoZSBmbGFzaCB0YWJsZSAqLworCQliaXRzID0gdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OUkJJVFNfTVNLOworCQlzd2l0Y2ggKGJpdHMpIHsKKwkJY2FzZSAxOiBzZnQgPSAzOyBzZnRtc2sgPSAweDA3OyBtc2tbMF0gPSAweDAwOyBtc2tbMV0gPSAweDAxOyBtc2tbMl0gPSB+cmNvZGU7IG1za1szXSA9IDB4MDE7IGJyZWFrOworCQljYXNlIDI6IHNmdCA9IDI7IHNmdG1zayA9IDB4MDY7IG1za1swXSA9IDB4MDA7IG1za1sxXSA9IDB4MDE7IG1za1syXSA9IH5yY29kZTsgbXNrWzNdID0gMHgwMzsgYnJlYWs7CisJCWNhc2UgNDogc2Z0ID0gMTsgc2Z0bXNrID0gMHgwNDsgbXNrWzBdID0gMHgwMDsgbXNrWzFdID0gMHgwQzsgbXNrWzJdID0gfnJjb2RlOyBtc2tbM10gPSAweDBmOyBicmVhazsKKwkJY2FzZSA4OiBzZnQgPSAwOyBzZnRtc2sgPSAweDAwOyBtc2tbMF0gPSAweDAwOyBtc2tbMV0gPSAweDBGOyBtc2tbMl0gPSB+cmNvZGU7IG1za1szXSA9IDB4ZmY7IGJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJidG9mZnMgPSBjaGlwICogKG51bWJsb2NrcyA+PiAyKTsKKworCQl0byA9ICgobG9mZl90KSBwYWdlKSA8PCB0aGlzLT5wYWdlX3NoaWZ0OworCisJCW1lbWNweSAoJm9vYmluZm8sIHRoaXMtPmF1dG9vb2IsIHNpemVvZihvb2JpbmZvKSk7CisJCW9vYmluZm8udXNlZWNjID0gTVREX05BTkRFQ0NfUExBQ0VPTkxZOworCisJCS8qIE11c3Qgd2Ugc2F2ZSB0aGUgYmxvY2sgY29udGVudHMgPyAqLworCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQVZFQ09OVEVOVCkgeworCQkJLyogTWFrZSBpdCBibG9jayBhbGlnbmVkICovCisJCQl0byAmPSB+KChsb2ZmX3QpICgoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpIC0gMSkpOworCQkJbGVuID0gMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CisJCQlyZXMgPSBtdGQtPnJlYWRfZWNjIChtdGQsIHRvLCBsZW4sICZyZXRsZW4sIGJ1ZiwgJmJ1ZltsZW5dLCAmb29iaW5mbyk7CisJCQlpZiAocmVzIDwgMCkgeworCQkJCWlmIChyZXRsZW4gIT0gbGVuKSB7CisJCQkJCXByaW50ayAoS0VSTl9JTkZPICJuYW5kX2JidDogRXJyb3IgcmVhZGluZyBibG9jayBmb3Igd3JpdGluZyB0aGUgYmFkIGJsb2NrIHRhYmxlXG4iKTsKKwkJCQkJcmV0dXJuIHJlczsKKwkJCQl9CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm5hbmRfYmJ0OiBFQ0MgZXJyb3Igd2hpbGUgcmVhZGluZyBibG9jayBmb3Igd3JpdGluZyBiYWQgYmxvY2sgdGFibGVcbiIpOworCQkJfQorCQkJLyogQ2FsYyB0aGUgYnl0ZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciAqLworCQkJcGFnZW9mZnMgPSBwYWdlIC0gKGludCkodG8gPj4gdGhpcy0+cGFnZV9zaGlmdCk7CisJCQlvZmZzID0gcGFnZW9mZnMgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwkJCS8qIFByZXNldCB0aGUgYmJ0IGFyZWEgd2l0aCAweGZmICovCisJCQltZW1zZXQgKCZidWZbb2Zmc10sIDB4ZmYsIChzaXplX3QpKG51bWJsb2NrcyA+PiBzZnQpKTsKKwkJCS8qIFByZXNldCB0aGUgYmJ0J3Mgb29iIGFyZWEgd2l0aCAweGZmICovCisJCQltZW1zZXQgKCZidWZbbGVuICsgcGFnZW9mZnMgKiBtdGQtPm9vYnNpemVdLCAweGZmLAorCQkJCSgobGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQpIC0gcGFnZW9mZnMpICogbXRkLT5vb2JzaXplKTsKKwkJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pIHsKKwkJCQlidWZbbGVuICsgKHBhZ2VvZmZzICogbXRkLT5vb2JzaXplKSArIHRkLT52ZXJvZmZzXSA9IHRkLT52ZXJzaW9uW2NoaXBdOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ2FsYyBsZW5ndGggKi8KKwkJCWxlbiA9IChzaXplX3QpIChudW1ibG9ja3MgPj4gc2Z0KTsKKwkJCS8qIE1ha2UgaXQgcGFnZSBhbGlnbmVkICEgKi8KKwkJCWxlbiA9IChsZW4gKyAobXRkLT5vb2JibG9jay0xKSkgJiB+KG10ZC0+b29iYmxvY2stMSk7CisJCQkvKiBQcmVzZXQgdGhlIGJ1ZmZlciB3aXRoIDB4ZmYgKi8KKwkJCW1lbXNldCAoYnVmLCAweGZmLCBsZW4gKyAobGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQpICogbXRkLT5vb2JzaXplKTsKKwkJCW9mZnMgPSAwOworCQkJLyogUGF0dGVybiBpcyBsb2NhdGVkIGluIG9vYiBhcmVhIG9mIGZpcnN0IHBhZ2UgKi8KKwkJCW1lbWNweSAoJmJ1ZltsZW4gKyB0ZC0+b2Zmc10sIHRkLT5wYXR0ZXJuLCB0ZC0+bGVuKTsKKwkJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pIHsKKwkJCQlidWZbbGVuICsgdGQtPnZlcm9mZnNdID0gdGQtPnZlcnNpb25bY2hpcF07CisJCQl9CisJCX0KKworCQkvKiB3YWxrIHRocm91Z2ggdGhlIG1lbW9yeSB0YWJsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmxvY2tzOyApIHsKKwkJCXVpbnQ4X3QgZGF0OworCQkJZGF0ID0gdGhpcy0+YmJ0W2JidG9mZnMgKyAoaSA+PiAyKV07CisJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrICwgaSsrKSB7CisJCQkJaW50IHNmdGNudCA9IChpIDw8ICgzIC0gc2Z0KSkgJiBzZnRtc2s7CisJCQkJLyogRG8gbm90IHN0b3JlIHRoZSByZXNlcnZlZCBiYnQgYmxvY2tzICEgKi8KKwkJCQlidWZbb2ZmcyArIChpID4+IHNmdCldICY9IH4obXNrW2RhdCAmIDB4MDNdIDw8IHNmdGNudCk7CisJCQkJZGF0ID4+PSAyOworCQkJfQorCQl9CisKKwkJbWVtc2V0ICgmZWluZm8sIDAsIHNpemVvZiAoZWluZm8pKTsKKwkJZWluZm8ubXRkID0gbXRkOworCQllaW5mby5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIHRvOworCQllaW5mby5sZW4gPSAxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKKwkJcmVzID0gbmFuZF9lcmFzZV9uYW5kIChtdGQsICZlaW5mbywgMSk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAibmFuZF9iYnQ6IEVycm9yIGR1cmluZyBibG9jayBlcmFzZTogJWRcbiIsIHJlcyk7CisJCQlyZXR1cm4gcmVzOworCQl9CisKKwkJcmVzID0gbXRkLT53cml0ZV9lY2MgKG10ZCwgdG8sIGxlbiwgJnJldGxlbiwgYnVmLCAmYnVmW2xlbl0sICZvb2JpbmZvKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJuYW5kX2JidDogRXJyb3Igd2hpbGUgd3JpdGluZyBiYWQgYmxvY2sgdGFibGUgJWRcbiIsIHJlcyk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCXByaW50ayAoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIHdyaXR0ZW4gdG8gMHglMDh4LCB2ZXJzaW9uIDB4JTAyWFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpIHRvLCB0ZC0+dmVyc2lvbltjaGlwXSk7CisKKwkJLyogTWFyayBpdCBhcyB1c2VkICovCisJCXRkLT5wYWdlc1tjaGlwXSA9IHBhZ2U7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG5hbmRfbWVtb3J5X2JidCAtIFtHRU5FUklDXSBjcmVhdGUgYSBtZW1vcnkgYmFzZWQgYmFkIGJsb2NrIHRhYmxlCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCisgKgorICogVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtZW1vcnkgYmFzZWQgYmJ0IGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UKKyAqIGZvciBtYW51ZmFjdHVyZXIgLyBzb2Z0d2FyZSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MKKyovCitzdGF0aWMgaW50IG5hbmRfbWVtb3J5X2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworCS8qIEVuc3VyZSB0aGF0IHdlIG9ubHkgc2NhbiBmb3IgdGhlIHBhdHRlcm4gYW5kIG5vdGhpbmcgZWxzZSAqLworCWJkLT5vcHRpb25zID0gMDsKKwljcmVhdGVfYmJ0IChtdGQsIHRoaXMtPmRhdGFfYnVmLCBiZCwgLTEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGNoZWNrX2NyZWF0ZSAtIFtHRU5FUklDXSBjcmVhdGUgYW5kIHdyaXRlIGJidChzKSBpZiBuZWNjZWNhcnkKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCisgKiBAYmQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvIHJlYWRfYmJ0CisgKiBhbmQgY3JlYXRlcyAvIHVwZGF0ZXMgdGhlIGJidChzKSBpZiBuZWNjZWNhcnkKKyAqIENyZWF0aW9uIGlzIG5lY2NlY2FyeSBpZiBubyBiYnQgd2FzIGZvdW5kIGZvciB0aGUgY2hpcC9kZXZpY2UKKyAqIFVwZGF0ZSBpcyBuZWNjZWNhcnkgaWYgb25lIG9mIHRoZSB0YWJsZXMgaXMgbWlzc2luZyBvciB0aGUKKyAqIHZlcnNpb24gbnIuIG9mIG9uZSB0YWJsZSBpcyBsZXNzIHRoYW4gdGhlIG90aGVyCisqLworc3RhdGljIGludCBjaGVja19jcmVhdGUgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQpCit7CisJaW50IGksIGNoaXBzLCB3cml0ZW9wcywgY2hpcHNlbCwgcmVzOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCA9IHRoaXMtPmJidF90ZDsKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kID0gdGhpcy0+YmJ0X21kOworCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqcmQsICpyZDI7CisKKwkvKiBEbyB3ZSBoYXZlIGEgYmJ0IHBlciBjaGlwID8gKi8KKwlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKQorCQljaGlwcyA9IHRoaXMtPm51bWNoaXBzOworCWVsc2UKKwkJY2hpcHMgPSAxOworCisJZm9yIChpID0gMDsgaSA8IGNoaXBzOyBpKyspIHsKKwkJd3JpdGVvcHMgPSAwOworCQlyZCA9IE5VTEw7CisJCXJkMiA9IE5VTEw7CisJCS8qIFBlciBjaGlwIG9yIHBlciBkZXZpY2UgPyAqLworCQljaGlwc2VsID0gKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgPyBpIDogLTE7CisJCS8qIE1pcnJvcmVkIHRhYmxlIGF2aWxhYmxlID8gKi8KKwkJaWYgKG1kKSB7CisJCQlpZiAodGQtPnBhZ2VzW2ldID09IC0xICYmIG1kLT5wYWdlc1tpXSA9PSAtMSkgeworCQkJCXdyaXRlb3BzID0gMHgwMzsKKwkJCQlnb3RvIGNyZWF0ZTsKKwkJCX0KKworCQkJaWYgKHRkLT5wYWdlc1tpXSA9PSAtMSkgeworCQkJCXJkID0gbWQ7CisJCQkJdGQtPnZlcnNpb25baV0gPSBtZC0+dmVyc2lvbltpXTsKKwkJCQl3cml0ZW9wcyA9IDE7CisJCQkJZ290byB3cml0ZWNoZWNrOworCQkJfQorCisJCQlpZiAobWQtPnBhZ2VzW2ldID09IC0xKSB7CisJCQkJcmQgPSB0ZDsKKwkJCQltZC0+dmVyc2lvbltpXSA9IHRkLT52ZXJzaW9uW2ldOworCQkJCXdyaXRlb3BzID0gMjsKKwkJCQlnb3RvIHdyaXRlY2hlY2s7CisJCQl9CisKKwkJCWlmICh0ZC0+dmVyc2lvbltpXSA9PSBtZC0+dmVyc2lvbltpXSkgeworCQkJCXJkID0gdGQ7CisJCQkJaWYgKCEodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKSkKKwkJCQkJcmQyID0gbWQ7CisJCQkJZ290byB3cml0ZWNoZWNrOworCQkJfQorCisJCQlpZiAoKChpbnQ4X3QpICh0ZC0+dmVyc2lvbltpXSAtIG1kLT52ZXJzaW9uW2ldKSkgPiAwKSB7CisJCQkJcmQgPSB0ZDsKKwkJCQltZC0+dmVyc2lvbltpXSA9IHRkLT52ZXJzaW9uW2ldOworCQkJCXdyaXRlb3BzID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJcmQgPSBtZDsKKwkJCQl0ZC0+dmVyc2lvbltpXSA9IG1kLT52ZXJzaW9uW2ldOworCQkJCXdyaXRlb3BzID0gMTsKKwkJCX0KKworCQkJZ290byB3cml0ZWNoZWNrOworCisJCX0gZWxzZSB7CisJCQlpZiAodGQtPnBhZ2VzW2ldID09IC0xKSB7CisJCQkJd3JpdGVvcHMgPSAweDAxOworCQkJCWdvdG8gY3JlYXRlOworCQkJfQorCQkJcmQgPSB0ZDsKKwkJCWdvdG8gd3JpdGVjaGVjazsKKwkJfQorY3JlYXRlOgorCQkvKiBDcmVhdGUgdGhlIGJhZCBibG9jayB0YWJsZSBieSBzY2FubmluZyB0aGUgZGV2aWNlID8gKi8KKwkJaWYgKCEodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9DUkVBVEUpKQorCQkJY29udGludWU7CisKKwkJLyogQ3JlYXRlIHRoZSB0YWJsZSBpbiBtZW1vcnkgYnkgc2Nhbm5pbmcgdGhlIGNoaXAocykgKi8KKwkJY3JlYXRlX2JidCAobXRkLCBidWYsIGJkLCBjaGlwc2VsKTsKKworCQl0ZC0+dmVyc2lvbltpXSA9IDE7CisJCWlmIChtZCkKKwkJCW1kLT52ZXJzaW9uW2ldID0gMTsKK3dyaXRlY2hlY2s6CisJCS8qIHJlYWQgYmFjayBmaXJzdCA/ICovCisJCWlmIChyZCkKKwkJCXJlYWRfYWJzX2JidCAobXRkLCBidWYsIHJkLCBjaGlwc2VsKTsKKwkJLyogSWYgdGhleSB3ZXJlbid0IHZlcnNpb25lZCwgcmVhZCBib3RoLiAqLworCQlpZiAocmQyKQorCQkJcmVhZF9hYnNfYmJ0IChtdGQsIGJ1ZiwgcmQyLCBjaGlwc2VsKTsKKworCQkvKiBXcml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2UgPyAqLworCQlpZiAoKHdyaXRlb3BzICYgMHgwMSkgJiYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CisJCQlyZXMgPSB3cml0ZV9iYnQgKG10ZCwgYnVmLCB0ZCwgbWQsIGNoaXBzZWwpOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSBtaXJyb3IgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2UgPyAqLworCQlpZiAoKHdyaXRlb3BzICYgMHgwMikgJiYgbWQgJiYgKG1kLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CisJCQlyZXMgPSB3cml0ZV9iYnQgKG10ZCwgYnVmLCBtZCwgdGQsIGNoaXBzZWwpOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtYXJrX2JidF9yZWdpb25zIC0gW0dFTkVSSUNdIG1hcmsgdGhlIGJhZCBibG9jayB0YWJsZSByZWdpb25zCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRkOgkJYmFkIGJsb2NrIHRhYmxlIGRlc2NyaXB0b3IKKyAqCisgKiBUaGUgYmFkIGJsb2NrIHRhYmxlIHJlZ2lvbnMgYXJlIG1hcmtlZCBhcyAiYmFkIiB0byBwcmV2ZW50CisgKiBhY2NpZGVudGFsIGVyYXN1cmVzIC8gd3JpdGVzLiBUaGUgcmVnaW9ucyBhcmUgaWRlbnRpZmllZCBieQorICogdGhlIG1hcmsgMHgwMi4KKyovCitzdGF0aWMgdm9pZCBtYXJrX2JidF9yZWdpb24gKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJaW50IGksIGosIGNoaXBzLCBibG9jaywgbnJibG9ja3MsIHVwZGF0ZTsKKwl1aW50OF90IG9sZHZhbCwgbmV3dmFsOworCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgeworCQljaGlwcyA9IHRoaXMtPm51bWNoaXBzOworCQlucmJsb2NrcyA9IChpbnQpKHRoaXMtPmNoaXBzaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CisJfSBlbHNlIHsKKwkJY2hpcHMgPSAxOworCQlucmJsb2NrcyA9IChpbnQpKG10ZC0+c2l6ZSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjaGlwczsgaSsrKSB7CisJCWlmICgodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9BQlNQQUdFKSB8fAorCQkgICAgISh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSkgeworCQkgICAgCWlmICh0ZC0+cGFnZXNbaV0gPT0gLTEpIGNvbnRpbnVlOworCQkJYmxvY2sgPSB0ZC0+cGFnZXNbaV0gPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIHRoaXMtPnBhZ2Vfc2hpZnQpOworCQkJYmxvY2sgPDw9IDE7CisJCQlvbGR2YWwgPSB0aGlzLT5iYnRbKGJsb2NrID4+IDMpXTsKKwkJCW5ld3ZhbCA9IG9sZHZhbCB8ICgweDIgPDwgKGJsb2NrICYgMHgwNikpOworCQkJdGhpcy0+YmJ0WyhibG9jayA+PiAzKV0gPSBuZXd2YWw7CisJCQlpZiAoKG9sZHZhbCAhPSBuZXd2YWwpICYmIHRkLT5yZXNlcnZlZF9ibG9ja19jb2RlKQorCQkJCW5hbmRfdXBkYXRlX2JidChtdGQsIGJsb2NrIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CisJCQljb250aW51ZTsKKwkJfQorCQl1cGRhdGUgPSAwOworCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9MQVNUQkxPQ0spCisJCQlibG9jayA9ICgoaSArIDEpICogbnJibG9ja3MpIC0gdGQtPm1heGJsb2NrczsKKwkJZWxzZQorCQkJYmxvY2sgPSBpICogbnJibG9ja3M7CisJCWJsb2NrIDw8PSAxOworCQlmb3IgKGogPSAwOyBqIDwgdGQtPm1heGJsb2NrczsgaisrKSB7CisJCQlvbGR2YWwgPSB0aGlzLT5iYnRbKGJsb2NrID4+IDMpXTsKKwkJCW5ld3ZhbCA9IG9sZHZhbCB8ICgweDIgPDwgKGJsb2NrICYgMHgwNikpOworCQkJdGhpcy0+YmJ0WyhibG9jayA+PiAzKV0gPSBuZXd2YWw7CisJCQlpZiAob2xkdmFsICE9IG5ld3ZhbCkgdXBkYXRlID0gMTsKKwkJCWJsb2NrICs9IDI7CisJCX0KKwkJLyogSWYgd2Ugd2FudCByZXNlcnZlZCBibG9ja3MgdG8gYmUgcmVjb3JkZWQgdG8gZmxhc2gsIGFuZCBzb21lCisJCSAgIG5ldyBvbmVzIGhhdmUgYmVlbiBtYXJrZWQsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0b3JlZAorCQkgICBiYnRzLiAgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb25jZS4gKi8KKwkJaWYgKHVwZGF0ZSAmJiB0ZC0+cmVzZXJ2ZWRfYmxvY2tfY29kZSkKKwkJCW5hbmRfdXBkYXRlX2JidChtdGQsIChibG9jayAtIDIpIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CisJfQorfQorCisvKioKKyAqIG5hbmRfc2Nhbl9iYnQgLSBbTkFORCBJbnRlcmZhY2VdIHNjYW4sIGZpbmQsIHJlYWQgYW5kIG1heWJlIGNyZWF0ZSBiYWQgYmxvY2sgdGFibGUocykKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYmQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzLCBpZiBhIGJhZCBibG9jayB0YWJsZShzKSBpcy9hcmUgYWxyZWFkeQorICogYXZhaWxhYmxlLiBJZiBub3QgaXQgc2NhbnMgdGhlIGRldmljZSBmb3IgbWFudWZhY3R1cmVyCisgKiBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MgYW5kIHdyaXRlcyB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpIHRvCisgKiB0aGUgc2VsZWN0ZWQgcGxhY2UuCisgKgorICogVGhlIGJhZCBibG9jayB0YWJsZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGhlcmUuIEl0IG11c3QgYmUgZnJlZWQKKyAqIGJ5IGNhbGxpbmcgdGhlIG5hbmRfZnJlZV9iYnQgZnVuY3Rpb24uCisgKgorKi8KK2ludCBuYW5kX3NjYW5fYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCBsZW4sIHJlcyA9IDA7CisJdWludDhfdCAqYnVmOworCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQgPSB0aGlzLT5iYnRfdGQ7CisJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCA9IHRoaXMtPmJidF9tZDsKKworCWxlbiA9IG10ZC0+c2l6ZSA+PiAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0ICsgMik7CisJLyogQWxsb2NhdGUgbWVtb3J5ICgyYml0IHBlciBibG9jaykgKi8KKwl0aGlzLT5iYnQgPSBrbWFsbG9jIChsZW4sIEdGUF9LRVJORUwpOworCWlmICghdGhpcy0+YmJ0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgIm5hbmRfc2Nhbl9iYnQ6IE91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogQ2xlYXIgdGhlIG1lbW9yeSBiYWQgYmxvY2sgdGFibGUgKi8KKwltZW1zZXQgKHRoaXMtPmJidCwgMHgwMCwgbGVuKTsKKworCS8qIElmIG5vIHByaW1hcnkgdGFibGUgZGVjcmlwdG9yIGlzIGdpdmVuLCBzY2FuIHRoZSBkZXZpY2UKKwkgKiB0byBidWlsZCBhIG1lbW9yeSBiYXNlZCBiYWQgYmxvY2sgdGFibGUKKwkgKi8KKwlpZiAoIXRkKQorCQlyZXR1cm4gbmFuZF9tZW1vcnlfYmJ0KG10ZCwgYmQpOworCisJLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBvbmUgZXJhc2VibG9jayBpbmNsLiBvb2IgKi8KKwlsZW4gPSAoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCWxlbiArPSAobGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQpICogbXRkLT5vb2JzaXplOworCWJ1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAibmFuZF9iYnQ6IE91dCBvZiBtZW1vcnlcbiIpOworCQlrZnJlZSAodGhpcy0+YmJ0KTsKKwkJdGhpcy0+YmJ0ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSXMgdGhlIGJidCBhdCBhIGdpdmVuIHBhZ2UgPyAqLworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0FCU1BBR0UpIHsKKwkJcmVzID0gcmVhZF9hYnNfYmJ0cyAobXRkLCBidWYsIHRkLCBtZCk7CisJfSBlbHNlIHsKKwkJLyogU2VhcmNoIHRoZSBiYWQgYmxvY2sgdGFibGUgdXNpbmcgYSBwYXR0ZXJuIGluIG9vYiAqLworCQlyZXMgPSBzZWFyY2hfcmVhZF9iYnRzIChtdGQsIGJ1ZiwgdGQsIG1kKTsKKwl9CisKKwlpZiAocmVzKQorCQlyZXMgPSBjaGVja19jcmVhdGUgKG10ZCwgYnVmLCBiZCk7CisKKwkvKiBQcmV2ZW50IHRoZSBiYnQgcmVnaW9ucyBmcm9tIGVyYXNpbmcgLyB3cml0aW5nICovCisJbWFya19iYnRfcmVnaW9uIChtdGQsIHRkKTsKKwlpZiAobWQpCisJCW1hcmtfYmJ0X3JlZ2lvbiAobXRkLCBtZCk7CisKKwlrZnJlZSAoYnVmKTsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qKgorICogbmFuZF91cGRhdGVfYmJ0IC0gW05BTkQgSW50ZXJmYWNlXSB1cGRhdGUgYmFkIGJsb2NrIHRhYmxlKHMpCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnM6CXRoZSBvZmZzZXQgb2YgdGhlIG5ld2x5IG1hcmtlZCBibG9jaworICoKKyAqIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHRoZSBiYWQgYmxvY2sgdGFibGUocykKKyovCitpbnQgbmFuZF91cGRhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlpbnQgbGVuLCByZXMgPSAwLCB3cml0ZW9wcyA9IDA7CisJaW50IGNoaXAsIGNoaXBzZWw7CisJdWludDhfdCAqYnVmOworCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQgPSB0aGlzLT5iYnRfdGQ7CisJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCA9IHRoaXMtPmJidF9tZDsKKworCWlmICghdGhpcy0+YmJ0IHx8ICF0ZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSBtdGQtPnNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCArIDIpOworCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igb25lIGVyYXNlYmxvY2sgaW5jbC4gb29iICovCisJbGVuID0gKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKKwlsZW4gKz0gKGxlbiA+PiB0aGlzLT5wYWdlX3NoaWZ0KSAqIG10ZC0+b29ic2l6ZTsKKwlidWYgPSBrbWFsbG9jIChsZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIm5hbmRfdXBkYXRlX2JidDogT3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdyaXRlb3BzID0gbWQgIT0gTlVMTCA/IDB4MDMgOiAweDAxOworCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgeworCQljaGlwID0gKGludCkgKG9mZnMgPj4gdGhpcy0+Y2hpcF9zaGlmdCk7CisJCWNoaXBzZWwgPSBjaGlwOworCX0gZWxzZSB7CisJCWNoaXAgPSAwOworCQljaGlwc2VsID0gLTE7CisJfQorCisJdGQtPnZlcnNpb25bY2hpcF0rKzsKKwlpZiAobWQpCisJCW1kLT52ZXJzaW9uW2NoaXBdKys7CisKKwkvKiBXcml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2UgPyAqLworCWlmICgod3JpdGVvcHMgJiAweDAxKSAmJiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9XUklURSkpIHsKKwkJcmVzID0gd3JpdGVfYmJ0IChtdGQsIGJ1ZiwgdGQsIG1kLCBjaGlwc2VsKTsKKwkJaWYgKHJlcyA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJLyogV3JpdGUgdGhlIG1pcnJvciBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZSA/ICovCisJaWYgKCh3cml0ZW9wcyAmIDB4MDIpICYmIG1kICYmIChtZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSkgeworCQlyZXMgPSB3cml0ZV9iYnQgKG10ZCwgYnVmLCBtZCwgdGQsIGNoaXBzZWwpOworCX0KKworb3V0OgorCWtmcmVlIChidWYpOworCXJldHVybiByZXM7Cit9CisKKy8qIERlZmluZSBzb21lIGdlbmVyaWMgYmFkIC8gZ29vZCBibG9jayBzY2FuIHBhdHRlcm4gd2hpY2ggYXJlIHVzZWQKKyAqIHdoaWxlIHNjYW5uaW5nIGEgZGV2aWNlIGZvciBmYWN0b3J5IG1hcmtlZCBnb29kIC8gYmFkIGJsb2NrcworICoKKyAqIFRoZSBtZW1vcnkgYmFzZWQgcGF0dGVybnMganVzdAorICovCitzdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5bXSA9IHsgMHhmZiwgMHhmZiB9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIHNtYWxscGFnZV9tZW1vcnliYXNlZCA9IHsKKwkub3B0aW9ucyA9IDAsCisJLm9mZnMgPSA1LAorCS5sZW4gPSAxLAorCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGxhcmdlcGFnZV9tZW1vcnliYXNlZCA9IHsKKwkub3B0aW9ucyA9IDAsCisJLm9mZnMgPSAwLAorCS5sZW4gPSAyLAorCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIHNtYWxscGFnZV9mbGFzaGJhc2VkID0geworCS5vcHRpb25zID0gTkFORF9CQlRfU0NBTkVNUFRZIHwgTkFORF9CQlRfU0NBTkFMTFBBR0VTLAorCS5vZmZzID0gNSwKKwkubGVuID0gMSwKKwkucGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybgorfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBsYXJnZXBhZ2VfZmxhc2hiYXNlZCA9IHsKKwkub3B0aW9ucyA9IE5BTkRfQkJUX1NDQU5FTVBUWSB8IE5BTkRfQkJUX1NDQU5BTExQQUdFUywKKwkub2ZmcyA9IDAsCisJLmxlbiA9IDIsCisJLnBhdHRlcm4gPSBzY2FuX2ZmX3BhdHRlcm4KK307CisKK3N0YXRpYyB1aW50OF90IHNjYW5fYWdhbmRfcGF0dGVybltdID0geyAweDFDLCAweDcxLCAweEM3LCAweDFDLCAweDcxLCAweEM3IH07CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgYWdhbmRfZmxhc2hiYXNlZCA9IHsKKwkub3B0aW9ucyA9IE5BTkRfQkJUX1NDQU5FTVBUWSB8IE5BTkRfQkJUX1NDQU5BTExQQUdFUywKKwkub2ZmcyA9IDB4MjAsCisJLmxlbiA9IDYsCisJLnBhdHRlcm4gPSBzY2FuX2FnYW5kX3BhdHRlcm4KK307CisKKy8qIEdlbmVyaWMgZmxhc2ggYmJ0IGRlY3JpcHRvcnMKKyovCitzdGF0aWMgdWludDhfdCBiYnRfcGF0dGVybltdID0geydCJywgJ2InLCAndCcsICcwJyB9Oworc3RhdGljIHVpbnQ4X3QgbWlycm9yX3BhdHRlcm5bXSA9IHsnMScsICd0JywgJ2InLCAnQicgfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBiYnRfbWFpbl9kZXNjciA9IHsKKwkub3B0aW9ucyA9IE5BTkRfQkJUX0xBU1RCTE9DSyB8IE5BTkRfQkJUX0NSRUFURSB8IE5BTkRfQkJUX1dSSVRFCisJCXwgTkFORF9CQlRfMkJJVCB8IE5BTkRfQkJUX1ZFUlNJT04gfCBOQU5EX0JCVF9QRVJDSElQLAorCS5vZmZzID0JOCwKKwkubGVuID0gNCwKKwkudmVyb2ZmcyA9IDEyLAorCS5tYXhibG9ja3MgPSA0LAorCS5wYXR0ZXJuID0gYmJ0X3BhdHRlcm4KK307CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgYmJ0X21pcnJvcl9kZXNjciA9IHsKKwkub3B0aW9ucyA9IE5BTkRfQkJUX0xBU1RCTE9DSyB8IE5BTkRfQkJUX0NSRUFURSB8IE5BTkRfQkJUX1dSSVRFCisJCXwgTkFORF9CQlRfMkJJVCB8IE5BTkRfQkJUX1ZFUlNJT04gfCBOQU5EX0JCVF9QRVJDSElQLAorCS5vZmZzID0JOCwKKwkubGVuID0gNCwKKwkudmVyb2ZmcyA9IDEyLAorCS5tYXhibG9ja3MgPSA0LAorCS5wYXR0ZXJuID0gbWlycm9yX3BhdHRlcm4KK307CisKKy8qKgorICogbmFuZF9kZWZhdWx0X2JidCAtIFtOQU5EIEludGVyZmFjZV0gU2VsZWN0IGEgZGVmYXVsdCBiYWQgYmxvY2sgdGFibGUgZm9yIHRoZSBkZXZpY2UKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZQorICogc3VwcG9ydCBmb3IgdGhlIGRldmljZSBhbmQgY2FsbHMgdGhlIG5hbmRfc2Nhbl9iYnQgZnVuY3Rpb24KKyAqCisqLworaW50IG5hbmRfZGVmYXVsdF9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwkvKiBEZWZhdWx0IGZvciBBRy1BTkQuIFdlIG11c3QgdXNlIGEgZmxhc2ggYmFzZWQKKwkgKiBiYWQgYmxvY2sgdGFibGUgYXMgdGhlIGRldmljZXMgaGF2ZSBmYWN0b3J5IG1hcmtlZAorCSAqIF9nb29kXyBibG9ja3MuIEVyYXNpbmcgdGhvc2UgYmxvY2tzIGxlYWRzIHRvIGxvc3MKKwkgKiBvZiB0aGUgZ29vZCAvIGJhZCBpbmZvcm1hdGlvbiwgc28gd2UgX211c3RfIHN0b3JlCisJICogdGhpcyBpbmZvcm1hdGlvbiBpbiBhIGdvb2QgLyBiYWQgdGFibGUgZHVyaW5nCisJICogc3RhcnR1cAorCSovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0lTX0FORCkgeworCQkvKiBVc2UgdGhlIGRlZmF1bHQgcGF0dGVybiBkZXNjcmlwdG9ycyAqLworCQlpZiAoIXRoaXMtPmJidF90ZCkgeworCQkJdGhpcy0+YmJ0X3RkID0gJmJidF9tYWluX2Rlc2NyOworCQkJdGhpcy0+YmJ0X21kID0gJmJidF9taXJyb3JfZGVzY3I7CisJCX0KKwkJdGhpcy0+b3B0aW9ucyB8PSBOQU5EX1VTRV9GTEFTSF9CQlQ7CisJCXJldHVybiBuYW5kX3NjYW5fYmJ0IChtdGQsICZhZ2FuZF9mbGFzaGJhc2VkKTsKKwl9CisKKworCS8qIElzIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlIHJlcXVlc3RlZCA/ICovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlQpIHsKKwkJLyogVXNlIHRoZSBkZWZhdWx0IHBhdHRlcm4gZGVzY3JpcHRvcnMgKi8KKwkJaWYgKCF0aGlzLT5iYnRfdGQpIHsKKwkJCXRoaXMtPmJidF90ZCA9ICZiYnRfbWFpbl9kZXNjcjsKKwkJCXRoaXMtPmJidF9tZCA9ICZiYnRfbWlycm9yX2Rlc2NyOworCQl9CisJCWlmICghdGhpcy0+YmFkYmxvY2tfcGF0dGVybikgeworCQkJdGhpcy0+YmFkYmxvY2tfcGF0dGVybiA9IChtdGQtPm9vYmJsb2NrID4gNTEyKSA/CisJCQkJJmxhcmdlcGFnZV9mbGFzaGJhc2VkIDogJnNtYWxscGFnZV9mbGFzaGJhc2VkOworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy0+YmJ0X3RkID0gTlVMTDsKKwkJdGhpcy0+YmJ0X21kID0gTlVMTDsKKwkJaWYgKCF0aGlzLT5iYWRibG9ja19wYXR0ZXJuKSB7CisJCQl0aGlzLT5iYWRibG9ja19wYXR0ZXJuID0gKG10ZC0+b29iYmxvY2sgPiA1MTIpID8KKwkJCQkmbGFyZ2VwYWdlX21lbW9yeWJhc2VkIDogJnNtYWxscGFnZV9tZW1vcnliYXNlZDsKKwkJfQorCX0KKwlyZXR1cm4gbmFuZF9zY2FuX2JidCAobXRkLCB0aGlzLT5iYWRibG9ja19wYXR0ZXJuKTsKK30KKworLyoqCisgKiBuYW5kX2lzYmFkX2JidCAtIFtOQU5EIEludGVyZmFjZV0gQ2hlY2sgaWYgYSBibG9jayBpcyBiYWQKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZmczoJb2Zmc2V0IGluIHRoZSBkZXZpY2UKKyAqIEBhbGxvd2JidDoJYWxsb3cgYWNjZXNzIHRvIGJhZCBibG9jayB0YWJsZSByZWdpb24KKyAqCisgKi8KK2ludCBuYW5kX2lzYmFkX2JidCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBpbnQgYWxsb3diYnQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwlpbnQgYmxvY2s7CisJdWludDhfdAlyZXM7CisKKwkvKiBHZXQgYmxvY2sgbnVtYmVyICogMiAqLworCWJsb2NrID0gKGludCkgKG9mZnMgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpKTsKKwlyZXMgPSAodGhpcy0+YmJ0W2Jsb2NrID4+IDNdID4+IChibG9jayAmIDB4MDYpKSAmIDB4MDM7CisKKwlERUJVRyAoTVREX0RFQlVHX0xFVkVMMiwgIm5hbmRfaXNiYWRfYmJ0KCk6IGJidCBpbmZvIGZvciBvZmZzIDB4JTA4eDogKGJsb2NrICVkKSAweCUwMnhcbiIsCisJCSh1bnNpZ25lZCBpbnQpb2ZmcywgcmVzLCBibG9jayA+PiAxKTsKKworCXN3aXRjaCAoKGludClyZXMpIHsKKwljYXNlIDB4MDA6CXJldHVybiAwOworCWNhc2UgMHgwMToJcmV0dXJuIDE7CisJY2FzZSAweDAyOglyZXR1cm4gYWxsb3diYnQgPyAwIDogMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMgYi9kcml2ZXJzL25hbmQvbmFuZF9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQwZThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfZWNjLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYW4gRUNDIGFsZ29yaXRobSBmcm9tIFRvc2hpYmEgdGhhdCBkZXRlY3RzIGFuZAorICogY29ycmVjdHMgMSBiaXQgZXJyb3JzIGluIGEgMjU2IGJ5dGUgYmxvY2sgb2YgZGF0YS4KKyAqCisgKiBkcml2ZXJzL210ZC9uYW5kL25hbmRfZWNjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTdGV2ZW4gSi4gSGlsbCAoc2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFRvc2hpYmEgQW1lcmljYSBFbGVjdHJvbmljcyBDb21wb25lbnRzLCBJbmMuCisgKgorICogJElkOiBuYW5kX2VjYy5jLHYgMS4xNCAyMDA0LzA2LzE2IDE1OjM0OjM3IGdsZWl4bmVyIEV4cCAkCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlCisgKiBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZXNlIGZpbGVzLCBvciB5b3UgY29tcGlsZSB0aGVzZQorICogZmlsZXMgYW5kIGxpbmsgdGhlbSB3aXRoIG90aGVyIHdvcmtzIHRvIHByb2R1Y2UgYSB3b3JrIGJhc2VkIG9uIHRoZXNlCisgKiBmaWxlcywgdGhlc2UgZmlsZXMgZG8gbm90IGJ5IHRoZW1zZWx2ZXMgY2F1c2UgdGhlIHJlc3VsdGluZyB3b3JrIHRvIGJlCisgKiBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gSG93ZXZlciB0aGUgc291cmNlIGNvZGUgZm9yCisgKiB0aGVzZSBmaWxlcyBtdXN0IHN0aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uICgzKQorICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5IGEgd29yayBiYXNlZCBvbgorICogdGhpcyBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19OQU5EX0xFR0FDWQorI2Vycm9yIENGR19OQU5EX0xFR0FDWSBkZWZpbmVkIGluIGEgZmlsZSBub3QgdXNpbmcgdGhlIGxlZ2FjeSBOQU5EIHN1cHBvcnQhCisjZW5kaWYKKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisKKyNpbmNsdWRlPGxpbnV4L210ZC9tdGQuaD4KKy8qCisgKiBQcmUtY2FsY3VsYXRlZCAyNTYtd2F5IDEgYnl0ZSBjb2x1bW4gcGFyaXR5CisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgbmFuZF9lY2NfcHJlY2FsY190YWJsZVtdID0geworCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwKKwkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwKKwkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwKKwkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywKKwkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwKKwkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAorCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAKK307CisKKworLyoqCisgKiBuYW5kX3RyYW5zX3Jlc3VsdCAtIFtHRU5FUklDXSBjcmVhdGUgbm9uLWludmVydGVkIEVDQworICogQHJlZzI6CWxpbmUgcGFyaXR5IHJlZyAyCisgKiBAcmVnMzoJbGluZSBwYXJpdHkgcmVnIDMKKyAqIEBlY2NfY29kZToJZWNjCisgKgorICogQ3JlYXRlcyBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eQorICovCitzdGF0aWMgdm9pZCBuYW5kX3RyYW5zX3Jlc3VsdCh1X2NoYXIgcmVnMiwgdV9jaGFyIHJlZzMsCisJdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgYSwgYiwgaSwgdG1wMSwgdG1wMjsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJYSA9IGIgPSAweDgwOworCXRtcDEgPSB0bXAyID0gMDsKKworCS8qIENhbGN1bGF0ZSBmaXJzdCBFQ0MgYnl0ZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFAxNSwxMywxMSw5IC0tPiBlY2NfY29kZVswXSAqLworCQkJdG1wMSB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDE0LDEyLDEwLDggLS0+IGVjY19jb2RlWzBdICovCisJCQl0bXAxIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogQ2FsY3VsYXRlIHNlY29uZCBFQ0MgYnl0ZSAqLworCWIgPSAweDgwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFA3LDUsMywxIC0tPiBlY2NfY29kZVsxXSAqLworCQkJdG1wMiB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDYsNCwyLDAgLS0+IGVjY19jb2RlWzFdICovCisJCQl0bXAyIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogU3RvcmUgdHdvIG9mIHRoZSBFQ0MgYnl0ZXMgKi8KKwllY2NfY29kZVswXSA9IHRtcDE7CisJZWNjX2NvZGVbMV0gPSB0bXAyOworfQorCisvKioKKyAqIG5hbmRfY2FsY3VsYXRlX2VjYyAtIFtOQU5EIEludGVyZmFjZV0gQ2FsY3VsYXRlIDMgYnl0ZSBFQ0MgY29kZSBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqIEBtdGQ6CU1URCBibG9jayBzdHJ1Y3R1cmUKKyAqIEBkYXQ6CXJhdyBkYXRhCisgKiBAZWNjX2NvZGU6CWJ1ZmZlciBmb3IgRUNDCisgKi8KK2ludCBuYW5kX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBpZHgsIHJlZzEsIHJlZzIsIHJlZzM7CisJaW50IGo7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCXJlZzEgPSByZWcyID0gcmVnMyA9IDA7CisJZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKKworCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KKwlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgeworCisJCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLworCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07CisJCXJlZzEgXj0gKGlkeCAmIDB4M2YpOworCisJCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCisJCWlmIChpZHggJiAweDQwKSB7CisJCQlyZWczIF49ICh1X2NoYXIpIGo7CisJCQlyZWcyIF49IH4oKHVfY2hhcikgaik7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KKwluYW5kX3RyYW5zX3Jlc3VsdChyZWcyLCByZWczLCBlY2NfY29kZSk7CisKKwkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KKwllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKKwllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKKwllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuYW5kX2NvcnJlY3RfZGF0YSAtIFtOQU5EIEludGVyZmFjZV0gRGV0ZWN0IGFuZCBjb3JyZWN0IGJpdCBlcnJvcihzKQorICogQG10ZDoJTVREIGJsb2NrIHN0cnVjdHVyZQorICogQGRhdDoJcmF3IGRhdGEgcmVhZCBmcm9tIHRoZSBjaGlwCisgKiBAcmVhZF9lY2M6CUVDQyBmcm9tIHRoZSBjaGlwCisgKiBAY2FsY19lY2M6CXRoZSBFQ0MgY2FsY3VsYXRlZCBmcm9tIHJhdyBkYXRhCisgKgorICogRGV0ZWN0IGFuZCBjb3JyZWN0IGEgMSBiaXQgZXJyb3IgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KK2ludCBuYW5kX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpCit7CisJdV9jaGFyIGEsIGIsIGMsIGQxLCBkMiwgZDMsIGFkZCwgYml0LCBpOworCisJLyogRG8gZXJyb3IgZGV0ZWN0aW9uICovCisJZDEgPSBjYWxjX2VjY1swXSBeIHJlYWRfZWNjWzBdOworCWQyID0gY2FsY19lY2NbMV0gXiByZWFkX2VjY1sxXTsKKwlkMyA9IGNhbGNfZWNjWzJdIF4gcmVhZF9lY2NbMl07CisKKwlpZiAoKGQxIHwgZDIgfCBkMykgPT0gMCkgeworCQkvKiBObyBlcnJvcnMgKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlhID0gKGQxIF4gKGQxID4+IDEpKSAmIDB4NTU7CisJCWIgPSAoZDIgXiAoZDIgPj4gMSkpICYgMHg1NTsKKwkJYyA9IChkMyBeIChkMyA+PiAxKSkgJiAweDU0OworCisJCS8qIEZvdW5kIGFuZCB3aWxsIGNvcnJlY3Qgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgZGF0YSAqLworCQlpZiAoKGEgPT0gMHg1NSkgJiYgKGIgPT0gMHg1NSkgJiYgKGMgPT0gMHg1NCkpIHsKKwkJCWMgPSAweDgwOworCQkJYWRkID0gMDsKKwkJCWEgPSAweDgwOworCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCQkJaWYgKGQxICYgYykKKwkJCQkJYWRkIHw9IGE7CisJCQkJYyA+Pj0gMjsKKwkJCQlhID4+PSAxOworCQkJfQorCQkJYyA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDIgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQliaXQgPSAwOworCQkJYiA9IDB4MDQ7CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQkJCWlmIChkMyAmIGMpCisJCQkJCWJpdCB8PSBiOworCQkJCWMgPj49IDI7CisJCQkJYiA+Pj0gMTsKKwkJCX0KKwkJCWIgPSAweDAxOworCQkJYSA9IGRhdFthZGRdOworCQkJYSBePSAoYiA8PCBiaXQpOworCQkJZGF0W2FkZF0gPSBhOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlpID0gMDsKKwkJCXdoaWxlIChkMSkgeworCQkJCWlmIChkMSAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMSA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMikgeworCQkJCWlmIChkMiAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMiA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMykgeworCQkJCWlmIChkMyAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMyA+Pj0gMTsKKwkJCX0KKwkJCWlmIChpID09IDEpIHsKKwkJCQkvKiBFQ0MgQ29kZSBFcnJvciBDb3JyZWN0aW9uICovCisJCQkJcmVhZF9lY2NbMF0gPSBjYWxjX2VjY1swXTsKKwkJCQlyZWFkX2VjY1sxXSA9IGNhbGNfZWNjWzFdOworCQkJCXJlYWRfZWNjWzJdID0gY2FsY19lY2NbMl07CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBVbmNvcnJlY3RhYmxlIEVycm9yICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCXJldHVybiAtMTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMgYi9kcml2ZXJzL25hbmQvbmFuZF9pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRkMzcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfaWRzLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiAgZHJpdmVycy9tdGQvbmFuZGlkcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBUaG9tYXMgR2xlaXhuZXIgKHRnbHhAbGludXRyb25peC5kZSkKKyAgKgorICogJElkOiBuYW5kX2lkcy5jLHYgMS4xMCAyMDA0LzA1LzI2IDEzOjQwOjEyIGdsZWl4bmVyIEV4cCAkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX05BTkRfTEVHQUNZCisjZXJyb3IgQ0ZHX05BTkRfTEVHQUNZIGRlZmluZWQgaW4gYSBmaWxlIG5vdCB1c2luZyB0aGUgbGVnYWN5IE5BTkQgc3VwcG9ydCEKKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKworI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisKKy8qCisqCUNoaXAgSUQgbGlzdAorKgorKglOYW1lLiBJRCBjb2RlLCBwYWdlc2l6ZSwgY2hpcHNpemUgaW4gTWVnYUJ5dGUsIGVyYXNlYmxvY2sgc2l6ZSwKKyoJb3B0aW9ucworKgorKiAJUGFnZXNpemU7IDAsIDI1NiwgNTEyCisqCTAgCWdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIGV4dGVuZGVkIGNoaXAgSUQKKysJMjU2CTI1NiBCeXRlIHBhZ2Ugc2l6ZQorKgk1MTIJNTEyIEJ5dGUgcGFnZSBzaXplCisqLworc3RydWN0IG5hbmRfZmxhc2hfZGV2IG5hbmRfZmxhc2hfaWRzW10gPSB7CisJeyJOQU5EIDFNaUIgNVYgOC1iaXQiLCAJCTB4NmUsIDI1NiwgMSwgMHgxMDAwLCAwfSwKKwl7Ik5BTkQgMk1pQiA1ViA4LWJpdCIsIAkJMHg2NCwgMjU2LCAyLCAweDEwMDAsIDB9LAorCXsiTkFORCA0TWlCIDVWIDgtYml0IiwgCQkweDZiLCA1MTIsIDQsIDB4MjAwMCwgMH0sCisJeyJOQU5EIDFNaUIgMywzViA4LWJpdCIsIAkweGU4LCAyNTYsIDEsIDB4MTAwMCwgMH0sCisJeyJOQU5EIDFNaUIgMywzViA4LWJpdCIsIAkweGVjLCAyNTYsIDEsIDB4MTAwMCwgMH0sCisJeyJOQU5EIDJNaUIgMywzViA4LWJpdCIsIAkweGVhLCAyNTYsIDIsIDB4MTAwMCwgMH0sCisJeyJOQU5EIDRNaUIgMywzViA4LWJpdCIsIAkweGQ1LCA1MTIsIDQsIDB4MjAwMCwgMH0sCisJeyJOQU5EIDRNaUIgMywzViA4LWJpdCIsIAkweGUzLCA1MTIsIDQsIDB4MjAwMCwgMH0sCisJeyJOQU5EIDRNaUIgMywzViA4LWJpdCIsIAkweGU1LCA1MTIsIDQsIDB4MjAwMCwgMH0sCisJeyJOQU5EIDhNaUIgMywzViA4LWJpdCIsIAkweGQ2LCA1MTIsIDgsIDB4MjAwMCwgMH0sCisKKwl7Ik5BTkQgOE1pQiAxLDhWIDgtYml0IiwgCTB4MzksIDUxMiwgOCwgMHgyMDAwLCAwfSwKKwl7Ik5BTkQgOE1pQiAzLDNWIDgtYml0IiwgCTB4ZTYsIDUxMiwgOCwgMHgyMDAwLCAwfSwKKwl7Ik5BTkQgOE1pQiAxLDhWIDE2LWJpdCIsIAkweDQ5LCA1MTIsIDgsIDB4MjAwMCwgTkFORF9CVVNXSURUSF8xNn0sCisJeyJOQU5EIDhNaUIgMywzViAxNi1iaXQiLCAJMHg1OSwgNTEyLCA4LCAweDIwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCisJeyJOQU5EIDE2TWlCIDEsOFYgOC1iaXQiLCAJMHgzMywgNTEyLCAxNiwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgMTZNaUIgMywzViA4LWJpdCIsIAkweDczLCA1MTIsIDE2LCAweDQwMDAsIDB9LAorCXsiTkFORCAxNk1pQiAxLDhWIDE2LWJpdCIsIAkweDQzLCA1MTIsIDE2LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCAxNk1pQiAzLDNWIDE2LWJpdCIsIAkweDUzLCA1MTIsIDE2LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCisJeyJOQU5EIDMyTWlCIDEsOFYgOC1iaXQiLCAJMHgzNSwgNTEyLCAzMiwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgMzJNaUIgMywzViA4LWJpdCIsIAkweDc1LCA1MTIsIDMyLCAweDQwMDAsIDB9LAorCXsiTkFORCAzMk1pQiAxLDhWIDE2LWJpdCIsIAkweDQ1LCA1MTIsIDMyLCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCAzMk1pQiAzLDNWIDE2LWJpdCIsIAkweDU1LCA1MTIsIDMyLCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCisJeyJOQU5EIDY0TWlCIDEsOFYgOC1iaXQiLCAJMHgzNiwgNTEyLCA2NCwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgNjRNaUIgMywzViA4LWJpdCIsIAkweDc2LCA1MTIsIDY0LCAweDQwMDAsIDB9LAorCXsiTkFORCA2NE1pQiAxLDhWIDE2LWJpdCIsIAkweDQ2LCA1MTIsIDY0LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCA2NE1pQiAzLDNWIDE2LWJpdCIsIAkweDU2LCA1MTIsIDY0LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCisJeyJOQU5EIDEyOE1pQiAxLDhWIDgtYml0IiwgCTB4NzgsIDUxMiwgMTI4LCAweDQwMDAsIDB9LAorCXsiTkFORCAxMjhNaUIgMywzViA4LWJpdCIsIAkweDc5LCA1MTIsIDEyOCwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgMTI4TWlCIDEsOFYgMTYtYml0IiwgCTB4NzIsIDUxMiwgMTI4LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCAxMjhNaUIgMywzViAxNi1iaXQiLCAJMHg3NCwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCisKKwl7Ik5BTkQgMjU2TWlCIDMsM1YgOC1iaXQiLCAJMHg3MSwgNTEyLCAyNTYsIDB4NDAwMCwgMH0sCisKKwl7Ik5BTkQgNTEyTWlCIDMsM1YgOC1iaXQiLCAJMHhEQywgNTEyLCA1MTIsIDB4NDAwMCwgMH0sCisKKwkvKiBUaGVzZSBhcmUgdGhlIG5ldyBjaGlwcyB3aXRoIGxhcmdlIHBhZ2Ugc2l6ZS4gVGhlIHBhZ2VzaXplCisJKiBhbmQgdGhlIGVyYXNlc2l6ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGV4dGVuZGVkIGlkIGJ5dGVzCisJKi8KKwkvKiAxIEdpZ2FiaXQgKi8KKwl7Ik5BTkQgMTI4TWlCIDEsOFYgOC1iaXQiLCAJMHhBMSwgMCwgMTI4LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCAxMjhNaUIgMywzViA4LWJpdCIsIAkweEYxLCAwLCAxMjgsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDEyOE1pQiAxLDhWIDE2LWJpdCIsIAkweEIxLCAwLCAxMjgsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCAxMjhNaUIgMywzViAxNi1iaXQiLCAJMHhDMSwgMCwgMTI4LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfQlVTV0lEVEhfMTYgfCBOQU5EX05PX0FVVE9JTkNSfSwKKworCS8qIDIgR2lnYWJpdCAqLworCXsiTkFORCAyNTZNaUIgMSw4ViA4LWJpdCIsIAkweEFBLCAwLCAyNTYsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDI1Nk1pQiAzLDNWIDgtYml0IiwgCTB4REEsIDAsIDI1NiwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKKwl7Ik5BTkQgMjU2TWlCIDEsOFYgMTYtYml0IiwgCTB4QkEsIDAsIDI1NiwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDI1Nk1pQiAzLDNWIDE2LWJpdCIsIAkweENBLCAwLCAyNTYsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCisJLyogNCBHaWdhYml0ICovCisJeyJOQU5EIDUxMk1pQiAxLDhWIDgtYml0IiwgCTB4QUMsIDAsIDUxMiwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKKwl7Ik5BTkQgNTEyTWlCIDMsM1YgOC1iaXQiLCAJMHhEQywgMCwgNTEyLCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCA1MTJNaUIgMSw4ViAxNi1iaXQiLCAJMHhCQywgMCwgNTEyLCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfQlVTV0lEVEhfMTYgfCBOQU5EX05PX0FVVE9JTkNSfSwKKwl7Ik5BTkQgNTEyTWlCIDMsM1YgMTYtYml0IiwgCTB4Q0MsIDAsIDUxMiwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisKKwkvKiA4IEdpZ2FiaXQgKi8KKwl7Ik5BTkQgMUdpQiAxLDhWIDgtYml0IiwgCTB4QTMsIDAsIDEwMjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDFHaUIgMywzViA4LWJpdCIsIAkweEQzLCAwLCAxMDI0LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCAxR2lCIDEsOFYgMTYtYml0IiwgCTB4QjMsIDAsIDEwMjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCAxR2lCIDMsM1YgMTYtYml0IiwgCTB4QzMsIDAsIDEwMjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCisJLyogMTYgR2lnYWJpdCAqLworCXsiTkFORCAyR2lCIDEsOFYgOC1iaXQiLCAJMHhBNSwgMCwgMjA0OCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKKwl7Ik5BTkQgMkdpQiAzLDNWIDgtYml0IiwgCTB4RDUsIDAsIDIwNDgsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDJHaUIgMSw4ViAxNi1iaXQiLCAJMHhCNSwgMCwgMjA0OCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDJHaUIgMywzViAxNi1iaXQiLCAJMHhDNSwgMCwgMjA0OCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX0JVU1dJRFRIXzE2IHwgTkFORF9OT19BVVRPSU5DUn0sCisKKwkvKiBSZW5lc2FzIEFORCAxIEdpZ2FiaXQuIFRob3NlIGNoaXBzIGRvIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGlkIGFuZCBoYXZlIGEgc3RyYW5nZSBwYWdlL2Jsb2NrIGxheW91dCAhCisJICogVGhlIGNob3NlbiBtaW5pbXVtIGVyYXNlc2l6ZSBpcyA0ICogMiAqIDIwNDggPSAxNjM4NCBCeXRlLCBhcyB0aG9zZSBjaGlwcyBoYXZlIGFuIGFycmF5IG9mIDQgcGFnZSBwbGFuZXMKKwkgKiAxIGJsb2NrID0gMiBwYWdlcywgYnV0IGR1ZSB0byBwbGFuZSBhcnJhbmdlbWVudCB0aGUgYmxvY2tzIDAtMyBjb25zaXN0cyBvZiBwYWdlIDAgKyA0LDEgKyA1LCAyICsgNiwgMyArIDcKKwkgKiBBbnl3YXkgSkZGUzIgd291bGQgaW5jcmVhc2UgdGhlIGVyYXNlYmxvY2sgc2l6ZSBzbyB3ZSBjaG9zZSBhIGNvbWJpbmVkIG9uZSB3aGljaCBjYW4gYmUgZXJhc2VkIGluIG9uZSBnbworCSAqIFRoZXJlIGFyZSBtb3JlIHNwZWVkIGltcHJvdmVtZW50cyBmb3IgcmVhZHMgYW5kIHdyaXRlcyBwb3NzaWJsZSwgYnV0IG5vdCBpbXBsZW1lbnRlZCBub3cKKwkgKi8KKwl7IkFORCAxMjhNaUIgMywzViA4LWJpdCIsCTB4MDEsIDIwNDgsIDEyOCwgMHg0MDAwLCBOQU5EX0lTX0FORCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EXzRQQUdFX0FSUkFZfSwKKworCXtOVUxMLH0KK307CisKKy8qCisqCU1hbnVmYWN0dXJlciBJRCBsaXN0CisqLworc3RydWN0IG5hbmRfbWFudWZhY3R1cmVycyBuYW5kX21hbnVmX2lkc1tdID0geworCXtOQU5EX01GUl9UT1NISUJBLCAiVG9zaGliYSJ9LAorCXtOQU5EX01GUl9TQU1TVU5HLCAiU2Ftc3VuZyJ9LAorCXtOQU5EX01GUl9GVUpJVFNVLCAiRnVqaXRzdSJ9LAorCXtOQU5EX01GUl9OQVRJT05BTCwgIk5hdGlvbmFsIn0sCisJe05BTkRfTUZSX1JFTkVTQVMsICJSZW5lc2FzIn0sCisJe05BTkRfTUZSX1NUTUlDUk8sICJTVCBNaWNybyJ9LAorCXsweDAsICJVbmtub3duIn0KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZF9sZWdhY3kvTWFrZWZpbGUgYi9kcml2ZXJzL25hbmRfbGVnYWN5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmNmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25hbmRfbGVnYWN5L01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIgOj0gbGlibmFuZF9sZWdhY3kuYQorCitPQkpTIDo9IG5hbmRfbGVnYWN5Lm8KK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpIGNydiAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLmRlcGVuZDoJTWFrZWZpbGUgJChPQkpTOi5vPS5jKQorCQkkKENDKSAtTSAkKENGTEFHUykgJChPQkpTOi5vPS5jKSA+ICRACisKK3NpbmNsdWRlIC5kZXBlbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZF9sZWdhY3kvbmFuZF9sZWdhY3kuYyBiL2RyaXZlcnMvbmFuZF9sZWdhY3kvbmFuZF9sZWdhY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg5Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uYW5kX2xlZ2FjeS9uYW5kX2xlZ2FjeS5jCkBAIC0wLDAgKzEsMTYxNSBAQAorLyoKKyAqIChDKSAyMDA2IERlbngKKyAqIERyaXZlciBmb3IgTkFORCBzdXBwb3J0LCBSaWNrIEJyb25zb24KKyAqIGJvcnJvd2VkIGhlYXZpbHkgZnJvbToKKyAqIChjKSAxOTk5IE1hY2hpbmUgVmlzaW9uIEhvbGRpbmdzLCBJbmMuCisgKiAoYykgMTk5OSwgMjAwMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogQWRkZWQgMTYtYml0IG5hbmQgc3VwcG9ydAorICogKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZm5kZWYgQ0ZHX05BTkRfTEVHQUNZCisjZXJyb3IgQ0ZHX05BTkRfTEVHQUNZIG5vdCBkZWZpbmVkIGluIGEgZmlsZSB1c2luZyB0aGUgbGVnYWN5IE5BTkQgc3VwcG9ydCEKKyNlbmRpZgorCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCisjIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCisjZWxzZQorIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKKyNlbmRpZgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKworI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2lkcy5oPgorI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CisKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKK3ZvaWQgYXJjaGZsYXNod3Aodm9pZCAqYXJjaGRhdGEsIGludCB3cCk7CisjZW5kaWYKKworI2RlZmluZSBST1VORF9ET1dOKHZhbHVlLGJvdW5kYXJ5KSAgICAgICgodmFsdWUpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCisKKyN1bmRlZglQU1lDSE9fREVCVUcKKyN1bmRlZglOQU5EX0RFQlVHCisKKy8qICoqKioqKioqKioqKioqKioqKiBXQVJOSU5HICoqKioqKioqKioqKioqKioqKioqKgorICogV2hlbiBBTExPV19FUkFTRV9CQURfREVCVUcgaXMgbm9uLXplcm8gdGhlIGVyYXNlIGNvbW1hbmQgd2lsbAorICogZXJhc2UgKG9yIGF0IGxlYXN0IGF0dGVtcHQgdG8gZXJhc2UpIGJsb2NrcyB0aGF0IGFyZSBtYXJrZWQKKyAqIGJhZC4gVGhpcyBjYW4gYmUgdmVyeSBoYW5keSBpZiB5b3UgYXJlIF9zdXJlXyB0aGF0IHRoZSBibG9jaworICogaXMgT0ssIHNheSBiZWNhdXNlIHlvdSBtYXJrZWQgYSBnb29kIGJsb2NrIGJhZCB0byB0ZXN0IGJhZAorICogYmxvY2sgaGFuZGxpbmcgYW5kIHlvdSBhcmUgZG9uZSB0ZXN0aW5nLCBvciBpZiB5b3UgaGF2ZQorICogYWNjaWRlbnRhbGx5IG1hcmtlZCBibG9ja3MgYmFkLgorICoKKyAqIEVyYXNpbmcgZmFjdG9yeSBtYXJrZWQgYmFkIGJsb2NrcyBpcyBhIF9iYWRfIGlkZWEuIElmIHRoZQorICogZXJhc2Ugc3VjY2VlZHMgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGZpbmQgdGhlbSBhZ2FpbiwKKyAqIGFuZCBhdHRlbXB0aW5nIHRvIHByb2dyYW0gb3IgZXJhc2UgYmFkIGJsb2NrcyBjYW4gYWZmZWN0CisgKiB0aGUgZGF0YSBpbiBfb3RoZXJfIChnb29kKSBibG9ja3MuCisgKi8KKyNkZWZpbmUJIEFMTE9XX0VSQVNFX0JBRF9ERUJVRyAwCisKKyNkZWZpbmUgQ09ORklHX01URF9OQU5EX0VDQyAgLyogZW5hYmxlIEVDQyAqLworI2RlZmluZSBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCisKKy8qIGJpdHMgZm9yIG5hbmRfbGVnYWN5X3J3KCkgYGNtZCc7IG9yIHRvZ2V0aGVyIGFzIG5lZWRlZCAqLworI2RlZmluZSBOQU5EUldfUkVBRAkweDAxCisjZGVmaW5lIE5BTkRSV19XUklURQkweDAwCisjZGVmaW5lIE5BTkRSV19KRkZTMgkweDAyCisjZGVmaW5lIE5BTkRSV19KRkZTMl9TS0lQCTB4MDQKKworCisvKgorICogRXhwb3J0ZWQgdmFyaWFibGVzIGV0Yy4KKyAqLworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBvdXQgb2YgYmFuZCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IG5hbmRfb29iX2NvbmZpZyB7CisJLyogcG9zaXRpb24gb2YgRUNDIGJ5dGVzIGluc2lkZSBvb2IgKi8KKwlpbnQgZWNjX3Bvc1s2XTsKKwkvKiBwb3NpdGlvbiBvZiAgYmFkIGJsayBmbGFnIGluc2lkZSBvb2IgLTEgPSBpbmFjdGl2ZSAqLworCWludCBiYWRibG9ja19wb3M7CisJLyogcG9zaXRpb24gb2YgRUNDIHZhbGlkIGZsYWcgaW5zaWRlIG9vYiAtMSA9IGluYWN0aXZlICovCisJaW50IGVjY3ZhbGlkX3BvczsKK30gb29iX2NvbmZpZyA9IHsgezB9LCAwLCAwfTsKKworc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdID0ge3swfX07CisKK2ludCBjdXJyX2RldmljZSA9IC0xOyAvKiBDdXJyZW50IE5BTkQgRGV2aWNlICovCisKKworLyoKKyAqIEV4cG9ydGVkIGZ1bmN0aW9uc3MKKyAqLworaW50IG5hbmRfbGVnYWN5X2VyYXNlKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCBvZnMsCisJCSAgICAgc2l6ZV90IGxlbiwgaW50IGNsZWFuKTsKK2ludCBuYW5kX2xlZ2FjeV9ydyhzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBpbnQgY21kLAorCQkgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKKwkJICBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1Zik7Cit2b2lkIG5hbmRfcHJpbnQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCk7Cit2b2lkIG5hbmRfcHJpbnRfYmFkKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpOworaW50IG5hbmRfcmVhZF9vb2Ioc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IG9mcywgc2l6ZV90IGxlbiwKKwkJIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmKTsKK2ludCBuYW5kX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAorCQkgc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKiBidWYpOworCisvKgorICogSW50ZXJuYWxzCisgKi8KK3N0YXRpYyBpbnQgTmFuRF9XYWl0UmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgaW50IGFsZV93YWl0KTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX2VjYyhzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW4sCisJCSBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjY19jb2RlKTsKK3N0YXRpYyBpbnQgbmFuZF93cml0ZV9lY2MgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCB0bywgc2l6ZV90IGxlbiwKKwkJCSAgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmLAorCQkJICAgdV9jaGFyICogZWNjX2NvZGUpOworI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKK3N0YXRpYyBpbnQgbmFuZF9jb3JyZWN0X2RhdGEgKHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKTsKK3N0YXRpYyB2b2lkIG5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpOworI2VuZGlmCisKKworLyoKKyAqCisgKiBGdW5jdGlvbiBkZWZpbml0aW9ucworICoKKyAqLworCisvKiByZXR1cm5zIDAgaWYgYmxvY2sgY29udGFpbmluZyBwb3MgaXMgT0s6CisgKgkJdmFsaWQgZXJhc2UgYmxvY2sgYW5kCisgKgkJbm90IG1hcmtlZCBiYWQsIG9yIG5vIGJhZCBtYXJrIHBvc2l0aW9uIGlzIHNwZWNpZmllZAorICogcmV0dXJucyAxIGlmIG1hcmtlZCBiYWQgb3Igb3RoZXJ3aXNlIGludmFsaWQKKyAqLworc3RhdGljIGludCBjaGVja19ibG9jayAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgdW5zaWduZWQgbG9uZyBwb3MpCit7CisJc2l6ZV90IHJldGxlbjsKKwl1aW50OF90IG9vYl9kYXRhOworCXVpbnQxNl90IG9vYl9kYXRhMTZbNl07CisJaW50IHBhZ2UwID0gcG9zICYgKC1uYW5kLT5lcmFzZXNpemUpOworCWludCBwYWdlMSA9IHBhZ2UwICsgbmFuZC0+b29iYmxvY2s7CisJaW50IGJhZHBvcyA9IG9vYl9jb25maWcuYmFkYmxvY2tfcG9zOworCisJaWYgKHBvcyA+PSBuYW5kLT50b3RsZW4pCisJCXJldHVybiAxOworCisJaWYgKGJhZHBvcyA8IDApCisJCXJldHVybiAwOwkvKiBubyB3YXkgdG8gY2hlY2ssIGFzc3VtZSBPSyAqLworCisJaWYgKG5hbmQtPmJ1czE2KSB7CisJCWlmIChuYW5kX3JlYWRfb29iKG5hbmQsIChwYWdlMCArIDApLCAxMiwgJnJldGxlbiwgKHVpbnQ4X3QgKilvb2JfZGF0YTE2KQorCQkgICAgfHwgKG9vYl9kYXRhMTZbMl0gJiAweGZmMDApICE9IDB4ZmYwMCkKKwkJCXJldHVybiAxOworCQlpZiAobmFuZF9yZWFkX29vYihuYW5kLCAocGFnZTEgKyAwKSwgMTIsICZyZXRsZW4sICh1aW50OF90ICopb29iX2RhdGExNikKKwkJICAgIHx8IChvb2JfZGF0YTE2WzJdICYgMHhmZjAwKSAhPSAweGZmMDApCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvKiBOb3RlIC0gYmFkIGJsb2NrIG1hcmtlciBjYW4gYmUgb24gZmlyc3Qgb3Igc2Vjb25kIHBhZ2UgKi8KKwkJaWYgKG5hbmRfcmVhZF9vb2IobmFuZCwgcGFnZTAgKyBiYWRwb3MsIDEsICZyZXRsZW4sICh1bnNpZ25lZCBjaGFyICopJm9vYl9kYXRhKQorCQkgICAgfHwgb29iX2RhdGEgIT0gMHhmZgorCQkgICAgfHwgbmFuZF9yZWFkX29vYiAobmFuZCwgcGFnZTEgKyBiYWRwb3MsIDEsICZyZXRsZW4sICh1bnNpZ25lZCBjaGFyICopJm9vYl9kYXRhKQorCQkgICAgfHwgb29iX2RhdGEgIT0gMHhmZikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiBwcmludCBiYWQgYmxvY2tzIGluIE5BTkQgZmxhc2ggKi8KK3ZvaWQgbmFuZF9wcmludF9iYWQoc3RydWN0IG5hbmRfY2hpcCogbmFuZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBvczsKKworCWZvciAocG9zID0gMDsgcG9zIDwgbmFuZC0+dG90bGVuOyBwb3MgKz0gbmFuZC0+ZXJhc2VzaXplKSB7CisJCWlmIChjaGVja19ibG9jayhuYW5kLCBwb3MpKQorCQkJcHJpbnRmKCIgMHglOC44bHhcbiIsIHBvcyk7CisJfQorCXB1dHMoIlxuIik7Cit9CisKKy8qIGNtZDogMDogTkFORFJXX1dSSVRFCQkJd3JpdGUsIGZhaWwgb24gYmFkIGJsb2NrCisgKgkxOiBOQU5EUldfUkVBRAkJCXJlYWQsIGZhaWwgb24gYmFkIGJsb2NrCisgKgkyOiBOQU5EUldfV1JJVEUgfCBOQU5EUldfSkZGUzIJd3JpdGUsIHNraXAgYmFkIGJsb2NrcworICoJMzogTkFORFJXX1JFQUQgfCBOQU5EUldfSkZGUzIJcmVhZCwgZGF0YSBhbGwgMHhmZiBmb3IgYmFkIGJsb2NrcworICogICAgICA3OiBOQU5EUldfUkVBRCB8IE5BTkRSV19KRkZTMiB8IE5BTkRSV19KRkZTMl9TS0lQIHJlYWQsIHNraXAgYmFkIGJsb2NrcworICovCitpbnQgbmFuZF9sZWdhY3lfcncgKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIGludCBjbWQsCisJCSAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbiwKKwkJICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYpCit7CisJaW50IHJldCA9IDAsIG4sIHRvdGFsID0gMDsKKwljaGFyIGVjY2J1Zls2XTsKKwkvKiBlYmxrIChvbmNlIHNldCkgaXMgdGhlIHN0YXJ0IG9mIHRoZSBlcmFzZSBibG9jayBjb250YWluaW5nIHRoZQorCSAqIGRhdGEgYmVpbmcgcHJvY2Vzc2VkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgZWJsayA9IH4wOwkvKiBmb3JjZSBtaXNtYXRjaCBvbiBmaXJzdCBwYXNzICovCisJdW5zaWduZWQgbG9uZyBlcmFzZXNpemUgPSBuYW5kLT5lcmFzZXNpemU7CisKKwl3aGlsZSAobGVuKSB7CisJCWlmICgoc3RhcnQgJiAoLWVyYXNlc2l6ZSkpICE9IGVibGspIHsKKwkJCS8qIGhhdmUgY3Jvc3NlZCBpbnRvIG5ldyBlcmFzZSBibG9jaywgZGVhbCB3aXRoCisJCQkgKiBpdCBpZiBpdCBpcyBzdXJlIG1hcmtlZCBiYWQuCisJCQkgKi8KKwkJCWVibGsgPSBzdGFydCAmICgtZXJhc2VzaXplKTsgLyogc3RhcnQgb2YgYmxvY2sgKi8KKwkJCWlmIChjaGVja19ibG9jayhuYW5kLCBlYmxrKSkgeworCQkJCWlmIChjbWQgPT0gKE5BTkRSV19SRUFEIHwgTkFORFJXX0pGRlMyKSkgeworCQkJCQl3aGlsZSAobGVuID4gMCAmJgorCQkJCQkgICAgICAgc3RhcnQgLSBlYmxrIDwgZXJhc2VzaXplKSB7CisJCQkJCQkqKGJ1ZisrKSA9IDB4ZmY7CisJCQkJCQkrK3N0YXJ0OworCQkJCQkJKyt0b3RhbDsKKwkJCQkJCS0tbGVuOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoY21kID09IChOQU5EUldfUkVBRCB8IE5BTkRSV19KRkZTMiB8IE5BTkRSV19KRkZTMl9TS0lQKSkgeworCQkJCQlzdGFydCArPSBlcmFzZXNpemU7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoY21kID09IChOQU5EUldfV1JJVEUgfCBOQU5EUldfSkZGUzIpKSB7CisJCQkJCS8qIHNraXAgYmFkIGJsb2NrICovCisJCQkJCXN0YXJ0ICs9IGVyYXNlc2l6ZTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFRoZSBFQ0Mgd2lsbCBub3QgYmUgY2FsY3VsYXRlZCBjb3JyZWN0bHkgaWYKKwkJICAgbGVzcyB0aGFuIDUxMiBpcyB3cml0dGVuIG9yIHJlYWQgKi8KKwkJLyogSXMgcmVxdWVzdCBhdCBsZWFzdCA1MTIgYnl0ZXMgQU5EIGl0IHN0YXJ0cyBvbiBhIHByb3BlciBib3VuZHJ5ICovCisJCWlmKChzdGFydCAhPSBST1VORF9ET1dOKHN0YXJ0LCAweDIwMCkpIHx8IChsZW4gPCAweDIwMCkpCisJCQlwcmludGYoIldhcm5pbmcgYmxvY2sgd3JpdGVzIHNob3VsZCBiZSBhdCBsZWFzdCA1MTIgYnl0ZXMgYW5kIHN0YXJ0IG9uIGEgNTEyIGJ5dGUgYm91bmRyeVxuIik7CisKKwkJaWYgKGNtZCAmIE5BTkRSV19SRUFEKSB7CisJCQlyZXQgPSBuYW5kX3JlYWRfZWNjKG5hbmQsIHN0YXJ0LAorCQkJCQkgICBtaW4obGVuLCBlYmxrICsgZXJhc2VzaXplIC0gc3RhcnQpLAorCQkJCQkgICAoc2l6ZV90ICopJm4sICh1X2NoYXIqKWJ1ZiwgKHVfY2hhciAqKWVjY2J1Zik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBuYW5kX3dyaXRlX2VjYyhuYW5kLCBzdGFydCwKKwkJCQkJICAgIG1pbihsZW4sIGVibGsgKyBlcmFzZXNpemUgLSBzdGFydCksCisJCQkJCSAgICAoc2l6ZV90ICopJm4sICh1X2NoYXIqKWJ1ZiwgKHVfY2hhciAqKWVjY2J1Zik7CisJCX0KKworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJc3RhcnQgICs9IG47CisJCWJ1ZiAgICs9IG47CisJCXRvdGFsICs9IG47CisJCWxlbiAgIC09IG47CisJfQorCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSB0b3RhbDsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbmFuZF9wcmludChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQoreworCWlmIChuYW5kLT5udW1jaGlwcyA+IDEpIHsKKwkJcHJpbnRmKCIlcyBhdCAweCVseCxcbiIKKwkJICAgICAgICJcdCAgJWQgY2hpcHMgJXMsIHNpemUgJWQgTUIsIFxuIgorCQkgICAgICAgIlx0ICB0b3RhbCBzaXplICVsZCBNQiwgc2VjdG9yIHNpemUgJWxkIGtCXG4iLAorCQkgICAgICAgbmFuZC0+bmFtZSwgbmFuZC0+SU9fQUREUiwgbmFuZC0+bnVtY2hpcHMsCisJCSAgICAgICBuYW5kLT5jaGlwc19uYW1lLCAxIDw8IChuYW5kLT5jaGlwc2hpZnQgLSAyMCksCisJCSAgICAgICBuYW5kLT50b3RsZW4gPj4gMjAsIG5hbmQtPmVyYXNlc2l6ZSA+PiAxMCk7CisJfQorCWVsc2UgeworCQlwcmludGYoIiVzIGF0IDB4JWx4ICgiLCBuYW5kLT5jaGlwc19uYW1lLCBuYW5kLT5JT19BRERSKTsKKwkJcHJpbnRfc2l6ZShuYW5kLT50b3RsZW4sICIsICIpOworCQlwcmludF9zaXplKG5hbmQtPmVyYXNlc2l6ZSwgIiBzZWN0b3IpXG4iKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBOYW5EX1dhaXRSZWFkeShzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgYWxlX3dhaXQpCit7CisJLyogVGhpcyBpcyBpbmxpbmUsIHRvIG9wdGltaXNlIHRoZSBjb21tb24gY2FzZSwgd2hlcmUgaXQncyByZWFkeSBpbnN0YW50bHkgKi8KKwlpbnQgcmV0ID0gMDsKKworI2lmZGVmIE5BTkRfTk9fUkIJLyogaW4gY29uZmlnIGZpbGUsIHNob3J0ZXIgZGVsYXlzIGN1cnJlbnRseSB3cmFwIGFjY2Vzc2VzICovCisJaWYoYWxlX3dhaXQpCisJCU5BTkRfV0FJVF9SRUFEWShuYW5kKTsJLyogZG8gdGhlIHdvcnN0IGNhc2UgMjV1cyB3YWl0ICovCisJZWxzZQorCQl1ZGVsYXkoMTApOworI2Vsc2UJLyogaGFzIGZ1bmN0aW9uYWwgci9iIHNpZ25hbCAqLworCU5BTkRfV0FJVF9SRUFEWShuYW5kKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KKworc3RhdGljIGlubGluZSBpbnQgTmFuRF9Db21tYW5kKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKwl1bnNpZ25lZCBsb25nIG5hbmRwdHIgPSBuYW5kLT5JT19BRERSOworCisJLyogQXNzZXJ0IHRoZSBDTEUgKENvbW1hbmQgTGF0Y2ggRW5hYmxlKSBsaW5lIHRvIHRoZSBmbGFzaCBjaGlwICovCisJTkFORF9DVExfU0VUQ0xFKG5hbmRwdHIpOworCisJLyogU2VuZCB0aGUgY29tbWFuZCAqLworCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBuYW5kcHRyKTsKKworCS8qIExvd2VyIHRoZSBDTEUgbGluZSAqLworCU5BTkRfQ1RMX0NMUkNMRShuYW5kcHRyKTsKKworI2lmZGVmIE5BTkRfTk9fUkIKKwlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdV9jaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOworCQlkbyB7CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKG5hbmRwdHIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisJfQorI2VuZGlmCisJcmV0dXJuIE5hbkRfV2FpdFJlYWR5KG5hbmQsIDApOworfQorCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyhzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworCXVuc2lnbmVkIGxvbmcgbmFuZHB0cjsKKwlpbnQgaTsKKworCW5hbmRwdHIgPSBuYW5kLT5JT19BRERSOworCisJLyogQXNzZXJ0IHRoZSBBTEUgKEFkZHJlc3MgTGF0Y2ggRW5hYmxlKSBsaW5lIHRvIHRoZSBmbGFzaCBjaGlwICovCisJTkFORF9DVExfU0VUQUxFKG5hbmRwdHIpOworCisJLyogU2VuZCB0aGUgYWRkcmVzcyAqLworCS8qIERldmljZXMgd2l0aCAyNTYtYnl0ZSBwYWdlIGFyZSBhZGRyZXNzZWQgYXM6CisJICogQ29sdW1uIChiaXRzIDAtNyksIFBhZ2UgKGJpdHMgOC0xNSwgMTYtMjMsIDI0LTMxKQorCSAqIHRoZXJlIGlzIG5vIGRldmljZSBvbiB0aGUgbWFya2V0IHdpdGggcGFnZTI1NgorCSAqIGFuZCBtb3JlIHRoYW4gMjQgYml0cy4KKwkgKiBEZXZpY2VzIHdpdGggNTEyLWJ5dGUgcGFnZSBhcmUgYWRkcmVzc2VkIGFzOgorCSAqIENvbHVtbiAoYml0cyAwLTcpLCBQYWdlIChiaXRzIDktMTYsIDE3LTI0LCAyNS0zMSkKKwkgKiAyNS0zMSBpcyBzZW50IG9ubHkgaWYgdGhlIGNoaXAgc3VwcG9ydCBpdC4KKwkgKiBiaXQgOCBjaGFuZ2VzIHRoZSByZWFkIGNvbW1hbmQgdG8gYmUgc2VudAorCSAqIChOQU5EX0NNRF9SRUFEMCBvciBOQU5EX0NNRF9SRUFEMSkuCisJICovCisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgbmFuZHB0cik7CisKKwlvZnMgPSBvZnMgPj4gbmFuZC0+cGFnZV9zaGlmdDsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbmFuZC0+cGFnZWFkcmxlbjsgaSsrLCBvZnMgPSBvZnMgPj4gOCkgeworCQkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgbmFuZHB0cik7CisJCX0KKwl9CisKKwkvKiBMb3dlciB0aGUgQUxFIGxpbmUgKi8KKwlOQU5EX0NUTF9DTFJBTEUobmFuZHB0cik7CisKKwkvKiBXYWl0IGZvciB0aGUgY2hpcCB0byByZXNwb25kICovCisJcmV0dXJuIE5hbkRfV2FpdFJlYWR5KG5hbmQsIDEpOworfQorCisvKiBOYW5EX1NlbGVjdENoaXA6IFNlbGVjdCBhIGdpdmVuIGZsYXNoIGNoaXAgd2l0aGluIHRoZSBjdXJyZW50IGZsb29yICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5hbkRfU2VsZWN0Q2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgY2hpcCkKK3sKKwkvKiBXYWl0IGZvciBpdCB0byBiZSByZWFkeSAqLworCXJldHVybiBOYW5EX1dhaXRSZWFkeShuYW5kLCAwKTsKK30KKworLyogTmFuRF9JZGVudENoaXA6IElkZW50aWZ5IGEgZ2l2ZW4gTkFORCBjaGlwIGdpdmVuIHtmbG9vcixjaGlwfSAqLworCitzdGF0aWMgaW50IE5hbkRfSWRlbnRDaGlwKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIGludCBmbG9vciwgaW50IGNoaXApCit7CisJaW50IG1mciwgaWQsIGk7CisKKwlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93ICovCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlpZiAoTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1JFU0VUKSkgeworI2lmZGVmIE5BTkRfREVCVUcKKwkJcHJpbnRmKCJOYW5EX0NvbW1hbmQgKHJlc2V0KSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKKwkJICAgICAgIGZsb29yLCBjaGlwKTsKKyNlbmRpZgorCQlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVhZCB0aGUgTkFORCBjaGlwIElEOiAxLiBTZW5kIFJlYWRJRCBjb21tYW5kICovCisJaWYgKE5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9SRUFESUQpKSB7CisjaWZkZWYgTkFORF9ERUJVRworCQlwcmludGYoIk5hbkRfQ29tbWFuZCAoUmVhZElEKSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKKwkJICAgICAgIGZsb29yLCBjaGlwKTsKKyNlbmRpZgorCQlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVhZCB0aGUgTkFORCBjaGlwIElEOiAyLiBTZW5kIGFkZHJlc3MgYnl0ZSB6ZXJvICovCisJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OLCAwKTsKKworCS8qIFJlYWQgdGhlIG1hbnVmYWN0dXJlciBhbmQgZGV2aWNlIGlkIGNvZGVzIGZyb20gdGhlIGRldmljZSAqLworCisJbWZyID0gUkVBRF9OQU5EKG5hbmQtPklPX0FERFIpOworCisJaWQgPSBSRUFEX05BTkQobmFuZC0+SU9fQUREUik7CisKKwlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworI2lmZGVmIE5BTkRfREVCVUcKKwlwcmludGYoIk5hbkRfQ29tbWFuZCAoUmVhZElEKSBnb3QgJXggJXhcbiIsIG1mciwgaWQpOworI2VuZGlmCisJaWYgKG1mciA9PSAweGZmIHx8IG1mciA9PSAwKSB7CisJCS8qIE5vIHJlc3BvbnNlIC0gcmV0dXJuIGZhaWx1cmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaXQncyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgY2hpcCB3ZSBpZGVudGlmaWVkLgorCSAqIE0tU3lzdGVtcyBzYXkgdGhhdCBhbnkgZ2l2ZW4gbmFuZF9jaGlwIGRldmljZSBzaG91bGQgb25seQorCSAqIGNvbnRhaW4gX29uZV8gdHlwZSBvZiBmbGFzaCBwYXJ0LCBhbHRob3VnaCB0aGF0J3Mgbm90IGEKKwkgKiBoYXJkd2FyZSByZXN0cmljdGlvbi4gKi8KKwlpZiAobmFuZC0+bWZyKSB7CisJCWlmIChuYW5kLT5tZnIgPT0gbWZyICYmIG5hbmQtPmlkID09IGlkKSB7CisJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhbm90aGVyIHRoZSBzYW1lIHRoZSBmaXJzdCAqLworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJGbGFzaCBjaGlwIGF0IGZsb29yICVkLCBjaGlwICVkIGlzIGRpZmZlcmVudDpcbiIsCisJCQkgICAgICAgZmxvb3IsIGNoaXApOworCQl9CisJfQorCisJLyogUHJpbnQgYW5kIHN0b3JlIHRoZSBtYW51ZmFjdHVyZXIgYW5kIElEIGNvZGVzLiAqLworCWZvciAoaSA9IDA7IG5hbmRfZmxhc2hfaWRzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChtZnIgPT0gbmFuZF9mbGFzaF9pZHNbaV0ubWFudWZhY3R1cmVfaWQgJiYKKwkJICAgIGlkID09IG5hbmRfZmxhc2hfaWRzW2ldLm1vZGVsX2lkKSB7CisjaWZkZWYgTkFORF9ERUJVRworCQkJcHJpbnRmKCJGbGFzaCBjaGlwIGZvdW5kOlxuXHQgTWFudWZhY3R1cmVyIElEOiAweCUyLjJYLCAiCisJCQkgICAgICAgIkNoaXAgSUQ6IDB4JTIuMlggKCVzKVxuIiwgbWZyLCBpZCwKKwkJCSAgICAgICBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lKTsKKyNlbmRpZgorCQkJaWYgKCFuYW5kLT5tZnIpIHsKKwkJCQluYW5kLT5tZnIgPSBtZnI7CisJCQkJbmFuZC0+aWQgPSBpZDsKKwkJCQluYW5kLT5jaGlwc2hpZnQgPQorCQkJCSAgICBuYW5kX2ZsYXNoX2lkc1tpXS5jaGlwc2hpZnQ7CisJCQkJbmFuZC0+cGFnZTI1NiA9IG5hbmRfZmxhc2hfaWRzW2ldLnBhZ2UyNTY7CisJCQkJbmFuZC0+ZWNjc2l6ZSA9IDI1NjsKKwkJCQlpZiAobmFuZC0+cGFnZTI1NikgeworCQkJCQluYW5kLT5vb2JibG9jayA9IDI1NjsKKwkJCQkJbmFuZC0+b29ic2l6ZSA9IDg7CisJCQkJCW5hbmQtPnBhZ2Vfc2hpZnQgPSA4OworCQkJCX0gZWxzZSB7CisJCQkJCW5hbmQtPm9vYmJsb2NrID0gNTEyOworCQkJCQluYW5kLT5vb2JzaXplID0gMTY7CisJCQkJCW5hbmQtPnBhZ2Vfc2hpZnQgPSA5OworCQkJCX0KKwkJCQluYW5kLT5wYWdlYWRybGVuID0gbmFuZF9mbGFzaF9pZHNbaV0ucGFnZWFkcmxlbjsKKwkJCQluYW5kLT5lcmFzZXNpemUgID0gbmFuZF9mbGFzaF9pZHNbaV0uZXJhc2VzaXplOworCQkJCW5hbmQtPmNoaXBzX25hbWUgPSBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lOworCQkJCW5hbmQtPmJ1czE2CSA9IG5hbmRfZmxhc2hfaWRzW2ldLmJ1czE2OworIAkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisKKyNpZmRlZiBOQU5EX0RFQlVHCisJLyogV2UgaGF2ZW4ndCBmdWxseSBpZGVudGlmaWVkIHRoZSBjaGlwLiBQcmludCBhcyBtdWNoIGFzIHdlIGtub3cuICovCisJcHJpbnRmKCJVbmtub3duIGZsYXNoIGNoaXAgZm91bmQ6ICUyLjJYICUyLjJYXG4iLAorCSAgICAgICBpZCwgbWZyKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qIE5hbkRfU2NhbkNoaXBzOiBGaW5kIGFsbCBOQU5EIGNoaXBzIHByZXNlbnQgaW4gYSBuYW5kX2NoaXAsIGFuZCBpZGVudGlmeSB0aGVtICovCisKK3N0YXRpYyB2b2lkIE5hbkRfU2NhbkNoaXBzKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCit7CisJaW50IGZsb29yLCBjaGlwOworCWludCBudW1jaGlwc1tOQU5EX01BWF9GTE9PUlNdOworCWludCBtYXhjaGlwcyA9IE5BTkRfTUFYX0NISVBTOworCWludCByZXQgPSAxOworCisJbmFuZC0+bnVtY2hpcHMgPSAwOworCW5hbmQtPm1mciA9IDA7CisJbmFuZC0+aWQgPSAwOworCisKKwkvKiBGb3IgZWFjaCBmbG9vciwgZmluZCB0aGUgbnVtYmVyIG9mIHZhbGlkIGNoaXBzIGl0IGNvbnRhaW5zICovCisJZm9yIChmbG9vciA9IDA7IGZsb29yIDwgTkFORF9NQVhfRkxPT1JTOyBmbG9vcisrKSB7CisJCXJldCA9IDE7CisJCW51bWNoaXBzW2Zsb29yXSA9IDA7CisJCWZvciAoY2hpcCA9IDA7IGNoaXAgPCBtYXhjaGlwcyAmJiByZXQgIT0gMDsgY2hpcCsrKSB7CisKKwkJCXJldCA9IE5hbkRfSWRlbnRDaGlwKG5hbmQsIGZsb29yLCBjaGlwKTsKKwkJCWlmIChyZXQpIHsKKwkJCQludW1jaGlwc1tmbG9vcl0rKzsKKwkJCQluYW5kLT5udW1jaGlwcysrOworCQkJfQorCQl9CisJfQorCisJLyogSWYgdGhlcmUgYXJlIG5vbmUgYXQgYWxsIHRoYXQgd2UgcmVjb2duaXNlLCBiYWlsICovCisJaWYgKCFuYW5kLT5udW1jaGlwcykgeworI2lmZGVmIE5BTkRfREVCVUcKKwkJcHV0cyAoIk5vIE5BTkQgZmxhc2ggY2hpcHMgcmVjb2duaXNlZC5cbiIpOworI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjaGlwICovCisJbmFuZC0+Y2hpcHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBOYW5kKSAqIG5hbmQtPm51bWNoaXBzKTsKKwlpZiAoIW5hbmQtPmNoaXBzKSB7CisJCXB1dHMgKCJObyBtZW1vcnkgZm9yIGFsbG9jYXRpbmcgY2hpcCBpbmZvIHN0cnVjdHVyZXNcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gMDsKKworCS8qIEZpbGwgb3V0IHRoZSBjaGlwIGFycmF5IHdpdGgge2Zsb29yLCBjaGlwbm99IGZvciBlYWNoCisJICogZGV0ZWN0ZWQgY2hpcCBpbiB0aGUgZGV2aWNlLiAqLworCWZvciAoZmxvb3IgPSAwOyBmbG9vciA8IE5BTkRfTUFYX0ZMT09SUzsgZmxvb3IrKykgeworCQlmb3IgKGNoaXAgPSAwOyBjaGlwIDwgbnVtY2hpcHNbZmxvb3JdOyBjaGlwKyspIHsKKwkJCW5hbmQtPmNoaXBzW3JldF0uZmxvb3IgPSBmbG9vcjsKKwkJCW5hbmQtPmNoaXBzW3JldF0uY2hpcCA9IGNoaXA7CisJCQluYW5kLT5jaGlwc1tyZXRdLmN1cmFkciA9IDA7CisJCQluYW5kLT5jaGlwc1tyZXRdLmN1cm1vZGUgPSAweDUwOworCQkJcmV0Kys7CisJCX0KKwl9CisKKwkvKiBDYWxjdWxhdGUgYW5kIHByaW50IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBkZXZpY2UgKi8KKwluYW5kLT50b3RsZW4gPSBuYW5kLT5udW1jaGlwcyAqICgxIDw8IG5hbmQtPmNoaXBzaGlmdCk7CisKKyNpZmRlZiBOQU5EX0RFQlVHCisJcHJpbnRmKCIlZCBmbGFzaCBjaGlwcyBmb3VuZC4gVG90YWwgbmFuZF9jaGlwIHNpemU6ICVsZCBNQlxuIiwKKwkgICAgICAgbmFuZC0+bnVtY2hpcHMsIG5hbmQtPnRvdGxlbiA+PiAyMCk7CisjZW5kaWYKK30KKworLyogd2UgbmVlZCB0byBiZSBmYXN0IGhlcmUsIDEgdXMgcGVyIHJlYWQgdHJhbnNsYXRlcyB0byAxIHNlY29uZCBwZXIgbWVnICovCitzdGF0aWMgdm9pZCBOYW5EX1JlYWRCdWYgKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVfY2hhciAqIGRhdGFfYnVmLCBpbnQgY250cikKK3sKKwl1bnNpZ25lZCBsb25nIG5hbmRwdHIgPSBuYW5kLT5JT19BRERSOworCisJTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9SRUFEMCk7CisKKwlpZiAobmFuZC0+YnVzMTYpIHsKKwkJdTE2IHZhbDsKKworCQl3aGlsZSAoY250ciA+PSAxNikgeworCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKKwkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7CisJCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOworCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOworCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKKwkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7CisJCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7CisJCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OworCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKKwkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7CisJCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOworCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOworCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKKwkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7CisJCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7CisJCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OworCQkJdmFsID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gdmFsICYgMHhmZjsKKwkJCSpkYXRhX2J1ZisrID0gdmFsID4+IDg7CisJCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOworCQkJKmRhdGFfYnVmKysgPSB2YWwgJiAweGZmOworCQkJKmRhdGFfYnVmKysgPSB2YWwgPj4gODsKKwkJCWNudHIgLT0gMTY7CisJCX0KKworCQl3aGlsZSAoY250ciA+IDApIHsKKwkJCXZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7CisJCQkqZGF0YV9idWYrKyA9IHZhbCAmIDB4ZmY7CisJCQkqZGF0YV9idWYrKyA9IHZhbCA+PiA4OworCQkJY250ciAtPSAyOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNudHIgPj0gMTYpIHsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCWNudHIgLT0gMTY7CisJCX0KKworCQl3aGlsZSAoY250ciA+IDApIHsKKwkJCSpkYXRhX2J1ZisrID0gUkVBRF9OQU5EIChuYW5kcHRyKTsKKwkJCWNudHItLTsKKwkJfQorCX0KK30KKworLyoKKyAqIE5BTkQgcmVhZCB3aXRoIEVDQworICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9lY2Moc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuLAorCQkgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NfY29kZSkKK3sKKwlpbnQgY29sLCBwYWdlOworCWludCBlY2Nfc3RhdHVzID0gMDsKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDCisJaW50IGo7CisJaW50IGVjY19mYWlsZWQgPSAwOworCXVfY2hhciAqZGF0YV9wb2k7CisJdV9jaGFyIGVjY19jYWxjWzZdOworI2VuZGlmCisKKwkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKChzdGFydCArIGxlbikgPiBuYW5kLT50b3RsZW4pIHsKKwkJcHJpbnRmICgiJXM6IEF0dGVtcHQgcmVhZCBiZXlvbmQgZW5kIG9mIGRldmljZSAleCAleCAleFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHVpbnQpIHN0YXJ0LCAodWludCkgbGVuLCAodWludCkgbmFuZC0+dG90bGVuKTsKKwkJKnJldGxlbiA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIHBhZ2UgKi8KKwkvKnBhZ2UgPSBzaHIoc3RhcnQsIG5hbmQtPnBhZ2Vfc2hpZnQpOyovCisJcGFnZSA9IHN0YXJ0ID4+IG5hbmQtPnBhZ2Vfc2hpZnQ7CisKKwkvKiBHZXQgcmF3IHN0YXJ0aW5nIGNvbHVtbiAqLworCWNvbCA9IHN0YXJ0ICYgKG5hbmQtPm9vYmJsb2NrIC0gMSk7CisKKwkvKiBJbml0aWFsaXplIHJldHVybiB2YWx1ZSAqLworCSpyZXRsZW4gPSAwOworCisJLyogU2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCU5BTkRfRU5BQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBsb3cgKi8KKworCS8qIExvb3AgdW50aWwgYWxsIGRhdGEgcmVhZCAqLworCXdoaWxlICgqcmV0bGVuIDwgbGVuKSB7CisKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDCisJCS8qIERvIHdlIGhhdmUgdGhpcyBwYWdlIGluIGNhY2hlID8gKi8KKwkJaWYgKG5hbmQtPmNhY2hlX3BhZ2UgPT0gcGFnZSkKKwkJCWdvdG8gcmVhZGRhdGE7CisJCS8qIFNlbmQgdGhlIHJlYWQgY29tbWFuZCAqLworCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRDApOworCQlpZiAobmFuZC0+YnVzMTYpIHsKKyAJCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKKwkJCQkgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgKGNvbCA+PiAxKSk7CisJCX0gZWxzZSB7CisgCQkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkJICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIGNvbCk7CisJCX0KKworCQkvKiBSZWFkIGluIGEgcGFnZSArIG9vYiBkYXRhICovCisJCU5hbkRfUmVhZEJ1ZihuYW5kLCBuYW5kLT5kYXRhX2J1ZiwgbmFuZC0+b29iYmxvY2sgKyBuYW5kLT5vb2JzaXplKTsKKworCQkvKiBjb3B5IGRhdGEgaW50byBjYWNoZSwgZm9yIHJlYWQgb3V0IG9mIGNhY2hlIGFuZCBpZiBlY2MgZmFpbHMgKi8KKwkJaWYgKG5hbmQtPmRhdGFfY2FjaGUpIHsKKwkJCW1lbWNweSAobmFuZC0+ZGF0YV9jYWNoZSwgbmFuZC0+ZGF0YV9idWYsCisJCQkJbmFuZC0+b29iYmxvY2sgKyBuYW5kLT5vb2JzaXplKTsKKwkJfQorCisJCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKwkJCWVjY19jb2RlW2pdID0gbmFuZC0+ZGF0YV9idWZbKG5hbmQtPm9vYmJsb2NrICsgb29iX2NvbmZpZy5lY2NfcG9zW2pdKV07CisJCX0KKworCQkvKiBDYWxjdWxhdGUgdGhlIEVDQyBhbmQgdmVyaWZ5IGl0ICovCisJCS8qIElmIGJsb2NrIHdhcyBub3Qgd3JpdHRlbiB3aXRoIEVDQywgc2tpcCBFQ0MgKi8KKwkJaWYgKG9vYl9jb25maWcuZWNjdmFsaWRfcG9zICE9IC0xICYmCisJCSAgICAobmFuZC0+ZGF0YV9idWZbbmFuZC0+b29iYmxvY2sgKyBvb2JfY29uZmlnLmVjY3ZhbGlkX3Bvc10gJiAweDBmKSAhPSAweDBmKSB7CisKKwkJCW5hbmRfY2FsY3VsYXRlX2VjYyAoJm5hbmQtPmRhdGFfYnVmWzBdLCAmZWNjX2NhbGNbMF0pOworCQkJc3dpdGNoIChuYW5kX2NvcnJlY3RfZGF0YSAoJm5hbmQtPmRhdGFfYnVmWzBdLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkpIHsKKwkJCWNhc2UgLTE6CisJCQkJcHJpbnRmICgiJXM6IEZhaWxlZCBFQ0MgcmVhZCwgcGFnZSAweCUwOHhcbiIsIF9fRlVOQ1RJT05fXywgcGFnZSk7CisJCQkJZWNjX2ZhaWxlZCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJY2FzZSAyOgkvKiB0cmFuc2ZlciBFQ0MgY29ycmVjdGVkIGRhdGEgdG8gY2FjaGUgKi8KKwkJCQlpZiAobmFuZC0+ZGF0YV9jYWNoZSkKKwkJCQkJbWVtY3B5IChuYW5kLT5kYXRhX2NhY2hlLCBuYW5kLT5kYXRhX2J1ZiwgMjU2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChvb2JfY29uZmlnLmVjY3ZhbGlkX3BvcyAhPSAtMSAmJgorCQkgICAgbmFuZC0+b29iYmxvY2sgPT0gNTEyICYmIChuYW5kLT5kYXRhX2J1ZltuYW5kLT5vb2JibG9jayArIG9vYl9jb25maWcuZWNjdmFsaWRfcG9zXSAmIDB4ZjApICE9IDB4ZjApIHsKKworCQkJbmFuZF9jYWxjdWxhdGVfZWNjICgmbmFuZC0+ZGF0YV9idWZbMjU2XSwgJmVjY19jYWxjWzNdKTsKKwkJCXN3aXRjaCAobmFuZF9jb3JyZWN0X2RhdGEgKCZuYW5kLT5kYXRhX2J1ZlsyNTZdLCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1szXSkpIHsKKwkJCWNhc2UgLTE6CisJCQkJcHJpbnRmICgiJXM6IEZhaWxlZCBFQ0MgcmVhZCwgcGFnZSAweCUwOHhcbiIsIF9fRlVOQ1RJT05fXywgcGFnZSk7CisJCQkJZWNjX2ZhaWxlZCsrOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJY2FzZSAyOgkvKiB0cmFuc2ZlciBFQ0MgY29ycmVjdGVkIGRhdGEgdG8gY2FjaGUgKi8KKwkJCQlpZiAobmFuZC0+ZGF0YV9jYWNoZSkKKwkJCQkJbWVtY3B5ICgmbmFuZC0+ZGF0YV9jYWNoZVsyNTZdLCAmbmFuZC0+ZGF0YV9idWZbMjU2XSwgMjU2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorcmVhZGRhdGE6CisJCS8qIFJlYWQgdGhlIGRhdGEgZnJvbSBFQ0MgZGF0YSBidWZmZXIgaW50byByZXR1cm4gYnVmZmVyICovCisJCWRhdGFfcG9pID0gKG5hbmQtPmRhdGFfY2FjaGUpID8gbmFuZC0+ZGF0YV9jYWNoZSA6IG5hbmQtPmRhdGFfYnVmOworCQlkYXRhX3BvaSArPSBjb2w7CisJCWlmICgoKnJldGxlbiArIChuYW5kLT5vb2JibG9jayAtIGNvbCkpID49IGxlbikgeworCQkJbWVtY3B5IChidWYgKyAqcmV0bGVuLCBkYXRhX3BvaSwgbGVuIC0gKnJldGxlbik7CisJCQkqcmV0bGVuID0gbGVuOworCQl9IGVsc2UgeworCQkJbWVtY3B5IChidWYgKyAqcmV0bGVuLCBkYXRhX3BvaSwgIG5hbmQtPm9vYmJsb2NrIC0gY29sKTsKKwkJCSpyZXRsZW4gKz0gbmFuZC0+b29iYmxvY2sgLSBjb2w7CisJCX0KKwkJLyogU2V0IGNhY2hlIHBhZ2UgYWRkcmVzcywgaW52YWxpZGF0ZSwgaWYgZWNjX2ZhaWxlZCAqLworCQluYW5kLT5jYWNoZV9wYWdlID0gKG5hbmQtPmRhdGFfY2FjaGUgJiYgIWVjY19mYWlsZWQpID8gcGFnZSA6IC0xOworCisJCWVjY19zdGF0dXMgKz0gZWNjX2ZhaWxlZDsKKwkJZWNjX2ZhaWxlZCA9IDA7CisKKyNlbHNlCisJCS8qIFNlbmQgdGhlIHJlYWQgY29tbWFuZCAqLworCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRDApOworCQlpZiAobmFuZC0+YnVzMTYpIHsKKwkJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAorCQkJCSAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyAoY29sID4+IDEpKTsKKwkJfSBlbHNlIHsKKwkJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAorCQkJCSAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyBjb2wpOworCQl9CisKKwkJLyogUmVhZCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSByZXR1cm4gYnVmZmVyICovCisJCWlmICgoKnJldGxlbiArIChuYW5kLT5vb2JibG9jayAtIGNvbCkpID49IGxlbikgeworCQkJTmFuRF9SZWFkQnVmKG5hbmQsIGJ1ZiArICpyZXRsZW4sIGxlbiAtICpyZXRsZW4pOworCQkJKnJldGxlbiA9IGxlbjsKKwkJCS8qIFdlJ3JlIGRvbmUgKi8KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJTmFuRF9SZWFkQnVmKG5hbmQsIGJ1ZiArICpyZXRsZW4sIG5hbmQtPm9vYmJsb2NrIC0gY29sKTsKKwkJCSpyZXRsZW4gKz0gbmFuZC0+b29iYmxvY2sgLSBjb2w7CisJCQl9CisjZW5kaWYKKwkJLyogRm9yIHN1YnNlcXVlbnQgcmVhZHMgYWxpZ24gdG8gcGFnZSBib3VuZGFyeS4gKi8KKwkJY29sID0gMDsKKwkJLyogSW5jcmVtZW50IHBhZ2UgYWRkcmVzcyAqLworCQlwYWdlKys7CisJfQorCisJLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLworCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisJLyoKKwkgKiBSZXR1cm4gc3VjY2VzcywgaWYgbm8gRUNDIGZhaWx1cmVzLCBlbHNlIC1FSU8KKwkgKiBmcyBkcml2ZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhhdCwgYmVjYXVzZQorCSAqIHJldGxlbiA9PSBkZXNpcmVkIGxlbiBhbmQgcmVzdWx0ID09IC1FSU8KKwkgKi8KKwlyZXR1cm4gZWNjX3N0YXR1cyA/IC0xIDogMDsKK30KKworLyoKKyAqCU5hbmRfcGFnZV9wcm9ncmFtIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHdyaXRlIGFuZCB3cml0ZXYgIQorICovCitzdGF0aWMgaW50IG5hbmRfd3JpdGVfcGFnZSAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwKKwkJCSAgICBpbnQgcGFnZSwgaW50IGNvbCwgaW50IGxhc3QsIHVfY2hhciAqIGVjY19jb2RlKQoreworCisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBuYW5kcHRyID0gbmFuZC0+SU9fQUREUjsKKworI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFCisJaW50IGVjY19ieXRlcyA9IChuYW5kLT5vb2JibG9jayA9PSA1MTIpID8gNiA6IDM7CisjZW5kaWYKKyNlbmRpZgorCS8qIHBhZCBvb2IgYXJlYSAqLworCWZvciAoaSA9IG5hbmQtPm9vYmJsb2NrOyBpIDwgbmFuZC0+b29iYmxvY2sgKyBuYW5kLT5vb2JzaXplOyBpKyspCisJCW5hbmQtPmRhdGFfYnVmW2ldID0gMHhmZjsKKworI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKKwkvKiBaZXJvIG91dCB0aGUgRUNDIGFycmF5ICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZWNjX2NvZGVbaV0gPSAweDAwOworCisJLyogUmVhZCBiYWNrIHByZXZpb3VzIHdyaXR0ZW4gZGF0YSwgaWYgY29sID4gMCAqLworCWlmIChjb2wpIHsKKwkJTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9SRUFEMCk7CisJCWlmIChuYW5kLT5idXMxNikgeworCQkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAorCQkJCSAgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgKGNvbCA+PiAxKSk7CisJCX0gZWxzZSB7CisJCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkJICAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyBjb2wpOworCQl9CisKKwkJaWYgKG5hbmQtPmJ1czE2KSB7CisJCQl1MTYgdmFsOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY29sOyBpICs9IDIpIHsKKwkJCQl2YWwgPSBSRUFEX05BTkQgKG5hbmRwdHIpOworCQkJCW5hbmQtPmRhdGFfYnVmW2ldID0gdmFsICYgMHhmZjsKKwkJCQluYW5kLT5kYXRhX2J1ZltpICsgMV0gPSB2YWwgPj4gODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb2w7IGkrKykKKwkJCQluYW5kLT5kYXRhX2J1ZltpXSA9IFJFQURfTkFORCAobmFuZHB0cik7CisJCX0KKwl9CisKKwkvKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBFQ0MgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSAqLworCWlmICgoY29sIDwgbmFuZC0+ZWNjc2l6ZSkgJiYgKGxhc3QgPj0gbmFuZC0+ZWNjc2l6ZSkpIHsKKwkJbmFuZF9jYWxjdWxhdGVfZWNjICgmbmFuZC0+ZGF0YV9idWZbMF0sICYoZWNjX2NvZGVbMF0pKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJbmFuZC0+ZGF0YV9idWZbKG5hbmQtPm9vYmJsb2NrICsKKwkJCQkJb29iX2NvbmZpZy5lY2NfcG9zW2ldKV0gPSBlY2NfY29kZVtpXTsKKwkJfQorCQlpZiAob29iX2NvbmZpZy5lY2N2YWxpZF9wb3MgIT0gLTEpIHsKKwkJCW5hbmQtPmRhdGFfYnVmW25hbmQtPm9vYmJsb2NrICsKKwkJCQkgICAgICAgb29iX2NvbmZpZy5lY2N2YWxpZF9wb3NdID0gMHhmMDsKKwkJfQorCX0KKworCS8qIENhbGN1bGF0ZSBhbmQgd3JpdGUgdGhlIHNlY29uZCBFQ0MgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSAqLworCWlmICgobmFuZC0+b29iYmxvY2sgPT0gNTEyKSAmJiAobGFzdCA9PSBuYW5kLT5vb2JibG9jaykpIHsKKwkJbmFuZF9jYWxjdWxhdGVfZWNjICgmbmFuZC0+ZGF0YV9idWZbMjU2XSwgJihlY2NfY29kZVszXSkpOworCQlmb3IgKGkgPSAzOyBpIDwgNjsgaSsrKSB7CisJCQluYW5kLT5kYXRhX2J1ZlsobmFuZC0+b29iYmxvY2sgKworCQkJCQlvb2JfY29uZmlnLmVjY19wb3NbaV0pXSA9IGVjY19jb2RlW2ldOworCQl9CisJCWlmIChvb2JfY29uZmlnLmVjY3ZhbGlkX3BvcyAhPSAtMSkgeworCQkJbmFuZC0+ZGF0YV9idWZbbmFuZC0+b29iYmxvY2sgKworCQkJCSAgICAgICBvb2JfY29uZmlnLmVjY3ZhbGlkX3Bvc10gJj0gMHgwZjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIFByZXBhZCBmb3IgcGFydGlhbCBwYWdlIHByb2dyYW1taW5nICEhISAqLworCWZvciAoaSA9IDA7IGkgPCBjb2w7IGkrKykKKwkJbmFuZC0+ZGF0YV9idWZbaV0gPSAweGZmOworCisJLyogUG9zdHBhZCBmb3IgcGFydGlhbCBwYWdlIHByb2dyYW1taW5nICEhISBvb2IgaXMgYWxyZWFkeSBwYWRkZWQgKi8KKwlmb3IgKGkgPSBsYXN0OyBpIDwgbmFuZC0+b29iYmxvY2s7IGkrKykKKwkJbmFuZC0+ZGF0YV9idWZbaV0gPSAweGZmOworCisJLyogU2VuZCBjb21tYW5kIHRvIGJlZ2luIGF1dG8gcGFnZSBwcm9ncmFtbWluZyAqLworCU5hbkRfQ29tbWFuZCAobmFuZCwgTkFORF9DTURfUkVBRDApOworCU5hbkRfQ29tbWFuZCAobmFuZCwgTkFORF9DTURfU0VRSU4pOworCWlmIChuYW5kLT5idXMxNikgeworCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIChjb2wgPj4gMSkpOworCX0gZWxzZSB7CisJCU5hbkRfQWRkcmVzcyAobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKKwkJCSAgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgY29sKTsKKwl9CisKKwkvKiBXcml0ZSBvdXQgY29tcGxldGUgcGFnZSBvZiBkYXRhICovCisJaWYgKG5hbmQtPmJ1czE2KSB7CisJCWZvciAoaSA9IDA7IGkgPCAobmFuZC0+b29iYmxvY2sgKyBuYW5kLT5vb2JzaXplKTsgaSArPSAyKSB7CisJCQlXUklURV9OQU5EIChuYW5kLT5kYXRhX2J1ZltpXSArCisJCQkJICAgIChuYW5kLT5kYXRhX2J1ZltpICsgMV0gPDwgOCksCisJCQkJICAgIG5hbmQtPklPX0FERFIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IChuYW5kLT5vb2JibG9jayArIG5hbmQtPm9vYnNpemUpOyBpKyspCisJCQlXUklURV9OQU5EIChuYW5kLT5kYXRhX2J1ZltpXSwgbmFuZC0+SU9fQUREUik7CisJfQorCisJLyogU2VuZCBjb21tYW5kIHRvIGFjdHVhbGx5IHByb2dyYW0gdGhlIGRhdGEgKi8KKwlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1BBR0VQUk9HKTsKKwlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1NUQVRVUyk7CisjaWZkZWYgTkFORF9OT19SQgorCXsKKwkJdV9jaGFyIHJldF92YWw7CisKKwkJZG8geworCQkJcmV0X3ZhbCA9IFJFQURfTkFORCAobmFuZHB0cik7CS8qIHdhaXQgdGlsbCByZWFkeSAqLworCQl9IHdoaWxlICgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworCX0KKyNlbmRpZgorCS8qIFNlZSBpZiBkZXZpY2UgdGhpbmtzIGl0IHN1Y2NlZWRlZCAqLworCWlmIChSRUFEX05BTkQgKG5hbmQtPklPX0FERFIpICYgMHgwMSkgeworCQlwcmludGYgKCIlczogRmFpbGVkIHdyaXRlLCBwYWdlIDB4JTA4eCwgIiwgX19GVU5DVElPTl9fLAorCQkJcGFnZSk7CisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURQorCS8qCisJICogVGhlIE5BTkQgZGV2aWNlIGFzc3VtZXMgdGhhdCBpdCBpcyBhbHdheXMgd3JpdGluZyB0bworCSAqIGEgY2xlYW5seSBlcmFzZWQgcGFnZS4gSGVuY2UsIGl0IHBlcmZvcm1zIGl0cyBpbnRlcm5hbAorCSAqIHdyaXRlIHZlcmlmaWNhdGlvbiBvbmx5IG9uIGJpdHMgdGhhdCB0cmFuc2l0aW9uZWQgZnJvbQorCSAqIDEgdG8gMC4gVGhlIGRldmljZSBkb2VzIE5PVCB2ZXJpZnkgdGhlIHdob2xlIHBhZ2Ugb24gYQorCSAqIGJ5dGUgYnkgYnl0ZSBiYXNpcy4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcGFnZSB3YXMKKwkgKiBub3QgY29tcGxldGVseSBlcmFzZWQgb3IgdGhlIHBhZ2UgaXMgYmVjb21pbmcgdW51c2FibGUKKwkgKiBkdWUgdG8gd2Vhci4gVGhlIHJlYWQgd2l0aCBFQ0Mgd291bGQgY2F0Y2ggdGhlIGVycm9yCisJICogbGF0ZXIgd2hlbiB0aGUgRUNDIHBhZ2UgY2hlY2sgZmFpbHMsIGJ1dCB3ZSB3b3VsZCByYXRoZXIKKwkgKiBjYXRjaCBpdCBlYXJseSBpbiB0aGUgcGFnZSB3cml0ZSBzdGFnZS4gQmV0dGVyIHRvIHdyaXRlCisJICogbm8gZGF0YSB0aGFuIGludmFsaWQgZGF0YS4KKwkgKi8KKworCS8qIFNlbmQgY29tbWFuZCB0byByZWFkIGJhY2sgdGhlIHBhZ2UgKi8KKwlpZiAoY29sIDwgbmFuZC0+ZWNjc2l6ZSkKKwkJTmFuRF9Db21tYW5kIChuYW5kLCBOQU5EX0NNRF9SRUFEMCk7CisJZWxzZQorCQlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1JFQUQxKTsKKwlpZiAobmFuZC0+YnVzMTYpIHsKKwkJTmFuRF9BZGRyZXNzIChuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAorCQkJICAgICAgKHBhZ2UgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKyAoY29sID4+IDEpKTsKKwl9IGVsc2UgeworCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIGNvbCk7CisJfQorCisJLyogTG9vcCB0aHJvdWdoIGFuZCB2ZXJpZnkgdGhlIGRhdGEgKi8KKwlpZiAobmFuZC0+YnVzMTYpIHsKKwkJZm9yIChpID0gY29sOyBpIDwgbGFzdDsgaSA9ICsyKSB7CisJCQlpZiAoKG5hbmQtPmRhdGFfYnVmW2ldICsKKwkJCSAgICAgKG5hbmQtPmRhdGFfYnVmW2kgKyAxXSA8PCA4KSkgIT0gUkVBRF9OQU5EIChuYW5kLT5JT19BRERSKSkgeworCQkJCXByaW50ZiAoIiVzOiBGYWlsZWQgd3JpdGUgdmVyaWZ5LCBwYWdlIDB4JTA4eCAiLAorCQkJCQlfX0ZVTkNUSU9OX18sIHBhZ2UpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IGNvbDsgaSA8IGxhc3Q7IGkrKykgeworCQkJaWYgKG5hbmQtPmRhdGFfYnVmW2ldICE9IFJFQURfTkFORCAobmFuZC0+SU9fQUREUikpIHsKKwkJCQlwcmludGYgKCIlczogRmFpbGVkIHdyaXRlIHZlcmlmeSwgcGFnZSAweCUwOHggIiwKKwkJCQkJX19GVU5DVElPTl9fLCBwYWdlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDCisJLyoKKwkgKiBXZSBhbHNvIHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgRUNDIGJ5dGVzIHdyb3RlCisJICogY29ycmVjdGx5IGZvciB0aGUgc2FtZSByZWFzb25zIHN0YXRlZCBhYm92ZS4KKwkgKi8KKwlOYW5EX0NvbW1hbmQgKG5hbmQsIE5BTkRfQ01EX1JFQURPT0IpOworCWlmIChuYW5kLT5idXMxNikgeworCQlOYW5EX0FkZHJlc3MgKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkgICAgICAocGFnZSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArIChjb2wgPj4gMSkpOworCX0gZWxzZSB7CisJCU5hbkRfQWRkcmVzcyAobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKKwkJCSAgICAgIChwYWdlIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsgY29sKTsKKwl9CisJaWYgKG5hbmQtPmJ1czE2KSB7CisJCWZvciAoaSA9IDA7IGkgPCBuYW5kLT5vb2JzaXplOyBpICs9IDIpIHsKKwkJCXUxNiB2YWw7CisKKwkJCXZhbCA9IFJFQURfTkFORCAobmFuZC0+SU9fQUREUik7CisJCQluYW5kLT5kYXRhX2J1ZltpXSA9IHZhbCAmIDB4ZmY7CisJCQluYW5kLT5kYXRhX2J1ZltpICsgMV0gPSB2YWwgPj4gODsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBuYW5kLT5vb2JzaXplOyBpKyspIHsKKwkJCW5hbmQtPmRhdGFfYnVmW2ldID0gUkVBRF9OQU5EIChuYW5kLT5JT19BRERSKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgZWNjX2J5dGVzOyBpKyspIHsKKwkJaWYgKChuYW5kLT5kYXRhX2J1Zlsob29iX2NvbmZpZy5lY2NfcG9zW2ldKV0gIT0gZWNjX2NvZGVbaV0pICYmIGVjY19jb2RlW2ldKSB7CisJCQlwcmludGYgKCIlczogRmFpbGVkIEVDQyB3cml0ZSAiCisJCQkJInZlcmlmeSwgcGFnZSAweCUwOHgsICIKKwkJCQkiJTZpIGJ5dGVzIHdlcmUgc3VjY2VzZnVsXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcGFnZSwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisjZW5kaWYJLyogQ09ORklHX01URF9OQU5EX0VDQyAqLworI2VuZGlmCS8qIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYW5kX3dyaXRlX2VjYyAoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgc2l6ZV90IHRvLCBzaXplX3QgbGVuLAorCQkJICAgc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIGVjY19jb2RlKQoreworCWludCBpLCBwYWdlLCBjb2wsIGNudCwgcmV0ID0gMDsKKworCS8qIERvIG5vdCBhbGxvdyB3cml0ZSBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KKwlpZiAoKHRvICsgbGVuKSA+IG5hbmQtPnRvdGxlbikgeworCQlwcmludGYgKCIlczogQXR0ZW1wdCB0byB3cml0ZSBwYXN0IGVuZCBvZiBwYWdlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2hpZnQgdG8gZ2V0IHBhZ2UgKi8KKwlwYWdlID0gKChpbnQpIHRvKSA+PiBuYW5kLT5wYWdlX3NoaWZ0OworCisJLyogR2V0IHRoZSBzdGFydGluZyBjb2x1bW4gKi8KKwljb2wgPSB0byAmIChuYW5kLT5vb2JibG9jayAtIDEpOworCisJLyogSW5pdGlhbGl6ZSByZXR1cm4gbGVuZ3RoIHZhbHVlICovCisJKnJldGxlbiA9IDA7CisKKwkvKiBTZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJYXJjaGZsYXNod3AoMCwwKTsKKyNlbmRpZgorI2lmZGVmIENGR19OQU5EX1dQCisJTkFORF9XUF9PRkYoKTsKKyNlbmRpZgorCisgICAgCU5BTkRfRU5BQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBsb3cgKi8KKworCS8qIENoZWNrIHRoZSBXUCBiaXQgKi8KKwlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKKwlpZiAoIShSRUFEX05BTkQobmFuZC0+SU9fQUREUikgJiAweDgwKSkgeworCQlwcmludGYgKCIlczogRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCEhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIExvb3AgdW50aWwgYWxsIGRhdGEgaXMgd3JpdHRlbiAqLworCXdoaWxlICgqcmV0bGVuIDwgbGVuKSB7CisJCS8qIEludmFsaWRhdGUgY2FjaGUsIGlmIHdlIHdyaXRlIHRvIHRoaXMgcGFnZSAqLworCQlpZiAobmFuZC0+Y2FjaGVfcGFnZSA9PSBwYWdlKQorCQkJbmFuZC0+Y2FjaGVfcGFnZSA9IC0xOworCisJCS8qIFdyaXRlIGRhdGEgaW50byBidWZmZXIgKi8KKwkJaWYgKChjb2wgKyBsZW4pID49IG5hbmQtPm9vYmJsb2NrKSB7CisJCQlmb3IgKGkgPSBjb2wsIGNudCA9IDA7IGkgPCBuYW5kLT5vb2JibG9jazsgaSsrLCBjbnQrKykgeworCQkJCW5hbmQtPmRhdGFfYnVmW2ldID0gYnVmWygqcmV0bGVuICsgY250KV07CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSBjb2wsIGNudCA9IDA7IGNudCA8IChsZW4gLSAqcmV0bGVuKTsgaSsrLCBjbnQrKykgeworCQkJCW5hbmQtPmRhdGFfYnVmW2ldID0gYnVmWygqcmV0bGVuICsgY250KV07CisJCQl9CisJCX0KKwkJLyogV2UgdXNlIHRoZSBzYW1lIGZ1bmN0aW9uIGZvciB3cml0ZSBhbmQgd3JpdGV2ICEpICovCisJCXJldCA9IG5hbmRfd3JpdGVfcGFnZSAobmFuZCwgcGFnZSwgY29sLCBpLCBlY2NfY29kZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQkvKiBOZXh0IGRhdGEgc3RhcnQgYXQgcGFnZSBib3VuZGFyeSAqLworCQljb2wgPSAwOworCisJCS8qIFVwZGF0ZSB3cml0dGVuIGJ5dGVzIGNvdW50ICovCisJCSpyZXRsZW4gKz0gY250OworCisJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgKi8KKwkJcGFnZSsrOworCX0KKworCS8qIFJldHVybiBoYXBweSAqLworCSpyZXRsZW4gPSBsZW47CisKK291dDoKKwkvKiBEZS1zZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisgICAgCWFyY2hmbGFzaHdwKDAsMSk7CisjZW5kaWYKKyNpZmRlZiBDRkdfTkFORF9XUAorCU5BTkRfV1BfT04oKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgYnl0ZQorICogcGFnZSBvciAyIDI1Ni1ieXRlIHBhZ2VzLgorICovCitpbnQgbmFuZF9yZWFkX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAorCQkJIHNpemVfdCAqIHJldGxlbiwgdV9jaGFyICogYnVmKQoreworCWludCBsZW4yNTYgPSAwOworCXN0cnVjdCBOYW5kICpteWNoaXA7CisJaW50IHJldCA9IDA7CisKKwlteWNoaXAgPSAmbmFuZC0+Y2hpcHNbb2ZzID4+IG5hbmQtPmNoaXBzaGlmdF07CisKKwkvKiB1cGRhdGUgYWRkcmVzcyBmb3IgMk0geCA4Yml0IGRldmljZXMuIE9PQiBzdGFydHMgb24gdGhlIHNlY29uZCAqLworCS8qIHBhZ2UgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG5hbmRfcmVhZF9lY2MuICovCisJaWYgKG5hbmQtPnBhZ2UyNTYpIHsKKwkJaWYgKCEob2ZzICYgMHg4KSkKKwkJCW9mcyArPSAweDEwMDsKKwkJZWxzZQorCQkJb2ZzIC09IDB4ODsKKwl9CisKKwlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1JFQURPT0IpOworCWlmIChuYW5kLT5idXMxNikgeworIAkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsCisJCQkgICAgICgob2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQpIDw8IG5hbmQtPnBhZ2Vfc2hpZnQpICsKKyAJCQkJKChvZnMgJiAobmFuZC0+b29iYmxvY2sgLSAxKSkgPj4gMSkpOworCX0gZWxzZSB7CisJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLCBvZnMpOworCX0KKworCS8qIHRyZWF0IGNyb3NzaW5nIDgtYnl0ZSBPT0IgZGF0YSBmb3IgMk0geCA4Yml0IGRldmljZXMgKi8KKwkvKiBOb3RlOiBkYXRhc2hlZXQgc2F5cyBpdCBzaG91bGQgYXV0b21hdGljYWx5IHdyYXAgdG8gdGhlICovCisJLyogICAgICAgbmV4dCBPT0IgYmxvY2ssIGJ1dCBpdCBkaWRuJ3Qgd29yayBoZXJlLiBtZi4gICAgICAqLworCWlmIChuYW5kLT5wYWdlMjU2ICYmIG9mcyArIGxlbiA+IChvZnMgfCAweDcpICsgMSkgeworCQlsZW4yNTYgPSAob2ZzIHwgMHg3KSArIDEgLSBvZnM7CisJCU5hbkRfUmVhZEJ1ZihuYW5kLCBidWYsIGxlbjI1Nik7CisKKwkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1JFQURPT0IpOworCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwgb2ZzICYgKH4weDFmZikpOworCX0KKworCU5hbkRfUmVhZEJ1ZihuYW5kLCAmYnVmW2xlbjI1Nl0sIGxlbiAtIGxlbjI1Nik7CisKKwkqcmV0bGVuID0gbGVuOworCS8qIFJlYWRpbmcgdGhlIGZ1bGwgT09CIGRhdGEgZHJvcHMgdXMgb2ZmIG9mIHRoZSBlbmQgb2YgdGhlIHBhZ2UsCisJICogY2F1c2luZyB0aGUgZmxhc2ggZGV2aWNlIHRvIGdvIGludG8gYnVzeSBtb2RlLCBzbyB3ZSBuZWVkCisJICogdG8gd2FpdCB1bnRpbCByZWFkeSAxMS40LjEgYW5kIFRvc2hpYmEgVEM1ODI1NkZUIG5hbmRzICovCisKKwlyZXQgPSBOYW5EX1dhaXRSZWFkeShuYW5kLCAxKTsKKwlOQU5EX0RJU0FCTEVfQ0UobmFuZCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCXJldHVybiByZXQ7CisKK30KKworLyogd3JpdGUgdG8gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiBieXRlCisgKiBwYWdlIG9yIDIgMjU2LWJ5dGUgcGFnZXMuCisgKi8KK2ludCBuYW5kX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwKiBuYW5kLCBzaXplX3Qgb2ZzLCBzaXplX3QgbGVuLAorCQkgIHNpemVfdCAqIHJldGxlbiwgY29uc3QgdV9jaGFyICogYnVmKQoreworCWludCBsZW4yNTYgPSAwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbmFuZHB0ciA9IG5hbmQtPklPX0FERFI7CisKKyNpZmRlZiBQU1lDSE9fREVCVUcKKwlwcmludGYoIm5hbmRfd3JpdGVfb29iKCVseCwgJWQpOiAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAuLi4gJTIuMlggJTIuMlggLi4gJTIuMlggJTIuMlhcbiIsCisJICAgICAgIChsb25nKW9mcywgbGVuLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJICAgICAgIGJ1Zls4XSwgYnVmWzldLCBidWZbMTRdLGJ1ZlsxNV0pOworI2VuZGlmCisKKwlOQU5EX0VOQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gbG93IHRvIGVuYWJsZSBjaGlwICovCisKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9SRVNFVCk7CisKKwkvKiBpc3N1ZSB0aGUgUmVhZDIgY29tbWFuZCB0byBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIFNwYXJlIERhdGEgQXJlYS4gKi8KKwlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfUkVBRE9PQik7CisJaWYgKG5hbmQtPmJ1czE2KSB7CisgCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwKKwkJCSAgICAgKChvZnMgPj4gbmFuZC0+cGFnZV9zaGlmdCkgPDwgbmFuZC0+cGFnZV9zaGlmdCkgKworIAkJCQkoKG9mcyAmIChuYW5kLT5vb2JibG9jayAtIDEpKSA+PiAxKSk7CisJfSBlbHNlIHsKKyAJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLCBvZnMpOworCX0KKworCS8qIHVwZGF0ZSBhZGRyZXNzIGZvciAyTSB4IDhiaXQgZGV2aWNlcy4gT09CIHN0YXJ0cyBvbiB0aGUgc2Vjb25kICovCisJLyogcGFnZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbmFuZF9yZWFkX2VjYy4gKi8KKwlpZiAobmFuZC0+cGFnZTI1NikgeworCQlpZiAoIShvZnMgJiAweDgpKQorCQkJb2ZzICs9IDB4MTAwOworCQllbHNlCisJCQlvZnMgLT0gMHg4OworCX0KKworCS8qIGlzc3VlIHRoZSBTZXJpYWwgRGF0YSBJbiBjb21tYW5kIHRvIGluaXRpYWwgdGhlIFBhZ2UgUHJvZ3JhbSBwcm9jZXNzICovCisJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1NFUUlOKTsKKwlpZiAobmFuZC0+YnVzMTYpIHsKKyAJCU5hbkRfQWRkcmVzcyhuYW5kLCBBRERSX0NPTFVNTl9QQUdFLAorCQkJICAgICAoKG9mcyA+PiBuYW5kLT5wYWdlX3NoaWZ0KSA8PCBuYW5kLT5wYWdlX3NoaWZ0KSArCisgCQkJCSgob2ZzICYgKG5hbmQtPm9vYmJsb2NrIC0gMSkpID4+IDEpKTsKKwl9IGVsc2UgeworIAkJTmFuRF9BZGRyZXNzKG5hbmQsIEFERFJfQ09MVU1OX1BBR0UsIG9mcyk7CisJfQorCisJLyogdHJlYXQgY3Jvc3NpbmcgOC1ieXRlIE9PQiBkYXRhIGZvciAyTSB4IDhiaXQgZGV2aWNlcyAqLworCS8qIE5vdGU6IGRhdGFzaGVldCBzYXlzIGl0IHNob3VsZCBhdXRvbWF0aWNhbHkgd3JhcCB0byB0aGUgKi8KKwkvKiAgICAgICBuZXh0IE9PQiBibG9jaywgYnV0IGl0IGRpZG4ndCB3b3JrIGhlcmUuIG1mLiAgICAgICovCisJaWYgKG5hbmQtPnBhZ2UyNTYgJiYgb2ZzICsgbGVuID4gKG9mcyB8IDB4NykgKyAxKSB7CisJCWxlbjI1NiA9IChvZnMgfCAweDcpICsgMSAtIG9mczsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjI1NjsgaSsrKQorCQkJV1JJVEVfTkFORChidWZbaV0sIG5hbmRwdHIpOworCisJCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9QQUdFUFJPRyk7CisJCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOworI2lmZGVmIE5BTkRfTk9fUkIKKyAgIAkJeyB1X2NoYXIgcmV0X3ZhbDsKKwkJCWRvIHsKKwkJCQlyZXRfdmFsID0gUkVBRF9OQU5EKG5hbmRwdHIpOyAvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKwkJCX0gd2hpbGUgKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisJCX0KKyNlbmRpZgorCQlpZiAoUkVBRF9OQU5EKG5hbmRwdHIpICYgMSkgeworCQkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIG9vYiBkYXRhXG4iKTsKKwkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvciAqLworCQkJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCisJCQkqcmV0bGVuID0gMDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU0VRSU4pOworCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9DT0xVTU5fUEFHRSwgb2ZzICYgKH4weDFmZikpOworCX0KKworCWlmIChuYW5kLT5idXMxNikgeworCQlmb3IgKGkgPSBsZW4yNTY7IGkgPCBsZW47IGkgKz0gMikgeworCQkJV1JJVEVfTkFORChidWZbaV0gKyAoYnVmW2krMV0gPDwgOCksIG5hbmRwdHIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gbGVuMjU2OyBpIDwgbGVuOyBpKyspCisJCQlXUklURV9OQU5EKGJ1ZltpXSwgbmFuZHB0cik7CisJfQorCisJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1BBR0VQUk9HKTsKKwlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKKyNpZmRlZiBOQU5EX05PX1JCCisJewl1X2NoYXIgcmV0X3ZhbDsKKwkJZG8geworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChuYW5kcHRyKTsgLyogd2FpdCB0aWxsIHJlYWR5ICovCisJCX0gd2hpbGUgKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisJfQorI2VuZGlmCisJaWYgKFJFQURfTkFORChuYW5kcHRyKSAmIDEpIHsKKwkJcHV0cyAoIkVycm9yIHByb2dyYW1taW5nIG9vYiBkYXRhXG4iKTsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisJCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCQkqcmV0bGVuID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCU5BTkRfRElTQUJMRV9DRShuYW5kKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7CisKK30KKworaW50IG5hbmRfbGVnYWN5X2VyYXNlKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCBvZnMsIHNpemVfdCBsZW4sIGludCBjbGVhbikKK3sKKwkvKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgc28gaXQgd2lsbCB3b3JrIG9uIGFueSBzeXN0ZW0KKwkgKiB1c2luZyBuYXRpdmUgZW5kaWFuIGpmZnMyICh0aGUgZGVmYXVsdCkuCisJICovCisJc3RhdGljIHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgY2xlYW5fbWFya2VyID0geworCQlKRkZTMl9NQUdJQ19CSVRNQVNLLAorCQlKRkZTMl9OT0RFVFlQRV9DTEVBTk1BUktFUiwKKwkJOAkJLyogOCBieXRlcyBpbiB0aGlzIG5vZGUgKi8KKwl9OworCXVuc2lnbmVkIGxvbmcgbmFuZHB0cjsKKwlzdHJ1Y3QgTmFuZCAqbXljaGlwOworCWludCByZXQgPSAwOworCisJaWYgKG9mcyAmIChuYW5kLT5lcmFzZXNpemUtMSkgfHwgbGVuICYgKG5hbmQtPmVyYXNlc2l6ZS0xKSkgeworCQlwcmludGYgKCJPZmZzZXQgYW5kIHNpemUgbXVzdCBiZSBzZWN0b3IgYWxpZ25lZCwgZXJhc2VzaXplID0gJWRcbiIsCisJCQkoaW50KSBuYW5kLT5lcmFzZXNpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJbmFuZHB0ciA9IG5hbmQtPklPX0FERFI7CisKKwkvKiBTZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJYXJjaGZsYXNod3AoMCwwKTsKKyNlbmRpZgorI2lmZGVmIENGR19OQU5EX1dQCisJTkFORF9XUF9PRkYoKTsKKyNlbmRpZgorICAgIE5BTkRfRU5BQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBsb3cgKi8KKworCS8qIENoZWNrIHRoZSBXUCBiaXQgKi8KKwlOYW5EX0NvbW1hbmQobmFuZCwgTkFORF9DTURfU1RBVFVTKTsKKwlpZiAoIShSRUFEX05BTkQobmFuZC0+SU9fQUREUikgJiAweDgwKSkgeworCQlwcmludGYgKCJuYW5kX3dyaXRlX2VjYzogRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCEhIVxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayB0aGUgV1AgYml0ICovCisJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX1NUQVRVUyk7CisJaWYgKCEoUkVBRF9OQU5EKG5hbmQtPklPX0FERFIpICYgMHg4MCkpIHsKKwkJcHJpbnRmICgiJXM6IERldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGSVhNRTogRG8gbmFuZCBpbiB0aGUgYmFja2dyb3VuZC4gVXNlIHRpbWVycyBvciBzY2hlZHVsZV90YXNrKCkgKi8KKwl3aGlsZShsZW4pIHsKKwkJLypteWNoaXAgPSAmbmFuZC0+Y2hpcHNbc2hyKG9mcywgbmFuZC0+Y2hpcHNoaWZ0KV07Ki8KKwkJbXljaGlwID0gJm5hbmQtPmNoaXBzW29mcyA+PiBuYW5kLT5jaGlwc2hpZnRdOworCisJCS8qIGFsd2F5cyBjaGVjayBmb3IgYmFkIGJsb2NrIGZpcnN0LCBnZW51aW5lIGJhZCBibG9ja3MKKwkJICogc2hvdWxkIF9uZXZlcl8gIGJlIGVyYXNlZC4KKwkJICovCisJCWlmIChBTExPV19FUkFTRV9CQURfREVCVUcgfHwgIWNoZWNrX2Jsb2NrKG5hbmQsIG9mcykpIHsKKwkJCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KKwkJCU5BTkRfRU5BQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBsb3cgKi8KKworCQkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX0VSQVNFMSk7CisJCQlOYW5EX0FkZHJlc3MobmFuZCwgQUREUl9QQUdFLCBvZnMpOworCQkJTmFuRF9Db21tYW5kKG5hbmQsIE5BTkRfQ01EX0VSQVNFMik7CisKKwkJCU5hbkRfQ29tbWFuZChuYW5kLCBOQU5EX0NNRF9TVEFUVVMpOworCisjaWZkZWYgTkFORF9OT19SQgorCQkJewl1X2NoYXIgcmV0X3ZhbDsKKwkJCQlkbyB7CisJCQkJCXJldF92YWwgPSBSRUFEX05BTkQobmFuZHB0cik7IC8qIHdhaXQgdGlsbCByZWFkeSAqLworCQkJCX0gd2hpbGUgKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChSRUFEX05BTkQobmFuZHB0cikgJiAxKSB7CisJCQkJcHJpbnRmICgiJXM6IEVycm9yIGVyYXNpbmcgYXQgMHglbHhcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgKGxvbmcpb2ZzKTsKKwkJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IgKi8KKwkJCQlyZXQgPSAtMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChjbGVhbikgeworCQkJCWludCBuOwkvKiByZXR1cm4gdmFsdWUgbm90IHVzZWQgKi8KKwkJCQlpbnQgcCwgbDsKKworCQkJCS8qIGNsZWFuIG1hcmtlciBwb3NpdGlvbiBhbmQgc2l6ZSBkZXBlbmQKKwkJCQkgKiBvbiB0aGUgcGFnZSBzaXplLCBzaW5jZSAyNTYgYnl0ZSBwYWdlcworCQkJCSAqIG9ubHkgaGF2ZSA4IGJ5dGVzIG9mIG9vYiBkYXRhCisJCQkJICovCisJCQkJaWYgKG5hbmQtPnBhZ2UyNTYpIHsKKwkJCQkJcCA9IE5BTkRfSkZGUzJfT09COF9GU0RBUE9TOworCQkJCQlsID0gTkFORF9KRkZTMl9PT0I4X0ZTREFMRU47CisJCQkJfSBlbHNlIHsKKwkJCQkJcCA9IE5BTkRfSkZGUzJfT09CMTZfRlNEQVBPUzsKKwkJCQkJbCA9IE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTjsKKwkJCQl9CisKKwkJCQlyZXQgPSBuYW5kX3dyaXRlX29vYihuYW5kLCBvZnMgKyBwLCBsLCAoc2l6ZV90ICopJm4sCisJCQkJCQkgICAgICh1X2NoYXIgKikmY2xlYW5fbWFya2VyKTsKKwkJCQkvKiBxdWl0IGhlcmUgaWYgd3JpdGUgZmFpbGVkICovCisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJb2ZzICs9IG5hbmQtPmVyYXNlc2l6ZTsKKwkJbGVuIC09IG5hbmQtPmVyYXNlc2l6ZTsKKwl9CisKK291dDoKKwkvKiBEZS1zZWxlY3QgdGhlIE5BTkQgZGV2aWNlICovCisJTkFORF9ESVNBQkxFX0NFKG5hbmQpOyAgLyogc2V0IHBpbiBoaWdoICovCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisgICAgCWFyY2hmbGFzaHdwKDAsMSk7CisjZW5kaWYKKyNpZmRlZiBDRkdfTkFORF9XUAorCU5BTkRfV1BfT04oKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBuYW5kY2hlY2sodW5zaWduZWQgbG9uZyBwb3RlbnRpYWwsIHVuc2lnbmVkIGxvbmcgcGh5c2FkcikKK3sKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBuYW5kX3Byb2JlKHVuc2lnbmVkIGxvbmcgcGh5c2FkcikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gTlVMTDsKKwlpbnQgaSA9IDAsIENoaXBJRCA9IDE7CisKKyNpZmRlZiBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCisJb29iX2NvbmZpZy5lY2NfcG9zWzBdID0gTkFORF9KRkZTMl9PT0JfRUNDUE9TMDsKKwlvb2JfY29uZmlnLmVjY19wb3NbMV0gPSBOQU5EX0pGRlMyX09PQl9FQ0NQT1MxOworCW9vYl9jb25maWcuZWNjX3Bvc1syXSA9IE5BTkRfSkZGUzJfT09CX0VDQ1BPUzI7CisJb29iX2NvbmZpZy5lY2NfcG9zWzNdID0gTkFORF9KRkZTMl9PT0JfRUNDUE9TMzsKKwlvb2JfY29uZmlnLmVjY19wb3NbNF0gPSBOQU5EX0pGRlMyX09PQl9FQ0NQT1M0OworCW9vYl9jb25maWcuZWNjX3Bvc1s1XSA9IE5BTkRfSkZGUzJfT09CX0VDQ1BPUzU7CisJb29iX2NvbmZpZy5lY2N2YWxpZF9wb3MgPSA0OworI2Vsc2UKKwlvb2JfY29uZmlnLmVjY19wb3NbMF0gPSBOQU5EX05PT0JfRUNDUE9TMDsKKwlvb2JfY29uZmlnLmVjY19wb3NbMV0gPSBOQU5EX05PT0JfRUNDUE9TMTsKKwlvb2JfY29uZmlnLmVjY19wb3NbMl0gPSBOQU5EX05PT0JfRUNDUE9TMjsKKwlvb2JfY29uZmlnLmVjY19wb3NbM10gPSBOQU5EX05PT0JfRUNDUE9TMzsKKwlvb2JfY29uZmlnLmVjY19wb3NbNF0gPSBOQU5EX05PT0JfRUNDUE9TNDsKKwlvb2JfY29uZmlnLmVjY19wb3NbNV0gPSBOQU5EX05PT0JfRUNDUE9TNTsKKwlvb2JfY29uZmlnLmVjY3ZhbGlkX3BvcyA9IE5BTkRfTk9PQl9FQ0NWUE9TOworI2VuZGlmCisJb29iX2NvbmZpZy5iYWRibG9ja19wb3MgPSA1OworCisJZm9yIChpPTA7IGk8Q0ZHX01BWF9OQU5EX0RFVklDRTsgaSsrKSB7CisJCWlmIChuYW5kX2Rldl9kZXNjW2ldLkNoaXBJRCA9PSBOQU5EX0NoaXBJRF9VTktOT1dOKSB7CisJCQluYW5kID0gJm5hbmRfZGV2X2Rlc2NbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIW5hbmQpCisJCXJldHVybiAoMCk7CisKKwltZW1zZXQoKGNoYXIgKiluYW5kLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOworCisJbmFuZC0+SU9fQUREUiA9IHBoeXNhZHI7CisJbmFuZC0+Y2FjaGVfcGFnZSA9IC0xOyAgLyogaW5pdCB0aGUgY2FjaGUgcGFnZSAqLworCU5hbkRfU2NhbkNoaXBzKG5hbmQpOworCisJaWYgKG5hbmQtPnRvdGxlbiA9PSAwKSB7CisJCS8qIG5vIGNoaXBzIGZvdW5kLCBjbGVhbiB1cCBhbmQgcXVpdCAqLworCQltZW1zZXQoKGNoYXIgKiluYW5kLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOworCQluYW5kLT5DaGlwSUQgPSBOQU5EX0NoaXBJRF9VTktOT1dOOworCQlyZXR1cm4gKDApOworCX0KKworCW5hbmQtPkNoaXBJRCA9IENoaXBJRDsKKwlpZiAoY3Vycl9kZXZpY2UgPT0gLTEpCisJCWN1cnJfZGV2aWNlID0gaTsKKworCW5hbmQtPmRhdGFfYnVmID0gbWFsbG9jIChuYW5kLT5vb2JibG9jayArIG5hbmQtPm9vYnNpemUpOworCWlmICghbmFuZC0+ZGF0YV9idWYpIHsKKwkJcHV0cyAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlcy5cbiIpOworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAobmFuZC0+dG90bGVuKTsKK30KKworI2lmZGVmIENPTkZJR19NVERfTkFORF9FQ0MKKy8qCisgKiBQcmUtY2FsY3VsYXRlZCAyNTYtd2F5IDEgYnl0ZSBjb2x1bW4gcGFyaXR5CisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgbmFuZF9lY2NfcHJlY2FsY190YWJsZVtdID0geworCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsCisJMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMCwKKwkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLAorCTB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywKKwkweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksCisJMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKKwkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLAorCTB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4NmEsIDB4M2YsIDB4M2MsIDB4NjksCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwKKwkweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsCisJMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKKwkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLAorCTB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4NjksIDB4M2MsIDB4M2YsIDB4NmEsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwKKwkweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsCisJMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwKKwkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LAorCTB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4MGYsIDB4NWEsIDB4NTksIDB4MGMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywKKwkweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksCisJMHg1OSwgMHgwYywgMHgwZiwgMHg1YSwgMHgwMCwgMHg1NSwgMHg1NiwgMHgwMywKKwkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLAorCTB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwKKwkweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAorCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsCisJMHg1YSwgMHgwZiwgMHgwYywgMHg1OSwgMHgwMywgMHg1NiwgMHg1NSwgMHgwMAorfTsKKworCisvKgorICogQ3JlYXRlcyBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eQorICovCitzdGF0aWMgdm9pZCBuYW5kX3RyYW5zX3Jlc3VsdCh1X2NoYXIgcmVnMiwgdV9jaGFyIHJlZzMsCisJdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgYSwgYiwgaSwgdG1wMSwgdG1wMjsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJYSA9IGIgPSAweDgwOworCXRtcDEgPSB0bXAyID0gMDsKKworCS8qIENhbGN1bGF0ZSBmaXJzdCBFQ0MgYnl0ZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFAxNSwxMywxMSw5IC0tPiBlY2NfY29kZVswXSAqLworCQkJdG1wMSB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDE0LDEyLDEwLDggLS0+IGVjY19jb2RlWzBdICovCisJCQl0bXAxIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogQ2FsY3VsYXRlIHNlY29uZCBFQ0MgYnl0ZSAqLworCWIgPSAweDgwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZzMgJiBhKQkJLyogTFA3LDUsMywxIC0tPiBlY2NfY29kZVsxXSAqLworCQkJdG1wMiB8PSBiOworCQliID4+PSAxOworCQlpZiAocmVnMiAmIGEpCQkvKiBMUDYsNCwyLDAgLS0+IGVjY19jb2RlWzFdICovCisJCQl0bXAyIHw9IGI7CisJCWIgPj49IDE7CisJCWEgPj49IDE7CisJfQorCisJLyogU3RvcmUgdHdvIG9mIHRoZSBFQ0MgYnl0ZXMgKi8KKwllY2NfY29kZVswXSA9IHRtcDE7CisJZWNjX2NvZGVbMV0gPSB0bXAyOworfQorCisvKgorICogQ2FsY3VsYXRlIDMgYnl0ZSBFQ0MgY29kZSBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqLworc3RhdGljIHZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgaWR4LCByZWcxLCByZWczOworCWludCBqOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlyZWcxID0gcmVnMyA9IDA7CisJZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKKworCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KKwlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgeworCisJCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLworCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07CisJCXJlZzEgXj0gaWR4OworCisJCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCisJCWlmIChpZHggJiAweDQwKSB7CisJCQlyZWczIF49ICh1X2NoYXIpIGo7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KKwluYW5kX3RyYW5zX3Jlc3VsdCgocmVnMSAmIDB4NDApID8gfnJlZzMgOiByZWczLCByZWczLCBlY2NfY29kZSk7CisKKwkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KKwllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKKwllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKKwllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKK30KKworLyoKKyAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVycm9yIGZvciAyNTYgYnl0ZSBibG9jaworICovCitzdGF0aWMgaW50IG5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKK3sKKwl1X2NoYXIgYSwgYiwgYywgZDEsIGQyLCBkMywgYWRkLCBiaXQsIGk7CisKKwkvKiBEbyBlcnJvciBkZXRlY3Rpb24gKi8KKwlkMSA9IGNhbGNfZWNjWzBdIF4gcmVhZF9lY2NbMF07CisJZDIgPSBjYWxjX2VjY1sxXSBeIHJlYWRfZWNjWzFdOworCWQzID0gY2FsY19lY2NbMl0gXiByZWFkX2VjY1syXTsKKworCWlmICgoZDEgfCBkMiB8IGQzKSA9PSAwKSB7CisJCS8qIE5vIGVycm9ycyAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlhID0gKGQxIF4gKGQxID4+IDEpKSAmIDB4NTU7CisJCWIgPSAoZDIgXiAoZDIgPj4gMSkpICYgMHg1NTsKKwkJYyA9IChkMyBeIChkMyA+PiAxKSkgJiAweDU0OworCisJCS8qIEZvdW5kIGFuZCB3aWxsIGNvcnJlY3Qgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgZGF0YSAqLworCQlpZiAoKGEgPT0gMHg1NSkgJiYgKGIgPT0gMHg1NSkgJiYgKGMgPT0gMHg1NCkpIHsKKwkJCWMgPSAweDgwOworCQkJYWRkID0gMDsKKwkJCWEgPSAweDgwOworCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCQkJaWYgKGQxICYgYykKKwkJCQkJYWRkIHw9IGE7CisJCQkJYyA+Pj0gMjsKKwkJCQlhID4+PSAxOworCQkJfQorCQkJYyA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDIgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQliaXQgPSAwOworCQkJYiA9IDB4MDQ7CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQkJCWlmIChkMyAmIGMpCisJCQkJCWJpdCB8PSBiOworCQkJCWMgPj49IDI7CisJCQkJYiA+Pj0gMTsKKwkJCX0KKwkJCWIgPSAweDAxOworCQkJYSA9IGRhdFthZGRdOworCQkJYSBePSAoYiA8PCBiaXQpOworCQkJZGF0W2FkZF0gPSBhOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQlpID0gMDsKKwkJCXdoaWxlIChkMSkgeworCQkJCWlmIChkMSAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMSA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMikgeworCQkJCWlmIChkMiAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMiA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMykgeworCQkJCWlmIChkMyAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMyA+Pj0gMTsKKwkJCX0KKwkJCWlmIChpID09IDEpIHsKKwkJCQkvKiBFQ0MgQ29kZSBFcnJvciBDb3JyZWN0aW9uICovCisJCQkJcmVhZF9lY2NbMF0gPSBjYWxjX2VjY1swXTsKKwkJCQlyZWFkX2VjY1sxXSA9IGNhbGNfZWNjWzFdOworCQkJCXJlYWRfZWNjWzJdID0gY2FsY19lY2NbMl07CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBVbmNvcnJlY3RhYmxlIEVycm9yICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCXJldHVybiAtMTsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfMXBhc3MuYyBiL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMKaW5kZXggYzZjMGMyYS4uNjM2MWQwNiAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfMXBhc3MuYworKysgYi9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jCkBAIC0xNDQsNiArMTQ0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGFydF9pbmZvICpjdXJyZW50X3BhcnQ7CiAKICNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2luY2x1ZGUgPG5hbmQuaD4KIC8qCiAgKiBTdXBwb3J0IGZvciBqZmZzMiBvbiB0b3Agb2YgTkFORC1mbGFzaAogICoKQEAgLTE1NCw5ICsxNTUsOCBAQAogICoKICAqLwogCi0vKiB0aGlzIG9uZSBkZWZpbmVkIGluIGNtZF9uYW5kLmMgKi8KLWludCByZWFkX2pmZnMyX25hbmQoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuLAotCQkgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIGludCBuYW5kZGV2KTsKKy8qIGluZm8gZm9yIE5BTkQgY2hpcHMsIGRlZmluZWQgaW4gZHJpdmVycy9uYW5kL25hbmQuYyAqLworZXh0ZXJuIG5hbmRfaW5mb190IG5hbmRfaW5mb1tdOwogCiAjZGVmaW5lIE5BTkRfUEFHRV9TSVpFIDUxMgogI2RlZmluZSBOQU5EX1BBR0VfU0hJRlQgOQpAQCAtMTY3LDYgKzE2Nyw3IEBACiAjZW5kaWYKICNkZWZpbmUgTkFORF9DQUNIRV9TSVpFIChOQU5EX0NBQ0hFX1BBR0VTKk5BTkRfUEFHRV9TSVpFKQogCisjaWZkZWYgQ0ZHX05BTkRfTEVHQUNZCiBzdGF0aWMgdTgqIG5hbmRfY2FjaGUgPSBOVUxMOwogc3RhdGljIHUzMiBuYW5kX2NhY2hlX29mZiA9ICh1MzIpLTE7CiAKQEAgLTE3NCw3ICsxNzUsNyBAQAogewogCXN0cnVjdCBtdGRpZHMgKmlkID0gY3VycmVudF9wYXJ0LT5kZXYtPmlkOwogCXUzMiBieXRlc19yZWFkID0gMDsKLQlzaXplX3QgcmV0bGVuOworCXVsb25nIHJldGxlbjsKIAlpbnQgY3B5X2J5dGVzOwogCiAJd2hpbGUgKGJ5dGVzX3JlYWQgPCBzaXplKSB7CkBAIC0xOTEsOCArMTkyLDEwIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAocmVhZF9qZmZzMl9uYW5kKG5hbmRfY2FjaGVfb2ZmLCBOQU5EX0NBQ0hFX1NJWkUsCi0JCQkJCQkmcmV0bGVuLCBuYW5kX2NhY2hlLCBpZC0+bnVtKSA8IDAgfHwKKworCQkJcmV0bGVuID0gTkFORF9DQUNIRV9TSVpFOworCQkJaWYgKG5hbmRfcmVhZCgmbmFuZF9pbmZvW2lkLT5udW1dLCBuYW5kX2NhY2hlX29mZiwKKwkJCQkJJnJldGxlbiwgbmFuZF9jYWNoZSkgIT0gMCB8fAogCQkJCQlyZXRsZW4gIT0gTkFORF9DQUNIRV9TSVpFKSB7CiAJCQkJcHJpbnRmKCJyZWFkX25hbmRfY2FjaGVkOiBlcnJvciByZWFkaW5nIG5hbmQgb2ZmICUjeCBzaXplICVkIGJ5dGVzXG4iLAogCQkJCQkJbmFuZF9jYWNoZV9vZmYsIE5BTkRfQ0FDSEVfU0laRSk7CkBAIC0yNDgsNiArMjUxLDcgQEAKIHsKIAlmcmVlKGJ1Zik7CiB9CisjZW5kaWYgLyogQ0ZHX05BTkRfTEVHQUNZICovCiAjZW5kaWYgLyogI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCiAKIApAQCAtMjkwLDcgKzI5NCw3IEBACiAJCXJldHVybiBnZXRfZmxfbWVtX25vcihvZmYpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKIAkJcmV0dXJuIGdldF9mbF9tZW1fbmFuZChvZmYsIHNpemUsIGV4dF9idWYpOwogI2VuZGlmCkBAIC0zMDgsNyArMzEyLDcgQEAKIAkJcmV0dXJuIGdldF9ub2RlX21lbV9ub3Iob2ZmKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCiAJCXJldHVybiBnZXRfbm9kZV9tZW1fbmFuZChvZmYpOwogI2VuZGlmCkBAIC0zMTksNyArMzIzLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9mbF9tZW0odm9pZCAqYnVmKQogewotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJc3RydWN0IG10ZGlkcyAqaWQgPSBjdXJyZW50X3BhcnQtPmRldi0+aWQ7CiAKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMgYi9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4YWY3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYwpAQCAtMCwwICsxLDEwMzYgQEAKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8amZmczIvamZmczIuaD4KKyNpbmNsdWRlIDxqZmZzMi9qZmZzMl8xcGFzcy5oPgorI2luY2x1ZGUgPG5hbmQuaD4KKworI2luY2x1ZGUgImpmZnMyX25hbmRfcHJpdmF0ZS5oIgorCisjZGVmaW5lCU5PREVfQ0hVTksJMTAyNAkvKiBzaXplIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGNodW5rIGluIGJfbm9kZXMgKi8KKworLyogRGVidWdnaW5nIHN3aXRjaGVzICovCisjdW5kZWYJREVCVUdfRElSRU5UUwkJLyogcHJpbnQgZGlyZWN0b3J5IGVudHJ5IGxpc3QgYWZ0ZXIgc2NhbiAqLworI3VuZGVmCURFQlVHX0ZSQUdNRU5UUwkJLyogcHJpbnQgZnJhZ21lbnQgbGlzdCBhZnRlciBzY2FuICovCisjdW5kZWYJREVCVUcJCQkvKiBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisKKyNpZmRlZiAgREVCVUcKKyMgZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikJcHJpbnRmKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgbmFuZF9pbmZvX3QgKm5hbmQ7CisKKy8qIENvbXByZXNzaW9uIG5hbWVzICovCitzdGF0aWMgY2hhciAqY29tcHJfbmFtZXNbXSA9IHsKKwkiTk9ORSIsCisJIlpFUk8iLAorCSJSVElNRSIsCisJIlJVQklOTUlQUyIsCisJIkNPUFkiLAorCSJEWU5SVUJJTiIsCisJIlpMSUIiLAorI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkKKwkiTFpPIiwKKwkiTFpBUkkiLAorI2VuZGlmCit9OworCisvKiBTcGlubmluZyB3aGVlbCAqLworc3RhdGljIGNoYXIgc3Bpbm5lcltdID0geyAnfCcsICcvJywgJy0nLCAnXFwnIH07CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWVtX2Jsb2NrIHsKKwl1bnNpZ25lZCBpbmRleDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXh0OworCWNoYXIgbm9kZXNbMF07Cit9OworCitzdGF0aWMgdm9pZAorZnJlZV9ub2RlcyhzdHJ1Y3QgYl9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0LT5saXN0TWVtQmFzZSAhPSBOVUxMKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5leHQgPSBsaXN0LT5saXN0TWVtQmFzZS0+bmV4dDsKKwkJZnJlZShsaXN0LT5saXN0TWVtQmFzZSk7CisJCWxpc3QtPmxpc3RNZW1CYXNlID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYl9ub2RlICoKK2FkZF9ub2RlKHN0cnVjdCBiX2xpc3QgKmxpc3QsIGludCBzaXplKQoreworCXUzMiBpbmRleCA9IDA7CisJc3RydWN0IG1lbV9ibG9jayAqbWVtQmFzZTsKKwlzdHJ1Y3QgYl9ub2RlICpiOworCisJbWVtQmFzZSA9IGxpc3QtPmxpc3RNZW1CYXNlOworCWlmIChtZW1CYXNlICE9IE5VTEwpCisJCWluZGV4ID0gbWVtQmFzZS0+aW5kZXg7CisKKwlpZiAobWVtQmFzZSA9PSBOVUxMIHx8IGluZGV4ID49IE5PREVfQ0hVTkspIHsKKwkJLyogd2UgbmVlZCBtb3JlIHNwYWNlIGJlZm9yZSB3ZSBjb250aW51ZSAqLworCQltZW1CYXNlID0gbW1hbGxvYyhzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykgKyBOT0RFX0NIVU5LICogc2l6ZSk7CisJCWlmIChtZW1CYXNlID09IE5VTEwpIHsKKwkJCXB1dHN0cigiYWRkX25vZGU6IG1hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtQmFzZS0+bmV4dCA9IGxpc3QtPmxpc3RNZW1CYXNlOworCQlpbmRleCA9IDA7CisJfQorCS8qIG5vdyB3ZSBoYXZlIHJvb20gdG8gYWRkIGl0LiAqLworCWIgPSAoc3RydWN0IGJfbm9kZSAqKSZtZW1CYXNlLT5ub2Rlc1tzaXplICogaW5kZXhdOworCWluZGV4ICsrOworCisJbWVtQmFzZS0+aW5kZXggPSBpbmRleDsKKwlsaXN0LT5saXN0TWVtQmFzZSA9IG1lbUJhc2U7CisJbGlzdC0+bGlzdENvdW50Kys7CisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYl9ub2RlICoKK2luc2VydF9ub2RlKHN0cnVjdCBiX2xpc3QgKmxpc3QsIHN0cnVjdCBiX25vZGUgKm5ldykKK3sKKyNpZmRlZiBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKKwlzdHJ1Y3QgYl9ub2RlICpiLCAqcHJldjsKKworCWlmIChsaXN0LT5saXN0VGFpbCAhPSBOVUxMICYmIGxpc3QtPmxpc3RDb21wYXJlKG5ldywgbGlzdC0+bGlzdFRhaWwpKQorCQlwcmV2ID0gbGlzdC0+bGlzdFRhaWw7CisJZWxzZSBpZiAobGlzdC0+bGlzdExhc3QgIT0gTlVMTCAmJiBsaXN0LT5saXN0Q29tcGFyZShuZXcsIGxpc3QtPmxpc3RMYXN0KSkKKwkJcHJldiA9IGxpc3QtPmxpc3RMYXN0OworCWVsc2UKKwkJcHJldiA9IE5VTEw7CisKKwlmb3IgKGIgPSAocHJldiA/IHByZXYtPm5leHQgOiBsaXN0LT5saXN0SGVhZCk7CisJICAgICBiICE9IE5VTEwgJiYgbGlzdC0+bGlzdENvbXBhcmUobmV3LCBiKTsKKwkgICAgIHByZXYgPSBiLCBiID0gYi0+bmV4dCkgeworCQlsaXN0LT5saXN0TG9vcHMrKzsKKwl9CisJaWYgKGIgIT0gTlVMTCkKKwkJbGlzdC0+bGlzdExhc3QgPSBwcmV2OworCisJaWYgKGIgIT0gTlVMTCkgeworCQluZXctPm5leHQgPSBiOworCQlpZiAocHJldiAhPSBOVUxMKQorCQkJcHJldi0+bmV4dCA9IG5ldzsKKwkJZWxzZQorCQkJbGlzdC0+bGlzdEhlYWQgPSBuZXc7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCW5ldy0+bmV4dCA9IChzdHJ1Y3QgYl9ub2RlICopIE5VTEw7CisJCWlmIChsaXN0LT5saXN0VGFpbCAhPSBOVUxMKSB7CisJCQlsaXN0LT5saXN0VGFpbC0+bmV4dCA9IG5ldzsKKwkJCWxpc3QtPmxpc3RUYWlsID0gbmV3OworCQl9IGVsc2UgeworCQkJbGlzdC0+bGlzdFRhaWwgPSBsaXN0LT5saXN0SGVhZCA9IG5ldzsKKwkJfQorCX0KKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYl9ub2RlICoKK2luc2VydF9pbm9kZShzdHJ1Y3QgYl9saXN0ICpsaXN0LCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpub2RlLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBiX2lub2RlICpuZXc7CisKKwlpZiAoIShuZXcgPSAoc3RydWN0IGJfaW5vZGUgKilhZGRfbm9kZShsaXN0LCBzaXplb2Yoc3RydWN0IGJfaW5vZGUpKSkpIHsKKwkJcHV0c3RyKCJhZGRfbm9kZSBmYWlsZWQhXHJcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmV3LT5vZmZzZXQgPSBvZmZzZXQ7CisJbmV3LT52ZXJzaW9uID0gbm9kZS0+dmVyc2lvbjsKKwluZXctPmlubyA9IG5vZGUtPmlubzsKKwluZXctPmlzaXplID0gbm9kZS0+aXNpemU7CisJbmV3LT5jc2l6ZSA9IG5vZGUtPmNzaXplOworCisJcmV0dXJuIGluc2VydF9ub2RlKGxpc3QsIChzdHJ1Y3QgYl9ub2RlICopbmV3KTsKK30KKworc3RhdGljIHN0cnVjdCBiX25vZGUgKgoraW5zZXJ0X2RpcmVudChzdHJ1Y3QgYl9saXN0ICpsaXN0LCBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqbm9kZSwgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYl9kaXJlbnQgKm5ldzsKKworCWlmICghKG5ldyA9IChzdHJ1Y3QgYl9kaXJlbnQgKilhZGRfbm9kZShsaXN0LCBzaXplb2Yoc3RydWN0IGJfZGlyZW50KSkpKSB7CisJCXB1dHN0cigiYWRkX25vZGUgZmFpbGVkIVxyXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5ldy0+b2Zmc2V0ID0gb2Zmc2V0OworCW5ldy0+dmVyc2lvbiA9IG5vZGUtPnZlcnNpb247CisJbmV3LT5waW5vID0gbm9kZS0+cGlubzsKKwluZXctPmlubyA9IG5vZGUtPmlubzsKKwluZXctPm5oYXNoID0gZnVsbF9uYW1lX2hhc2gobm9kZS0+bmFtZSwgbm9kZS0+bnNpemUpOworCW5ldy0+bnNpemUgPSBub2RlLT5uc2l6ZTsKKwluZXctPnR5cGUgPSBub2RlLT50eXBlOworCisJcmV0dXJuIGluc2VydF9ub2RlKGxpc3QsIChzdHJ1Y3QgYl9ub2RlICopbmV3KTsKK30KKworI2lmZGVmIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUworLyogU29ydCBkYXRhIGVudHJpZXMgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gbGFzdCwgc28gdGhhdCBpZiB0aGVyZQorICogaXMgb3ZlcmxhcHBpbmcgZGF0YSB0aGUgbGF0ZXN0IHZlcnNpb24gd2lsbCBiZSB1c2VkLgorICovCitzdGF0aWMgaW50IGNvbXBhcmVfaW5vZGVzKHN0cnVjdCBiX25vZGUgKm5ldywgc3RydWN0IGJfbm9kZSAqb2xkKQoreworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgb2pOZXc7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBvak9sZDsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpqTmV3ID0KKwkJKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKilnZXRfZmxfbWVtKG5ldy0+b2Zmc2V0LCBzaXplb2Yob2pOZXcpLCAmb2pOZXcpOworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmpPbGQgPQorCQkoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqKWdldF9mbF9tZW0ob2xkLT5vZmZzZXQsIHNpemVvZihvak9sZCksICZvak9sZCk7CisKKwlyZXR1cm4gak5ldy0+dmVyc2lvbiA+IGpPbGQtPnZlcnNpb247Cit9CisKKy8qIFNvcnQgZGlyZWN0b3J5IGVudHJpZXMgc28gYWxsIGVudHJpZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CisgKiB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIGdyb3VwZWQgdG9nZXRoZXIsIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uCisgKiBsYXN0LiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gZWxpbWluYXRlIGFsbCBidXQgdGhlIGxhdGVzdCB2ZXJzaW9uCisgKiBieSBtYXJraW5nIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGRlYWQgYnkgc2V0dGluZyB0aGUgaW5vZGUgdG8gMC4KKyAqLworc3RhdGljIGludCBjb21wYXJlX2RpcmVudHMoc3RydWN0IGJfbm9kZSAqbmV3LCBzdHJ1Y3QgYl9ub2RlICpvbGQpCit7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgb2pOZXc7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgb2pPbGQ7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKmpOZXcgPQorCQkoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKilnZXRfZmxfbWVtKG5ldy0+b2Zmc2V0LCBzaXplb2Yob2pOZXcpLCAmb2pOZXcpOworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpqT2xkID0KKwkJKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICopZ2V0X2ZsX21lbShvbGQtPm9mZnNldCwgc2l6ZW9mKG9qT2xkKSwgJm9qT2xkKTsKKwlpbnQgY21wOworCisJLyogYXNjZW5kaW5nIHNvcnQgYnkgcGlubyAqLworCWlmIChqTmV3LT5waW5vICE9IGpPbGQtPnBpbm8pCisJCXJldHVybiBqTmV3LT5waW5vID4gak9sZC0+cGlubzsKKworCS8qIHBpbm8gaXMgdGhlIHNhbWUsIHNvIHVzZSBhc2NlbmRpbmcgc29ydCBieSBuc2l6ZSwgc28KKwkgKiB3ZSBkb24ndCBkbyBzdHJuY21wIHVubGVzcyB3ZSByZWFsbHkgbXVzdC4KKwkgKi8KKwlpZiAoak5ldy0+bnNpemUgIT0gak9sZC0+bnNpemUpCisJCXJldHVybiBqTmV3LT5uc2l6ZSA+IGpPbGQtPm5zaXplOworCisJLyogbGVuZ3RoIGlzIGFsc28gdGhlIHNhbWUsIHNvIHVzZSBhc2NlbmRpbmcgc29ydCBieSBuYW1lCisJICovCisJY21wID0gc3RybmNtcChqTmV3LT5uYW1lLCBqT2xkLT5uYW1lLCBqTmV3LT5uc2l6ZSk7CisJaWYgKGNtcCAhPSAwKQorCQlyZXR1cm4gY21wID4gMDsKKworCS8qIHdlIGhhdmUgZHVwbGljYXRlIG5hbWVzIGluIHRoaXMgZGlyZWN0b3J5LCBzbyB1c2UgYXNjZW5kaW5nCisJICogc29ydCBieSB2ZXJzaW9uCisJICovCisJaWYgKGpOZXctPnZlcnNpb24gPiBqT2xkLT52ZXJzaW9uKSB7CisJCS8qIHNpbmNlIGpOZXcgaXMgbmV3ZXIsIHdlIGtub3cgak9sZCBpcyBub3QgdmFsaWQsIHNvCisJCSAqIG1hcmsgaXQgd2l0aCBpbm9kZSAwIGFuZCBpdCB3aWxsIG5vdCBiZSB1c2VkCisJCSAqLworCQlqT2xkLT5pbm8gPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdTMyCitqZmZzX2luaXRfMXBhc3NfbGlzdChzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQoreworCXN0cnVjdCBiX2xpc3RzICpwTDsKKworCWlmIChwYXJ0LT5qZmZzMl9wcml2ICE9IE5VTEwpIHsKKwkJcEwgPSAoc3RydWN0IGJfbGlzdHMgKilwYXJ0LT5qZmZzMl9wcml2OworCQlmcmVlX25vZGVzKCZwTC0+ZnJhZyk7CisJCWZyZWVfbm9kZXMoJnBMLT5kaXIpOworCQlmcmVlKHBMKTsKKwl9CisJaWYgKE5VTEwgIT0gKHBhcnQtPmpmZnMyX3ByaXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBiX2xpc3RzKSkpKSB7CisJCXBMID0gKHN0cnVjdCBiX2xpc3RzICopcGFydC0+amZmczJfcHJpdjsKKworCQltZW1zZXQocEwsIDAsIHNpemVvZigqcEwpKTsKKyNpZmRlZiBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKKwkJcEwtPmRpci5saXN0Q29tcGFyZSA9IGNvbXBhcmVfZGlyZW50czsKKwkJcEwtPmZyYWcubGlzdENvbXBhcmUgPSBjb21wYXJlX2lub2RlczsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworLyogZmluZCB0aGUgaW5vZGUgZnJvbSB0aGUgc2xhc2hsZXNzIG5hbWUgZ2l2ZW4gYSBwYXJlbnQgKi8KK3N0YXRpYyBsb25nCitqZmZzMl8xcGFzc19yZWFkX2lub2RlKHN0cnVjdCBiX2xpc3RzICpwTCwgdTMyIGlubywgY2hhciAqZGVzdCwKKwkJICAgICAgIHN0cnVjdCBzdGF0ICpzdGF0KQoreworCXN0cnVjdCBiX2lub2RlICpqTm9kZTsKKwl1MzIgdG90YWxTaXplID0gMDsKKwl1MzIgbGF0ZXN0VmVyc2lvbiA9IDA7CisJbG9uZyByZXQ7CisKKyNpZmRlZiBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKKwkvKiBGaW5kIGZpbGUgc2l6ZSBiZWZvcmUgbG9hZGluZyBhbnkgZGF0YSwgc28gZnJhZ21lbnRzIHRoYXQKKwkgKiBzdGFydCBwYXN0IHRoZSBlbmQgb2YgZmlsZSBjYW4gYmUgaWdub3JlZC4gQSBmcmFnbWVudAorCSAqIHRoYXQgaXMgcGFydGlhbGx5IGluIHRoZSBmaWxlIGlzIGxvYWRlZCwgc28gZXh0cmEgZGF0YSBtYXkKKwkgKiBiZSBsb2FkZWQgdXAgdG8gdGhlIG5leHQgNEsgYm91bmRhcnkgYWJvdmUgdGhlIGZpbGUgc2l6ZS4KKwkgKiBUaGlzIHNob3VsZG4ndCBjYXVzZSB0cm91YmxlIHdoZW4gbG9hZGluZyBrZXJuZWwgaW1hZ2VzLCBzbworCSAqIHdlIHdpbGwgbGl2ZSB3aXRoIGl0LgorCSAqLworCWZvciAoak5vZGUgPSAoc3RydWN0IGJfaW5vZGUgKilwTC0+ZnJhZy5saXN0SGVhZDsgak5vZGU7IGpOb2RlID0gak5vZGUtPm5leHQpIHsKKwkJaWYgKChpbm8gPT0gak5vZGUtPmlubykpIHsKKwkJCS8qIGdldCBhY3R1YWwgZmlsZSBsZW5ndGggZnJvbSB0aGUgbmV3ZXN0IG5vZGUgKi8KKwkJCWlmIChqTm9kZS0+dmVyc2lvbiA+PSBsYXRlc3RWZXJzaW9uKSB7CisJCQkJdG90YWxTaXplID0gak5vZGUtPmlzaXplOworCQkJCWxhdGVzdFZlcnNpb24gPSBqTm9kZS0+dmVyc2lvbjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJZm9yIChqTm9kZSA9IChzdHJ1Y3QgYl9pbm9kZSAqKXBMLT5mcmFnLmxpc3RIZWFkOyBqTm9kZTsgak5vZGUgPSBqTm9kZS0+bmV4dCkgeworCQlpZiAoKGlubyAhPSBqTm9kZS0+aW5vKSkKKwkJCWNvbnRpbnVlOworI2lmbmRlZiBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKKwkJLyogZ2V0IGFjdHVhbCBmaWxlIGxlbmd0aCBmcm9tIHRoZSBuZXdlc3Qgbm9kZSAqLworCQlpZiAoak5vZGUtPnZlcnNpb24gPj0gbGF0ZXN0VmVyc2lvbikgeworCQkJdG90YWxTaXplID0gak5vZGUtPmlzaXplOworCQkJbGF0ZXN0VmVyc2lvbiA9IGpOb2RlLT52ZXJzaW9uOworCQl9CisjZW5kaWYKKwkJaWYgKGRlc3QgfHwgc3RhdCkgeworCQkJY2hhciAqc3JjLCAqZHN0OworCQkJY2hhciBkYXRhWzQwOTYgKyBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSldOworCQkJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqaW5vZGU7CisJCQlzaXplX3QgbGVuOworCisJCQlpbm9kZSA9IChzdHJ1Y3QgamZmczJfcmF3X2lub2RlICopJmRhdGE7CisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSk7CisJCQlpZiAoZGVzdCkKKwkJCQlsZW4gKz0gak5vZGUtPmNzaXplOworCQkJbmFuZF9yZWFkKG5hbmQsIGpOb2RlLT5vZmZzZXQsICZsZW4sIGlub2RlKTsKKwkJCS8qIGlnbm9yZSBkYXRhIGJlaGluZCBsYXRlc3Qga25vd24gRU9GICovCisJCQlpZiAoaW5vZGUtPm9mZnNldCA+IHRvdGFsU2l6ZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHN0YXQpIHsKKwkJCQlzdGF0LT5zdF9tdGltZSA9IGlub2RlLT5tdGltZTsKKwkJCQlzdGF0LT5zdF9tb2RlID0gaW5vZGUtPm1vZGU7CisJCQkJc3RhdC0+c3RfaW5vID0gaW5vZGUtPmlubzsKKwkJCQlzdGF0LT5zdF9zaXplID0gdG90YWxTaXplOworCQkJfQorCisJCQlpZiAoIWRlc3QpCisJCQkJY29udGludWU7CisKKwkJCXNyYyA9ICgoY2hhciAqKSBpbm9kZSkgKyBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSk7CisJCQlkc3QgPSAoY2hhciAqKSAoZGVzdCArIGlub2RlLT5vZmZzZXQpOworCisJCQlzd2l0Y2ggKGlub2RlLT5jb21wcikgeworCQkJY2FzZSBKRkZTMl9DT01QUl9OT05FOgorCQkJCXJldCA9IDA7CisJCQkJbWVtY3B5KGRzdCwgc3JjLCBpbm9kZS0+ZHNpemUpOworCQkJCWJyZWFrOworCQkJY2FzZSBKRkZTMl9DT01QUl9aRVJPOgorCQkJCXJldCA9IDA7CisJCQkJbWVtc2V0KGRzdCwgMCwgaW5vZGUtPmRzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSkZGUzJfQ09NUFJfUlRJTUU6CisJCQkJcmV0ID0gMDsKKwkJCQlydGltZV9kZWNvbXByZXNzKHNyYywgZHN0LCBpbm9kZS0+Y3NpemUsIGlub2RlLT5kc2l6ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpGRlMyX0NPTVBSX0RZTlJVQklOOgorCQkJCS8qIHRoaXMgaXMgc2xvdyBidXQgaXQgd29ya3MgKi8KKwkJCQlyZXQgPSAwOworCQkJCWR5bnJ1YmluX2RlY29tcHJlc3Moc3JjLCBkc3QsIGlub2RlLT5jc2l6ZSwgaW5vZGUtPmRzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSkZGUzJfQ09NUFJfWkxJQjoKKwkJCQlyZXQgPSB6bGliX2RlY29tcHJlc3Moc3JjLCBkc3QsIGlub2RlLT5jc2l6ZSwgaW5vZGUtPmRzaXplKTsKKwkJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpCisJCQljYXNlIEpGRlMyX0NPTVBSX0xaTzoKKwkJCQlyZXQgPSBsem9fZGVjb21wcmVzcyhzcmMsIGRzdCwgaW5vZGUtPmNzaXplLCBpbm9kZS0+ZHNpemUpOworCQkJCWJyZWFrOworCQkJY2FzZSBKRkZTMl9DT01QUl9MWkFSSToKKwkJCQlyZXQgPSBsemFyaV9kZWNvbXByZXNzKHNyYywgZHN0LCBpbm9kZS0+Y3NpemUsIGlub2RlLT5kc2l6ZSk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJLyogdW5rbm93biAqLworCQkJCXB1dExhYmVsZWRXb3JkKCJVTktPV04gQ09NUFJFU1NJT04gTUVUSE9EID0gIiwgaW5vZGUtPmNvbXByKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gdG90YWxTaXplOworfQorCisvKiBmaW5kIHRoZSBpbm9kZSBmcm9tIHRoZSBzbGFzaGxlc3MgbmFtZSBnaXZlbiBhIHBhcmVudCAqLworc3RhdGljIHUzMgoramZmczJfMXBhc3NfZmluZF9pbm9kZShzdHJ1Y3QgYl9saXN0cyAqIHBMLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgcGlubykKK3sKKwlzdHJ1Y3QgYl9kaXJlbnQgKmpEaXI7CisJaW50IGxlbiA9IHN0cmxlbihuYW1lKTsJLyogbmFtZSBpcyBhc3N1bWVkIHNsYXNoIGZyZWUgKi8KKwl1bnNpZ25lZCBpbnQgbmhhc2ggPSBmdWxsX25hbWVfaGFzaChuYW1lLCBsZW4pOworCXUzMiB2ZXJzaW9uID0gMDsKKwl1MzIgaW5vZGUgPSAwOworCisJLyogd2UgbmVlZCB0byBzZWFyY2ggYWxsIGFuZCByZXR1cm4gdGhlIGlub2RlIHdpdGggdGhlIGhpZ2hlc3QgdmVyc2lvbiAqLworCWZvciAoakRpciA9IChzdHJ1Y3QgYl9kaXJlbnQgKilwTC0+ZGlyLmxpc3RIZWFkOyBqRGlyOyBqRGlyID0gakRpci0+bmV4dCkgeworCQlpZiAoKHBpbm8gPT0gakRpci0+cGlubykgJiYgKGpEaXItPmlubykgJiYJLyogMCBmb3IgdW5saW5rICovCisJCSAgICAobGVuID09IGpEaXItPm5zaXplKSAmJiAobmhhc2ggPT0gakRpci0+bmhhc2gpKSB7CisJCQkvKiBUT0RPOiBjb21wYXJlIG5hbWUgKi8KKwkJCWlmIChqRGlyLT52ZXJzaW9uIDwgdmVyc2lvbikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGpEaXItPnZlcnNpb24gPT0gdmVyc2lvbiAmJiBpbm9kZSAhPSAwKSB7CisJCQkJLyogSSdtIHByZXR0eSBzdXJlIHRoaXMgaXNuJ3QgbGVnYWwgKi8KKwkJCQlwdXRzdHIoIiAqKiBFUlJPUiAqKiAiKTsKKy8qCQkJCXB1dG5zdHIoakRpci0+bmFtZSwgakRpci0+bnNpemUpOyAqLworLyoJCQkJcHV0TGFiZWxlZFdvcmQoIiBoYXMgZHVwIHZlcnNpb24gPSIsIHZlcnNpb24pOyAqLworCQkJfQorCQkJaW5vZGUgPSBqRGlyLT5pbm87CisJCQl2ZXJzaW9uID0gakRpci0+dmVyc2lvbjsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK2NoYXIgKm1rbW9kZXN0cih1bnNpZ25lZCBsb25nIG1vZGUsIGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbCA9ICJ4d3IiOworCWludCBtYXNrID0gMSwgaTsKKwljaGFyIGM7CisKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGRElSOiAgICBzdHJbMF0gPSAnZCc7IGJyZWFrOworCQljYXNlIFNfSUZCTEs6ICAgIHN0clswXSA9ICdiJzsgYnJlYWs7CisJCWNhc2UgU19JRkNIUjogICAgc3RyWzBdID0gJ2MnOyBicmVhazsKKwkJY2FzZSBTX0lGSUZPOiAgICBzdHJbMF0gPSAnZic7IGJyZWFrOworCQljYXNlIFNfSUZMTks6ICAgIHN0clswXSA9ICdsJzsgYnJlYWs7CisJCWNhc2UgU19JRlNPQ0s6ICAgc3RyWzBdID0gJ3MnOyBicmVhazsKKwkJY2FzZSBTX0lGUkVHOiAgICBzdHJbMF0gPSAnLSc7IGJyZWFrOworCQlkZWZhdWx0OiAgICAgICAgIHN0clswXSA9ICc/JzsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJYyA9IGxbaSUzXTsKKwkJc3RyWzktaV0gPSAobW9kZSAmIG1hc2spP2M6Jy0nOworCQltYXNrID0gbWFzazw8MTsKKwl9CisKKwlpZihtb2RlICYgU19JU1VJRCkgc3RyWzNdID0gKG1vZGUgJiBTX0lYVVNSKT8ncyc6J1MnOworCWlmKG1vZGUgJiBTX0lTR0lEKSBzdHJbNl0gPSAobW9kZSAmIFNfSVhHUlApPydzJzonUyc7CisJaWYobW9kZSAmIFNfSVNWVFgpIHN0cls5XSA9IChtb2RlICYgU19JWE9USCk/J3QnOidUJzsKKwlzdHJbMTBdID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9zdGF0KHN0cnVjdCBzdGF0ICpzdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyIHN0clsyMF07CisJY2hhciBzWzY0XSwgKnA7CisKKwlpZiAoc3QtPnN0X210aW1lID09ICh0aW1lX3QpKC0xKSkgLyogc29tZSBjdGltZXMgcmVhbGx5IGhhdGUgLTEgKi8KKwkJc3QtPnN0X210aW1lID0gMTsKKworCWN0aW1lX3IoJnN0LT5zdF9tdGltZSwgcy8qLDY0Ki8pOyAvKiBuZXdsaWIgY3RpbWUgZG9lc24ndCBoYXZlIGJ1ZmxlbiAqLworCisJaWYgKChwID0gc3RyY2hyKHMsJ1xuJykpICE9IE5VTEwpICpwID0gJ1wwJzsKKwlpZiAoKHAgPSBzdHJjaHIocywnXHInKSkgIT0gTlVMTCkgKnAgPSAnXDAnOworCisvKgorCXByaW50ZigiJTZsbyAlcyAlOGxkICVzICVzXG4iLCBzdC0+c3RfbW9kZSwgbWttb2Rlc3RyKHN0LT5zdF9tb2RlLCBzdHIpLAorCQlzdC0+c3Rfc2l6ZSwgcywgbmFtZSk7CisqLworCisJcHJpbnRmKCIgJXMgJThsZCAlcyAlcyIsIG1rbW9kZXN0cihzdC0+c3RfbW9kZSxzdHIpLCBzdC0+c3Rfc2l6ZSwgcywgbmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitkdW1wX2lub2RlKHN0cnVjdCBiX2xpc3RzICpwTCwgc3RydWN0IGJfZGlyZW50ICpkLCBzdHJ1Y3QgYl9pbm9kZSAqaSkKK3sKKwljaGFyIGZuYW1lW0pGRlMyX01BWF9OQU1FX0xFTiArIDFdOworCXN0cnVjdCBzdGF0IHN0OworCXNpemVfdCBsZW47CisKKwlpZighZCB8fCAhaSkgcmV0dXJuIC0xOworCWxlbiA9IGQtPm5zaXplOworCW5hbmRfcmVhZChuYW5kLCBkLT5vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpLAorCQkgICZsZW4sICZmbmFtZSk7CisJZm5hbWVbZC0+bnNpemVdID0gJ1wwJzsKKworCW1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOworCisJamZmczJfMXBhc3NfcmVhZF9pbm9kZShwTCwgaS0+aW5vLCBOVUxMLCAmc3QpOworCisJZHVtcF9zdGF0KCZzdCwgZm5hbWUpOworLyogRklYTUUKKwlpZiAoZC0+dHlwZSA9PSBEVF9MTkspIHsKKwkJdW5zaWduZWQgY2hhciAqc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgKCZpWzFdKTsKKwkgICAgICAgIHB1dHN0cigiIC0+ICIpOworCQlwdXRuc3RyKHNyYywgKGludClpLT5kc2l6ZSk7CisJfQorKi8KKwlwdXRzdHIoIlxyXG4iKTsKKworCXJldHVybiAwOworfQorCisvKiBsaXN0IGlub2RlcyB3aXRoIHRoZSBnaXZlbiBwaW5vICovCitzdGF0aWMgdTMyCitqZmZzMl8xcGFzc19saXN0X2lub2RlcyhzdHJ1Y3QgYl9saXN0cyAqIHBMLCB1MzIgcGlubykKK3sKKwlzdHJ1Y3QgYl9kaXJlbnQgKmpEaXI7CisJdTMyIGlfdmVyc2lvbiA9IDA7CisKKwlmb3IgKGpEaXIgPSAoc3RydWN0IGJfZGlyZW50ICopcEwtPmRpci5saXN0SGVhZDsgakRpcjsgakRpciA9IGpEaXItPm5leHQpIHsKKwkJaWYgKChwaW5vID09IGpEaXItPnBpbm8pICYmIChqRGlyLT5pbm8pKSB7IC8qIGlubz0wIC0+IHVubGluayAqLworCQkJc3RydWN0IGJfaW5vZGUgKmpOb2RlID0gKHN0cnVjdCBiX2lub2RlICopcEwtPmZyYWcubGlzdEhlYWQ7CisJCQlzdHJ1Y3QgYl9pbm9kZSAqaSA9IE5VTEw7CisKKwkJCXdoaWxlIChqTm9kZSkgeworCQkJCWlmIChqTm9kZS0+aW5vID09IGpEaXItPmlubyAmJiBqTm9kZS0+dmVyc2lvbiA+PSBpX3ZlcnNpb24pIHsKKwkJCQkJaV92ZXJzaW9uID0gak5vZGUtPnZlcnNpb247CisJCQkJCWkgPSBqTm9kZTsKKwkJCQl9CisJCQkJak5vZGUgPSBqTm9kZS0+bmV4dDsKKwkJCX0KKwkJCWR1bXBfaW5vZGUocEwsIGpEaXIsIGkpOworCQl9CisJfQorCXJldHVybiBwaW5vOworfQorCitzdGF0aWMgdTMyCitqZmZzMl8xcGFzc19zZWFyY2hfaW5vZGUoc3RydWN0IGJfbGlzdHMgKiBwTCwgY29uc3QgY2hhciAqZm5hbWUsIHUzMiBwaW5vKQoreworCWludCBpOworCWNoYXIgdG1wWzI1Nl07CisJY2hhciB3b3JraW5nX3RtcFsyNTZdOworCWNoYXIgKmM7CisKKwkvKiBkaXNjYXJkIGFueSBsZWFkaW5nIHNsYXNoICovCisJaSA9IDA7CisJd2hpbGUgKGZuYW1lW2ldID09ICcvJykKKwkJaSsrOworCXN0cmNweSh0bXAsICZmbmFtZVtpXSk7CisKKwl3aGlsZSAoKGMgPSAoY2hhciAqKSBzdHJjaHIodG1wLCAnLycpKSkJLyogd2UgYXJlIHN0aWxsIGRpcmVkIHNlYXJjaGluZyAqLworCXsKKwkJc3RybmNweSh3b3JraW5nX3RtcCwgdG1wLCBjIC0gdG1wKTsKKwkJd29ya2luZ190bXBbYyAtIHRtcF0gPSAnXDAnOworI2lmIDAKKwkJcHV0c3RyKCJzZWFyY2hfaW5vZGU6IHRtcCA9ICIpOworCQlwdXRzdHIodG1wKTsKKwkJcHV0c3RyKCJcclxuIik7CisJCXB1dHN0cigic2VhcmNoX2lub2RlOiB3dG1wID0gIik7CisJCXB1dHN0cih3b3JraW5nX3RtcCk7CisJCXB1dHN0cigiXHJcbiIpOworCQlwdXRzdHIoInNlYXJjaF9pbm9kZTogYyA9ICIpOworCQlwdXRzdHIoYyk7CisJCXB1dHN0cigiXHJcbiIpOworI2VuZGlmCisJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oYykgLSAxOyBpKyspCisJCQl0bXBbaV0gPSBjW2kgKyAxXTsKKwkJdG1wW2ldID0gJ1wwJzsKKyNpZiAwCisJCXB1dHN0cigic2VhcmNoX2lub2RlOiBwb3N0IHRtcCA9ICIpOworCQlwdXRzdHIodG1wKTsKKwkJcHV0c3RyKCJcclxuIik7CisjZW5kaWYKKworCQlpZiAoIShwaW5vID0gamZmczJfMXBhc3NfZmluZF9pbm9kZShwTCwgd29ya2luZ190bXAsIHBpbm8pKSkgeworCQkJcHV0c3RyKCJmaW5kX2lub2RlIGZhaWxlZCBmb3IgbmFtZT0iKTsKKwkJCXB1dHN0cih3b3JraW5nX3RtcCk7CisJCQlwdXRzdHIoIlxyXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIHRoaXMgaXMgZm9yIHRoZSBiYXJlIGZpbGVuYW1lLCBkaXJlY3RvcmllcyBoYXZlIGFscmVhZHkgYmVlbiBtYXBwZWQgKi8KKwlpZiAoIShwaW5vID0gamZmczJfMXBhc3NfZmluZF9pbm9kZShwTCwgdG1wLCBwaW5vKSkpIHsKKwkJcHV0c3RyKCJmaW5kX2lub2RlIGZhaWxlZCBmb3IgbmFtZT0iKTsKKwkJcHV0c3RyKHRtcCk7CisJCXB1dHN0cigiXHJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHBpbm87CisKK30KKworc3RhdGljIHUzMgoramZmczJfMXBhc3NfcmVzb2x2ZV9pbm9kZShzdHJ1Y3QgYl9saXN0cyAqIHBMLCB1MzIgaW5vKQoreworCXN0cnVjdCBiX2RpcmVudCAqakRpcjsKKwlzdHJ1Y3QgYl9pbm9kZSAqak5vZGU7CisJdTggakRpckZvdW5kVHlwZSA9IDA7CisJdTMyIGpEaXJGb3VuZElubyA9IDA7CisJdTMyIGpEaXJGb3VuZFBpbm8gPSAwOworCWNoYXIgdG1wW0pGRlMyX01BWF9OQU1FX0xFTiArIDFdOworCXUzMiB2ZXJzaW9uID0gMDsKKwl1MzIgcGlubzsKKworCS8qIHdlIG5lZWQgdG8gc2VhcmNoIGFsbCBhbmQgcmV0dXJuIHRoZSBpbm9kZSB3aXRoIHRoZSBoaWdoZXN0IHZlcnNpb24gKi8KKwlmb3IgKGpEaXIgPSAoc3RydWN0IGJfZGlyZW50ICopcEwtPmRpci5saXN0SGVhZDsgakRpcjsgakRpciA9IGpEaXItPm5leHQpIHsKKwkJaWYgKGlubyA9PSBqRGlyLT5pbm8pIHsKKwkJCWlmIChqRGlyLT52ZXJzaW9uIDwgdmVyc2lvbikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGpEaXItPnZlcnNpb24gPT0gdmVyc2lvbiAmJiBqRGlyRm91bmRUeXBlKSB7CisJCQkJLyogSSdtIHByZXR0eSBzdXJlIHRoaXMgaXNuJ3QgbGVnYWwgKi8KKwkJCQlwdXRzdHIoIiAqKiBFUlJPUiAqKiAiKTsKKy8qCQkJCXB1dG5zdHIoakRpci0+bmFtZSwgakRpci0+bnNpemUpOyAqLworLyoJCQkJcHV0TGFiZWxlZFdvcmQoIiBoYXMgZHVwIHZlcnNpb24gKHJlc29sdmUpID0gIiwgKi8KKy8qCQkJCQl2ZXJzaW9uKTsgKi8KKwkJCX0KKworCQkJakRpckZvdW5kVHlwZSA9IGpEaXItPnR5cGU7CisJCQlqRGlyRm91bmRJbm8gPSBqRGlyLT5pbm87CisJCQlqRGlyRm91bmRQaW5vID0gakRpci0+cGlubzsKKwkJCXZlcnNpb24gPSBqRGlyLT52ZXJzaW9uOworCQl9CisJfQorCS8qIG5vdyB3ZSBmb3VuZCB0aGUgcmlnaHQgZW50cnkgYWdhaW4uIChzaG91bGRhIHJldHVybmVkIGlub2RlKikgKi8KKwlpZiAoakRpckZvdW5kVHlwZSAhPSBEVF9MTkspCisJCXJldHVybiBqRGlyRm91bmRJbm87CisKKwkvKiBpdCdzIGEgc29mdCBsaW5rIHNvIHdlIGZvbGxvdyBpdCBhZ2Fpbi4gKi8KKwlmb3IgKGpOb2RlID0gKHN0cnVjdCBiX2lub2RlICopcEwtPmZyYWcubGlzdEhlYWQ7IGpOb2RlOyBqTm9kZSA9IGpOb2RlLT5uZXh0KSB7CisJCWlmIChqTm9kZS0+aW5vID09IGpEaXJGb3VuZElubykgeworCQkJc2l6ZV90IGxlbiA9IGpOb2RlLT5jc2l6ZTsKKwkJCW5hbmRfcmVhZChuYW5kLCBqTm9kZS0+b2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpLCAmbGVuLCAmdG1wKTsKKwkJCXRtcFtqTm9kZS0+Y3NpemVdID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIG9rIHNvIHRoZSBuYW1lIG9mIHRoZSBuZXcgZmlsZSB0byBmaW5kIGlzIGluIHRtcCAqLworCS8qIGlmIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2ggaXQgaXMgcm9vdCBiYXNlZCBlbHNlIHNoYXJlZCBkaXJzICovCisJaWYgKHRtcFswXSA9PSAnLycpCisJCXBpbm8gPSAxOworCWVsc2UKKwkJcGlubyA9IGpEaXJGb3VuZFBpbm87CisKKwlyZXR1cm4gamZmczJfMXBhc3Nfc2VhcmNoX2lub2RlKHBMLCB0bXAsIHBpbm8pOworfQorCitzdGF0aWMgdTMyCitqZmZzMl8xcGFzc19zZWFyY2hfbGlzdF9pbm9kZXMoc3RydWN0IGJfbGlzdHMgKiBwTCwgY29uc3QgY2hhciAqZm5hbWUsIHUzMiBwaW5vKQoreworCWludCBpOworCWNoYXIgdG1wWzI1Nl07CisJY2hhciB3b3JraW5nX3RtcFsyNTZdOworCWNoYXIgKmM7CisKKwkvKiBkaXNjYXJkIGFueSBsZWFkaW5nIHNsYXNoICovCisJaSA9IDA7CisJd2hpbGUgKGZuYW1lW2ldID09ICcvJykKKwkJaSsrOworCXN0cmNweSh0bXAsICZmbmFtZVtpXSk7CisJd29ya2luZ190bXBbMF0gPSAnXDAnOworCXdoaWxlICgoYyA9IChjaGFyICopIHN0cmNocih0bXAsICcvJykpKQkvKiB3ZSBhcmUgc3RpbGwgZGlyZWQgc2VhcmNoaW5nICovCisJeworCQlzdHJuY3B5KHdvcmtpbmdfdG1wLCB0bXAsIGMgLSB0bXApOworCQl3b3JraW5nX3RtcFtjIC0gdG1wXSA9ICdcMCc7CisJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oYykgLSAxOyBpKyspCisJCQl0bXBbaV0gPSBjW2kgKyAxXTsKKwkJdG1wW2ldID0gJ1wwJzsKKwkJLyogb25seSBhIGZhaWx1cmUgaWYgd2UgYXJlbnQgbG9va2luZyBhdCB0b3AgbGV2ZWwgKi8KKwkJaWYgKCEocGlubyA9IGpmZnMyXzFwYXNzX2ZpbmRfaW5vZGUocEwsIHdvcmtpbmdfdG1wLCBwaW5vKSkgJiYKKwkJICAgICh3b3JraW5nX3RtcFswXSkpIHsKKwkJCXB1dHN0cigiZmluZF9pbm9kZSBmYWlsZWQgZm9yIG5hbWU9Iik7CisJCQlwdXRzdHIod29ya2luZ190bXApOworCQkJcHV0c3RyKCJcclxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICh0bXBbMF0gJiYgIShwaW5vID0gamZmczJfMXBhc3NfZmluZF9pbm9kZShwTCwgdG1wLCBwaW5vKSkpIHsKKwkJcHV0c3RyKCJmaW5kX2lub2RlIGZhaWxlZCBmb3IgbmFtZT0iKTsKKwkJcHV0c3RyKHRtcCk7CisJCXB1dHN0cigiXHJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyogdGhpcyBpcyBmb3IgdGhlIGJhcmUgZmlsZW5hbWUsIGRpcmVjdG9yaWVzIGhhdmUgYWxyZWFkeSBiZWVuIG1hcHBlZCAqLworCWlmICghKHBpbm8gPSBqZmZzMl8xcGFzc19saXN0X2lub2RlcyhwTCwgcGlubykpKSB7CisJCXB1dHN0cigiZmluZF9pbm9kZSBmYWlsZWQgZm9yIG5hbWU9Iik7CisJCXB1dHN0cih0bXApOworCQlwdXRzdHIoIlxyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBwaW5vOworCit9CisKK3Vuc2lnbmVkIGNoYXIKK2pmZnMyXzFwYXNzX3Jlc2Nhbl9uZWVkZWQoc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKK3sKKwlzdHJ1Y3QgYl9ub2RlICpiOworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgb25vZGU7CisJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYl9saXN0cyAqcEwgPSAoc3RydWN0IGJfbGlzdHMgKilwYXJ0LT5qZmZzMl9wcml2OworCisJaWYgKHBhcnQtPmpmZnMyX3ByaXYgPT0gMCl7CisJCURFQlVHRiAoInJlc2NhbjogRmlyc3QgdGltZSBpbiB1c2VcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogaWYgd2UgaGF2ZSBubyBsaXN0LCB3ZSBuZWVkIHRvIHJlc2NhbiAqLworCWlmIChwTC0+ZnJhZy5saXN0Q291bnQgPT0gMCkgeworCQlERUJVR0YgKCJyZXNjYW46IGZyYWdsaXN0IHplcm9cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBvciBpZiB3ZSBhcmUgc2Nhbm5pbmcgYSBuZXcgcGFydGl0aW9uICovCisJaWYgKHBMLT5wYXJ0T2Zmc2V0ICE9IHBhcnQtPm9mZnNldCkgeworCQlERUJVR0YgKCJyZXNjYW46IGRpZmZlcmVudCBwYXJ0aXRpb25cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGSVhNRSAqLworI2lmIDAKKwkvKiBidXQgc3VwcG9zZSBzb21lb25lIHJlZmxhc2hlZCBhIHBhcnRpdGlvbiBhdCB0aGUgc2FtZSBvZmZzZXQuLi4gKi8KKwliID0gcEwtPmRpci5saXN0SGVhZDsKKwl3aGlsZSAoYikgeworCQlub2RlID0gKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgKikgZ2V0X2ZsX21lbShiLT5vZmZzZXQsCisJCQlzaXplb2Yob25vZGUpLCAmb25vZGUpOworCQlpZiAobm9kZS0+bm9kZXR5cGUgIT0gSkZGUzJfTk9ERVRZUEVfRElSRU5UKSB7CisJCQlERUJVR0YgKCJyZXNjYW46IGZzIGNoYW5nZWQgYmVuZWF0aCBtZT8gKCVseClcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nKSBiLT5vZmZzZXQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYiA9IGItPm5leHQ7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVR19GUkFHTUVOVFMKK3N0YXRpYyB2b2lkCitkdW1wX2ZyYWdtZW50cyhzdHJ1Y3QgYl9saXN0cyAqcEwpCit7CisJc3RydWN0IGJfbm9kZSAqYjsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIG9qTm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpqTm9kZTsKKworCXB1dHN0cigiXHJcblxyXG4qKioqKipUaGUgZnJhZ21lbnQgRW50cmllcyoqKioqKlxyXG4iKTsKKwliID0gcEwtPmZyYWcubGlzdEhlYWQ7CisJd2hpbGUgKGIpIHsKKwkJak5vZGUgPSAoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqKSBnZXRfZmxfbWVtKGItPm9mZnNldCwKKwkJCXNpemVvZihvak5vZGUpLCAmb2pOb2RlKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlxyXG5cdGJ1aWxkX2xpc3Q6IEZMQVNIX09GRlNFVCA9ICIsIGItPm9mZnNldCk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IHRvdGxlbiA9ICIsIGpOb2RlLT50b3RsZW4pOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiBpbm9kZSA9ICIsIGpOb2RlLT5pbm8pOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiB2ZXJzaW9uID0gIiwgak5vZGUtPnZlcnNpb24pOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiBpc2l6ZSA9ICIsIGpOb2RlLT5pc2l6ZSk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IGF0aW1lID0gIiwgak5vZGUtPmF0aW1lKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlx0YnVpbGRfbGlzdDogb2Zmc2V0ID0gIiwgak5vZGUtPm9mZnNldCk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IGNzaXplID0gIiwgak5vZGUtPmNzaXplKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlx0YnVpbGRfbGlzdDogZHNpemUgPSAiLCBqTm9kZS0+ZHNpemUpOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiBjb21wciA9ICIsIGpOb2RlLT5jb21wcik7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IHVzZXJjb21wciA9ICIsIGpOb2RlLT51c2VyY29tcHIpOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiBmbGFncyA9ICIsIGpOb2RlLT5mbGFncyk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IG9mZnNldCA9ICIsIGItPm9mZnNldCk7CS8qIEZJWE1FOiA/IFtSU10gKi8KKwkJYiA9IGItPm5leHQ7CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19ESVJFTlRTCitzdGF0aWMgdm9pZAorZHVtcF9kaXJlbnRzKHN0cnVjdCBiX2xpc3RzICpwTCkKK3sKKwlzdHJ1Y3QgYl9ub2RlICpiOworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpqRGlyOworCisJcHV0c3RyKCJcclxuXHJcbioqKioqKlRoZSBkaXJlY3RvcnkgRW50cmllcyoqKioqKlxyXG4iKTsKKwliID0gcEwtPmRpci5saXN0SGVhZDsKKwl3aGlsZSAoYikgeworCQlqRGlyID0gKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICopIGdldF9ub2RlX21lbShiLT5vZmZzZXQpOworCQlwdXRzdHIoIlxyXG4iKTsKKwkJcHV0bnN0cihqRGlyLT5uYW1lLCBqRGlyLT5uc2l6ZSk7CisJCXB1dExhYmVsZWRXb3JkKCJcclxuXHRidWlsZF9saXN0OiBtYWdpYyA9ICIsIGpEaXItPm1hZ2ljKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlx0YnVpbGRfbGlzdDogbm9kZXR5cGUgPSAiLCBqRGlyLT5ub2RldHlwZSk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IGhkcl9jcmMgPSAiLCBqRGlyLT5oZHJfY3JjKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlx0YnVpbGRfbGlzdDogcGlubyA9ICIsIGpEaXItPnBpbm8pOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiB2ZXJzaW9uID0gIiwgakRpci0+dmVyc2lvbik7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IGlubyA9ICIsIGpEaXItPmlubyk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IG1jdGltZSA9ICIsIGpEaXItPm1jdGltZSk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IG5zaXplID0gIiwgakRpci0+bnNpemUpOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiB0eXBlID0gIiwgakRpci0+dHlwZSk7CisJCXB1dExhYmVsZWRXb3JkKCJcdGJ1aWxkX2xpc3Q6IG5vZGVfY3JjID0gIiwgakRpci0+bm9kZV9jcmMpOworCQlwdXRMYWJlbGVkV29yZCgiXHRidWlsZF9saXN0OiBuYW1lX2NyYyA9ICIsIGpEaXItPm5hbWVfY3JjKTsKKwkJcHV0TGFiZWxlZFdvcmQoIlx0YnVpbGRfbGlzdDogb2Zmc2V0ID0gIiwgYi0+b2Zmc2V0KTsgCS8qIEZJWE1FOiA/IFtSU10gKi8KKwkJYiA9IGItPm5leHQ7CisJCXB1dF9mbF9tZW0oakRpcik7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2pmZnMyX2ZpbGxfc2Nhbl9idWYobmFuZF9pbmZvX3QgKm5hbmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJICAgIHVuc2lnbmVkIG9mcywgdW5zaWduZWQgbGVuKQoreworCWludCByZXQ7CisJdW5zaWduZWQgb2xlbjsKKworCW9sZW4gPSBsZW47CisJcmV0ID0gbmFuZF9yZWFkKG5hbmQsIG9mcywgJm9sZW4sIGJ1Zik7CisJaWYgKHJldCkgeworCQlwcmludGYoIm5hbmRfcmVhZCgweCV4IGJ5dGVzIGZyb20gMHgleCkgcmV0dXJuZWQgJWRcbiIsIGxlbiwgb2ZzLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAob2xlbiA8IGxlbikgeworCQlwcmludGYoIlJlYWQgYXQgMHgleCBnYXZlIG9ubHkgMHgleCBieXRlc1xuIiwgb2ZzLCBvbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZQlFTVBUWV9TQ0FOX1NJWkUJMTAyNAorc3RhdGljIHUzMgoramZmczJfMXBhc3NfYnVpbGRfbGlzdHMoc3RydWN0IHBhcnRfaW5mbyAqIHBhcnQpCit7CisJc3RydWN0IGJfbGlzdHMgKnBMOworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgKm5vZGU7CisJdW5zaWduZWQgbnJfYmxvY2tzLCBzZWN0b3JzaXplLCBvZnMsIG9mZnNldDsKKwljaGFyICpidWY7CisJaW50IGk7CisJdTMyIGNvdW50ZXIgPSAwOworCXUzMiBjb3VudGVyNCA9IDA7CisJdTMyIGNvdW50ZXJGID0gMDsKKwl1MzIgY291bnRlck4gPSAwOworCisJc3RydWN0IG10ZGlkcyAqaWQgPSBwYXJ0LT5kZXYtPmlkOworCW5hbmQgPSBuYW5kX2luZm8gKyBpZC0+bnVtOworCisJLyogaWYgd2UgYXJlIGJ1aWxkaW5nIGEgbGlzdCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGNhY2hlLiAqLworCWpmZnNfaW5pdF8xcGFzc19saXN0KHBhcnQpOworCXBMID0gKHN0cnVjdCBiX2xpc3RzICopcGFydC0+amZmczJfcHJpdjsKKwlwTC0+cGFydE9mZnNldCA9IHBhcnQtPm9mZnNldDsKKwlwdXRzICgiU2Nhbm5pbmcgSkZGUzIgRlM6ICAgIik7CisKKwlzZWN0b3JzaXplID0gbmFuZC0+ZXJhc2VzaXplOworCW5yX2Jsb2NrcyA9IHBhcnQtPnNpemUgLyBzZWN0b3JzaXplOworCWJ1ZiA9IG1hbGxvYyhzZWN0b3JzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmxvY2tzOyBpKyspIHsKKwkJcHJpbnRmKCJcYlxiJWMgIiwgc3Bpbm5lcltjb3VudGVyKysgJSBzaXplb2Yoc3Bpbm5lcildKTsKKworCQlvZmZzZXQgPSBwYXJ0LT5vZmZzZXQgKyBpICogc2VjdG9yc2l6ZTsKKworCQlpZiAobmFuZF9ibG9ja19pc2JhZChuYW5kLCBvZmZzZXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGpmZnMyX2ZpbGxfc2Nhbl9idWYobmFuZCwgYnVmLCBvZmZzZXQsIEVNUFRZX1NDQU5fU0laRSkpCisJCQlyZXR1cm4gMDsKKworCQlvZnMgPSAwOworCQkvKiBTY2FuIG9ubHkgNEtpQiBvZiAweEZGIGJlZm9yZSBkZWNsYXJpbmcgaXQncyBlbXB0eSAqLworCQl3aGlsZSAob2ZzIDwgRU1QVFlfU0NBTl9TSVpFICYmICoodWludDMyX3QgKikoJmJ1ZltvZnNdKSA9PSAweEZGRkZGRkZGKQorCQkJb2ZzICs9IDQ7CisJCWlmIChvZnMgPT0gRU1QVFlfU0NBTl9TSVpFKQorCQkJY29udGludWU7CisKKwkJaWYgKGpmZnMyX2ZpbGxfc2Nhbl9idWYobmFuZCwgYnVmICsgRU1QVFlfU0NBTl9TSVpFLCBvZmZzZXQgKyBFTVBUWV9TQ0FOX1NJWkUsIHNlY3RvcnNpemUgLSBFTVBUWV9TQ0FOX1NJWkUpKQorCQkJcmV0dXJuIDA7CisJCW9mZnNldCArPSBvZnM7CisKKwkJd2hpbGUgKG9mcyA8IHNlY3RvcnNpemUgLSBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkpIHsKKwkJCW5vZGUgPSAoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSAqKSZidWZbb2ZzXTsKKwkJCWlmIChub2RlLT5tYWdpYyAhPSBKRkZTMl9NQUdJQ19CSVRNQVNLIHx8ICFoZHJfY3JjKG5vZGUpKSB7CisJCQkJb2Zmc2V0ICs9IDQ7CisJCQkJb2ZzICs9IDQ7CisJCQkJY291bnRlcjQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIGlmIGl0cyBhIGZyYWdtZW50IGFkZCBpdCAqLworCQkJaWYgKG5vZGUtPm5vZGV0eXBlID09IEpGRlMyX05PREVUWVBFX0lOT0RFICYmCisJCQkJICAgIGlub2RlX2NyYygoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqKSBub2RlKSkgeworCQkJCWlmIChpbnNlcnRfaW5vZGUoJnBMLT5mcmFnLCAoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqKSBub2RlLAorCQkJCQkJIG9mZnNldCkgPT0gTlVMTCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKG5vZGUtPm5vZGV0eXBlID09IEpGRlMyX05PREVUWVBFX0RJUkVOVCAmJgorCQkJCSAgIGRpcmVudF9jcmMoKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICopIG5vZGUpICAmJgorCQkJCSAgIGRpcmVudF9uYW1lX2NyYygoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKikgbm9kZSkpIHsKKwkJCQlpZiAoISAoY291bnRlck4lMTAwKSkKKwkJCQkJcHV0cyAoIlxiXGIuICAiKTsKKwkJCQlpZiAoaW5zZXJ0X2RpcmVudCgmcEwtPmRpciwgKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICopIG5vZGUsCisJCQkJCQkgIG9mZnNldCkgPT0gTlVMTCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJY291bnRlck4rKzsKKwkJCX0gZWxzZSBpZiAobm9kZS0+bm9kZXR5cGUgPT0gSkZGUzJfTk9ERVRZUEVfQ0xFQU5NQVJLRVIpIHsKKwkJCQlpZiAobm9kZS0+dG90bGVuICE9IHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSkKKwkJCQkJcHJpbnRmKCJPT1BTIENsZWFubWFya2VyIGhhcyBiYWQgc2l6ZSAiCisJCQkJCQkiJWQgIT0gJWRcbiIsIG5vZGUtPnRvdGxlbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSk7CisJCQl9IGVsc2UgaWYgKG5vZGUtPm5vZGV0eXBlID09IEpGRlMyX05PREVUWVBFX1BBRERJTkcpIHsKKwkJCQlpZiAobm9kZS0+dG90bGVuIDwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKQorCQkJCQlwcmludGYoIk9PUFMgUGFkZGluZyBoYXMgYmFkIHNpemUgIgorCQkJCQkJIiVkIDwgJWRcbiIsIG5vZGUtPnRvdGxlbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiVW5rbm93biBub2RlIHR5cGU6ICV4IGxlbiAlZCAiCisJCQkJCSJvZmZzZXQgMHgleFxuIiwgbm9kZS0+bm9kZXR5cGUsCisJCQkJCW5vZGUtPnRvdGxlbiwgb2Zmc2V0KTsKKwkJCX0KKwkJCW9mZnNldCArPSAoKG5vZGUtPnRvdGxlbiArIDMpICYgfjMpOworCQkJb2ZzICs9ICgobm9kZS0+dG90bGVuICsgMykgJiB+Myk7CisJCQljb3VudGVyRisrOworCQl9CisJfQorCisJcHV0c3RyKCJcYlxiIGRvbmUuXHJcbiIpOwkJLyogY2xvc2Ugb2ZmIHRoZSBkb3RzICovCisKKyNpZiAwCisJcHV0TGFiZWxlZFdvcmQoImRpciBlbnRyaWVzID0gIiwgcEwtPmRpci5saXN0Q291bnQpOworCXB1dExhYmVsZWRXb3JkKCJmcmFnIGVudHJpZXMgPSAiLCBwTC0+ZnJhZy5saXN0Q291bnQpOworCXB1dExhYmVsZWRXb3JkKCIrNCBpbmNyZW1lbnRzID0gIiwgY291bnRlcjQpOworCXB1dExhYmVsZWRXb3JkKCIrZmlsZV9vZmZzZXQgaW5jcmVtZW50cyA9ICIsIGNvdW50ZXJGKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfRElSRU5UUworCWR1bXBfZGlyZW50cyhwTCk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0ZSQUdNRU5UUworCWR1bXBfZnJhZ21lbnRzKHBMKTsKKyNlbmRpZgorCisJLyogZ2l2ZSB2aXN1YWwgZmVlZGJhY2sgdGhhdCB3ZSBhcmUgZG9uZSBzY2FubmluZyB0aGUgZmxhc2ggKi8KKwlsZWRfYmxpbmsoMHgwLCAweDAsIDB4MSwgMHgxKTsJLyogb2ZmLCBmb3JldmVyLCBvbiAxMDBtcywgb2ZmIDEwMG1zICovCisJZnJlZShidWYpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHUzMgoramZmczJfMXBhc3NfZmlsbF9pbmZvKHN0cnVjdCBiX2xpc3RzICogcEwsIHN0cnVjdCBiX2pmZnMyX2luZm8gKiBwaUwpCit7CisJc3RydWN0IGJfbm9kZSAqYjsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIG9qTm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpqTm9kZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBKRkZTMl9OVU1fQ09NUFI7IGkrKykgeworCQlwaUwtPmNvbXByX2luZm9baV0ubnVtX2ZyYWdzID0gMDsKKwkJcGlMLT5jb21wcl9pbmZvW2ldLmNvbXByX3N1bSA9IDA7CisJCXBpTC0+Y29tcHJfaW5mb1tpXS5kZWNvbXByX3N1bSA9IDA7CisJfQorLyoJRklYTUUKKwliID0gcEwtPmZyYWcubGlzdEhlYWQ7CisJd2hpbGUgKGIpIHsKKwkJak5vZGUgPSAoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqKSBnZXRfZmxfbWVtKGItPm9mZnNldCwKKwkJCXNpemVvZihvak5vZGUpLCAmb2pOb2RlKTsKKwkJaWYgKGpOb2RlLT5jb21wciA8IEpGRlMyX05VTV9DT01QUikgeworCQkJcGlMLT5jb21wcl9pbmZvW2pOb2RlLT5jb21wcl0ubnVtX2ZyYWdzKys7CisJCQlwaUwtPmNvbXByX2luZm9bak5vZGUtPmNvbXByXS5jb21wcl9zdW0gKz0gak5vZGUtPmNzaXplOworCQkJcGlMLT5jb21wcl9pbmZvW2pOb2RlLT5jb21wcl0uZGVjb21wcl9zdW0gKz0gak5vZGUtPmRzaXplOworCQl9CisJCWIgPSBiLT5uZXh0OworCX0KKyovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBiX2xpc3RzICoKK2pmZnMyX2dldF9saXN0KHN0cnVjdCBwYXJ0X2luZm8gKiBwYXJ0LCBjb25zdCBjaGFyICp3aG8pCit7CisJaWYgKGpmZnMyXzFwYXNzX3Jlc2Nhbl9uZWVkZWQocGFydCkpIHsKKwkJaWYgKCFqZmZzMl8xcGFzc19idWlsZF9saXN0cyhwYXJ0KSkgeworCQkJcHJpbnRmKCIlczogRmFpbGVkIHRvIHNjYW4gSkZGU3YyIGZpbGUgc3RydWN0dXJlXG4iLCB3aG8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIChzdHJ1Y3QgYl9saXN0cyAqKXBhcnQtPmpmZnMyX3ByaXY7Cit9CisKKworLyogUHJpbnQgZGlyZWN0b3J5IC8gZmlsZSBjb250ZW50cyAqLwordTMyCitqZmZzMl8xcGFzc19scyhzdHJ1Y3QgcGFydF9pbmZvICogcGFydCwgY29uc3QgY2hhciAqZm5hbWUpCit7CisJc3RydWN0IGJfbGlzdHMgKnBsOworCWxvbmcgcmV0ID0gMDsKKwl1MzIgaW5vZGU7CisKKwlpZiAoISAocGwgPSBqZmZzMl9nZXRfbGlzdChwYXJ0LCAibHMiKSkpCisJCXJldHVybiAwOworCisJaWYgKCEgKGlub2RlID0gamZmczJfMXBhc3Nfc2VhcmNoX2xpc3RfaW5vZGVzKHBsLCBmbmFtZSwgMSkpKSB7CisJCXB1dHN0cigibHM6IEZhaWxlZCB0byBzY2FuIGpmZnMyIGZpbGUgc3RydWN0dXJlXHJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiAwCisJcHV0TGFiZWxlZFdvcmQoImZvdW5kIGZpbGUgYXQgaW5vZGUgPSAiLCBpbm9kZSk7CisJcHV0TGFiZWxlZFdvcmQoInJlYWRfaW5vZGUgcmV0dXJucyA9ICIsIHJldCk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKworLyogTG9hZCBhIGZpbGUgZnJvbSBmbGFzaCBpbnRvIG1lbW9yeS4gZm5hbWUgY2FuIGJlIGEgZnVsbCBwYXRoICovCit1MzIKK2pmZnMyXzFwYXNzX2xvYWQoY2hhciAqZGVzdCwgc3RydWN0IHBhcnRfaW5mbyAqIHBhcnQsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCisJc3RydWN0IGJfbGlzdHMgKnBsOworCWxvbmcgcmV0ID0gMDsKKwl1MzIgaW5vZGU7CisKKwlpZiAoISAocGwgPSBqZmZzMl9nZXRfbGlzdChwYXJ0LCAibG9hZCIpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoISAoaW5vZGUgPSBqZmZzMl8xcGFzc19zZWFyY2hfaW5vZGUocGwsIGZuYW1lLCAxKSkpIHsKKwkJcHV0c3RyKCJsb2FkOiBGYWlsZWQgdG8gZmluZCBpbm9kZVxyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVzb2x2ZSBzeW1saW5rcyAqLworCWlmICghIChpbm9kZSA9IGpmZnMyXzFwYXNzX3Jlc29sdmVfaW5vZGUocGwsIGlub2RlKSkpIHsKKwkJcHV0c3RyKCJsb2FkOiBGYWlsZWQgdG8gcmVzb2x2ZSBpbm9kZSBzdHJ1Y3R1cmVcclxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgocmV0ID0gamZmczJfMXBhc3NfcmVhZF9pbm9kZShwbCwgaW5vZGUsIGRlc3QsIE5VTEwpKSA8IDApIHsKKwkJcHV0c3RyKCJsb2FkOiBGYWlsZWQgdG8gcmVhZCBpbm9kZVxyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdGICgibG9hZDogbG9hZGVkICclcycgdG8gMHglbHggKCVsZCBieXRlcylcbiIsIGZuYW1lLAorCQkJCSh1bnNpZ25lZCBsb25nKSBkZXN0LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnMgb24gdGhpcyBwYXJ0aXRpb24gKi8KK3UzMgoramZmczJfMXBhc3NfaW5mbyhzdHJ1Y3QgcGFydF9pbmZvICogcGFydCkKK3sKKwlzdHJ1Y3QgYl9qZmZzMl9pbmZvIGluZm87CisJc3RydWN0IGJfbGlzdHMgKnBsOworCWludCBpOworCisJaWYgKCEgKHBsID0gamZmczJfZ2V0X2xpc3QocGFydCwgImluZm8iKSkpCisJCXJldHVybiAwOworCisJamZmczJfMXBhc3NfZmlsbF9pbmZvKHBsLCAmaW5mbyk7CisJZm9yIChpID0gMDsgaSA8IEpGRlMyX05VTV9DT01QUjsgaSsrKSB7CisJCXByaW50ZiAoIkNvbXByZXNzaW9uOiAlc1xuIgorCQkJIlx0ZnJhZyBjb3VudDogJWRcbiIKKwkJCSJcdGNvbXByZXNzZWQgc3VtOiAlZFxuIgorCQkJIlx0dW5jb21wcmVzc2VkIHN1bTogJWRcbiIsCisJCQljb21wcl9uYW1lc1tpXSwKKwkJCWluZm8uY29tcHJfaW5mb1tpXS5udW1fZnJhZ3MsCisJCQlpbmZvLmNvbXByX2luZm9baV0uY29tcHJfc3VtLAorCQkJaW5mby5jb21wcl9pbmZvW2ldLmRlY29tcHJfc3VtKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9uYW5kX3ByaXZhdGUuaCBiL2ZzL2pmZnMyL2pmZnMyX25hbmRfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2NhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9qZmZzMl9uYW5kX3ByaXZhdGUuaApAQCAtMCwwICsxLDEzMyBAQAorI2lmbmRlZiBqZmZzMl9wcml2YXRlX2gKKyNkZWZpbmUgamZmczJfcHJpdmF0ZV9oCisKKyNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgorCitzdHJ1Y3QgYl9ub2RlIHsKKwlzdHJ1Y3QgYl9ub2RlICpuZXh0OworfTsKKworc3RydWN0IGJfaW5vZGUgeworCXN0cnVjdCBiX2lub2RlICpuZXh0OworCXUzMiBvZmZzZXQ7CS8qIHBoeXNpY2FsIG9mZnNldCB0byBiZWdpbm5pbmcgb2YgcmVhbCBpbm9kZSAqLworCXUzMiB2ZXJzaW9uOworCXUzMiBpbm87CisJdTMyIGlzaXplOworCXUzMiBjc2l6ZTsKK307CisKK3N0cnVjdCBiX2RpcmVudCB7CisJc3RydWN0IGJfZGlyZW50ICpuZXh0OworCXUzMiBvZmZzZXQ7CS8qIHBoeXNpY2FsIG9mZnNldCB0byBiZWdpbm5pbmcgb2YgcmVhbCBkaXJlbnQgKi8KKwl1MzIgdmVyc2lvbjsKKwl1MzIgcGlubzsKKwl1MzIgaW5vOworCXVuc2lnbmVkIGludCBuaGFzaDsKKwl1bnNpZ25lZCBjaGFyIG5zaXplOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKK307CisKK3N0cnVjdCBiX2xpc3QgeworCXN0cnVjdCBiX25vZGUgKmxpc3RUYWlsOworCXN0cnVjdCBiX25vZGUgKmxpc3RIZWFkOworCXVuc2lnbmVkIGludCBsaXN0Q291bnQ7CisJc3RydWN0IG1lbV9ibG9jayAqbGlzdE1lbUJhc2U7Cit9OworCitzdHJ1Y3QgYl9saXN0cyB7CisJY2hhciAqcGFydE9mZnNldDsKKwlzdHJ1Y3QgYl9saXN0IGRpcjsKKwlzdHJ1Y3QgYl9saXN0IGZyYWc7Cit9OworCitzdHJ1Y3QgYl9jb21wcl9pbmZvIHsKKwl1MzIgbnVtX2ZyYWdzOworCXUzMiBjb21wcl9zdW07CisJdTMyIGRlY29tcHJfc3VtOworfTsKKworc3RydWN0IGJfamZmczJfaW5mbyB7CisJc3RydWN0IGJfY29tcHJfaW5mbyBjb21wcl9pbmZvW0pGRlMyX05VTV9DT01QUl07Cit9OworCitzdGF0aWMgaW5saW5lIGludAoraGRyX2NyYyhzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlICpub2RlKQoreworI2lmIDEKKwl1MzIgY3JjID0gY3JjMzJfbm9fY29tcCgwLCAodW5zaWduZWQgY2hhciAqKW5vZGUsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSAtIDQpOworI2Vsc2UKKwkvKiB3aGF0J3MgdGhlIHNlbWFudGljcyBvZiB0aGlzPyB3aHkgaXMgdGhpcyBoZXJlPyAqLworCXUzMiBjcmMgPSBjcmMzMl9ub19jb21wKH4wLCAodW5zaWduZWQgY2hhciAqKW5vZGUsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSAtIDQpOworCisJY3JjIF49IH4wOworI2VuZGlmCisJaWYgKG5vZGUtPmhkcl9jcmMgIT0gY3JjKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQKK2RpcmVudF9jcmMoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKm5vZGUpCit7CisJaWYgKG5vZGUtPm5vZGVfY3JjICE9IGNyYzMyX25vX2NvbXAoMCwgKHVuc2lnbmVkIGNoYXIgKilub2RlLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpIC0gOCkpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAorZGlyZW50X25hbWVfY3JjKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpub2RlKQoreworCWlmIChub2RlLT5uYW1lX2NyYyAhPSBjcmMzMl9ub19jb21wKDAsICh1bnNpZ25lZCBjaGFyICopJihub2RlLT5uYW1lKSwgbm9kZS0+bnNpemUpKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQKK2lub2RlX2NyYyhzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpub2RlKQoreworCWlmIChub2RlLT5ub2RlX2NyYyAhPSBjcmMzMl9ub19jb21wKDAsICh1bnNpZ25lZCBjaGFyICopbm9kZSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpIC0gOCkpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBCb3Jyb3dlZCBmcm9tIGluY2x1ZGUvbGludXgvZGNhY2hlLmggKi8KKworLyogTmFtZSBoYXNoaW5nIHJvdXRpbmVzLiBJbml0aWFsIGhhc2ggdmFsdWUgKi8KKy8qIEhhc2ggY291cnRlc3kgb2YgdGhlIFI1IGhhc2ggaW4gcmVpc2VyZnMgbW9kdWxvIHNpZ24gYml0cyAqLworI2RlZmluZSBpbml0X25hbWVfaGFzaCgpCQkwCisKKy8qIHBhcnRpYWwgaGFzaCB1cGRhdGUgZnVuY3Rpb24uIEFzc3VtZSByb3VnaGx5IDQgYml0cyBwZXIgY2hhcmFjdGVyICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3BhcnRpYWxfbmFtZV9oYXNoKHVuc2lnbmVkIGxvbmcgYywgdW5zaWduZWQgbG9uZyBwcmV2aGFzaCkKK3sKKwlyZXR1cm4gKHByZXZoYXNoICsgKGMgPDwgNCkgKyAoYyA+PiA0KSkgKiAxMTsKK30KKworLyoKKyAqIEZpbmFsbHk6IGN1dCBkb3duIHRoZSBudW1iZXIgb2YgYml0cyB0byBhIGludCB2YWx1ZSAoYW5kIHRyeSB0byBhdm9pZAorICogbG9zaW5nIGJpdHMpCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBlbmRfbmFtZV9oYXNoKHVuc2lnbmVkIGxvbmcgaGFzaCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgaGFzaDsKK30KKworLyogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgYSBuYW1lIHN0cmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitmdWxsX25hbWVfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJd2hpbGUgKGxlbi0tKQorCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goKm5hbWUrKywgaGFzaCk7CisJcmV0dXJuIGVuZF9uYW1lX2hhc2goaGFzaCk7Cit9CisKKyNlbmRpZiAvKiBqZmZzMl9wcml2YXRlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2lvLmgKaW5kZXggYzJiNjlmYi4uNjQ4YTEwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2lvLmgKQEAgLTU4LDYgKzU4LDE0IEBACiAjZGVmaW5lIF9fcmF3X3JlYWR3KGEpCQkJX19hcmNoX2dldHcoYSkKICNkZWZpbmUgX19yYXdfcmVhZGwoYSkJCQlfX2FyY2hfZ2V0bChhKQogCisjZGVmaW5lIHdyaXRlYih2LGEpCQkJX19hcmNoX3B1dGIodixhKQorI2RlZmluZSB3cml0ZXcodixhKQkJCV9fYXJjaF9wdXR3KHYsYSkKKyNkZWZpbmUgd3JpdGVsKHYsYSkJCQlfX2FyY2hfcHV0bCh2LGEpCisKKyNkZWZpbmUgcmVhZGIoYSkJCQlfX2FyY2hfZ2V0YihhKQorI2RlZmluZSByZWFkdyhhKQkJCV9fYXJjaF9nZXR3KGEpCisjZGVmaW5lIHJlYWRsKGEpCQkJX19hcmNoX2dldGwoYSkKKwogLyoKICAqIFRoZSBjb21waWxlciBzZWVtcyB0byBiZSBpbmNhcGFibGUgb2Ygb3B0aW1pc2luZyBjb25zdGFudHMKICAqIHByb3Blcmx5LiAgU3BlbGwgaXQgb3V0IHRvIHRoZSBjb21waWxlciBpbiBzb21lIGNhc2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oCmluZGV4IDk4NDE4OTMuLmQwM2MwNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BU0g0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVNINDA1LmgKQEAgLTEzMiw2ICsxMzIsOSBAQAogICogTkFORC1GTEFTSCBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisKKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKICNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzCQkqLwogI2RlZmluZSBTRUNUT1JTSVpFIDUxMgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQk1XLmggYi9pbmNsdWRlL2NvbmZpZ3MvQk1XLmgKaW5kZXggMDUwMDU0ZC4uM2JkNDNkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JNVy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CTVcuaApAQCAtNjksNiArNjksMTAgQEAKIAkJCQlDRkdfQ01EX0RPQwl8IFwKIAkJCQlDRkdfQ01EX0VMRgl8IFwKIAkJCQkwICkKKworLyogQ0ZHX0NNRF9ET0MgcmVxdWlyZWQgbGVnYWN5IE5BTkQgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogI2lmIDAKICNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAgKENPTkZJR19DTURfREZMCXwgQ0ZHX0NNRF9ESENQIHwgXAogCQkJCSBDRkdfQ01EX1BDSSB8IENGR19DTURfRE9DIHwgQ0ZHX0NNRF9EQVRFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oIGIvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oCmluZGV4IDYwMjU4ODYuLjFjY2EyODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DTVM3MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ01TNzAwLmgKQEAgLTgxLDYgKzgxLDggQEAKIC8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KICNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAorI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19TRFJBTV9CQU5LMAkxCS8qIGluaXQgb25ib2FyZCBTRFJBTSBiYW5rIDAJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oCmluZGV4IGVmYzNhZGEuLjA0N2UyZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaApAQCAtNzksNiArNzksOCBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaAppbmRleCAxMzQ3ZjJhLi5kNzU2ZjQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNTIuaApAQCAtMTAwLDYgKzEwMCw4IEBACiAvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCiAjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmgKaW5kZXggOWQ1MjgxNS4uODUyZDk0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVBQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaApAQCAtODcsNiArODcsOSBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCisKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmgKaW5kZXggOTQ2YTBmZC4uMjI2MDMyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaApAQCAtOTgsNiArOTgsOCBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQVTg2LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODYuaAppbmRleCAxNmE5ZWE1Li4xZTlhOTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BVODYuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODYuaApAQCAtMTc4LDYgKzE3OCw4IEBACiAvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCiAjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUFU4Ny5oIGIvaW5jbHVkZS9jb25maWdzL0NQVTg3LmgKaW5kZXggYTIzZDdlNS4uOWE5OGU1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQVTg3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQVTg3LmgKQEAgLTE4OSw2ICsxODksOCBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvR0VOODYwVC5oIGIvaW5jbHVkZS9jb25maWdzL0dFTjg2MFQuaAppbmRleCBkZThmN2FlLi42NjEzZjkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvR0VOODYwVC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmgKQEAgLTI4NCw2ICsyODQsOCBAQAogICovCiAjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKIC8qCiAgKiBWZXJib3NlIGhlbHAgZnJvbSBjb21tYW5kIG1vbml0b3IuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKaW5kZXggNGY2MmI4YS4uZGM0MGViYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKQEAgLTEzMCw2ICsxMzAsOCBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAjdW5kZWYgIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwogI3VuZGVmICBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oCmluZGV4IGViNjI3ZTguLmY4NGUzNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9IVUI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSFVCNDA1LmgKQEAgLTEzNSw2ICsxMzUsOCBAQAogICogTkFORC1GTEFTSCBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcwkJKi8KICNkZWZpbmUgU0VDVE9SU0laRSA1MTIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oCmluZGV4IGRiMjE0N2IuLjFmMDFlN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmgKQEAgLTg3LDYgKzg3LDggQEAKIC8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgIChpZiBhbnkpICovCiAjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKICNkZWZpbmUJIENGR19IVVNIX1BBUlNFUgogI2RlZmluZQkgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRQSE9ORS5oIGIvaW5jbHVkZS9jb25maWdzL05FVFBIT05FLmgKaW5kZXggYmY0Yzg5OS4uNDQ0ZjcyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL05FVFBIT05FLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFBIT05FLmgKQEAgLTQ5MSw2ICs0OTEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE5BTkQgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAjZGVmaW5lIENGR19OQU5EX0JBU0UJCU5BTkRfQkFTRQogI2RlZmluZSBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCiAjZGVmaW5lIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaAppbmRleCA1MjljYjRjLi5lMjBlNzI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFRBMi5oCkBAIC00OTEsNiArNDkxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBOQU5EICovCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogI2RlZmluZSBDRkdfTkFORF9CQVNFCQlOQU5EX0JBU0UKICNkZWZpbmUgQ09ORklHX01URF9OQU5EX0VDQ19KRkZTMgogI2RlZmluZSBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVklBLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVklBLmgKaW5kZXggZGM2YjE1Zi4uZTMwYmUwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL05FVFZJQS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaApAQCAtMzg3LDYgKzM4Nyw4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogI2lmIGRlZmluZWQoQ09ORklHX05FVFZJQV9WRVJTSU9OKSAmJiBDT05GSUdfTkVUVklBX1ZFUlNJT04gPj0gMgogCiAvKiBOQU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzIuaAppbmRleCBkMDM3MDZlLi4zYTk3ZmJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEMyLmgKQEAgLTc3LDYgKzc3LDcgQEAKICAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BDSVBQQzYuaCBiL2luY2x1ZGUvY29uZmlncy9QQ0lQUEM2LmgKaW5kZXggOTJiMmY3Yy4uMTMwYmViNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BDSVBQQzYuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oCkBAIC03OSw2ICs3OSw3IEBACiAgKi8KICNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAorI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QSVA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9QSVA0MDUuaAppbmRleCA5NjY4ZmIwLi4wOTFiNzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oCkBAIC02OSw2ICs2OSw4IEBACiAvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTICAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQorCiAjZGVmaW5lCSBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUJIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmgKaW5kZXggNTRlY2ZhNC4uZGQ1ZDgzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTFU0MDUuaApAQCAtMTYwLDYgKzE2MCw4IEBACiAgKiBOQU5ELUZMQVNIIHN0dWZmCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKICNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzCQkqLwogI2RlZmluZSBTRUNUT1JTSVpFIDUxMgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE01MjAuaCBiL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCmluZGV4IGU3M2FkNTEuLjljMjQxZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCkBAIC0xMDEsNiArMTAxLDggQEAKICNkZWZpbmUgQUREX0RPQ19DTUQgICAgICAgICAgICAgMAogI2Vsc2UKICNkZWZpbmUgQUREX0RPQ19DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9ET0MKKy8qIERvQyByZXF1aXJlcyBsZWdhY3kgTkFORCBmb3Igbm93ICovCisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE04MjYuaCBiL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCmluZGV4IDZlNWUzYmIuLjg4ZmRiNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCkBAIC0xODAsNiArMTgwLDggQEAKIC8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KICNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAorI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogLyoKICAqIERpc2stT24tQ2hpcCBjb25maWd1cmF0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTgyOC5oIGIvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKaW5kZXggOTgyYTFmOC4uMzdlZTk3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODI4LmgKQEAgLTE4Myw2ICsxODMsNyBAQAogLyoKICAqIERpc2stT24tQ2hpcCBjb25maWd1cmF0aW9uCiAgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKICNkZWZpbmUgQ0ZHX0RPQ19TSE9SVF9USU1FT1VUCiAjZGVmaW5lIENGR19NQVhfRE9DX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgRE9DIGRldmljZXMJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oIGIvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKaW5kZXggN2NhODI3Zi4uODhlNmRiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKQEAgLTE4OCwzNCArMTg4LDM0IEBACiAgKiBOQU5ELUZMQVNIIHN0dWZmCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKy8qCisgKiBuYW5kIGRldmljZSAxIG9uIGRhdmUgKFBQQ2hhbWVsZW9uRVZCKSBuZWVkcyBtb3JlIHRpbWUsCisgKiBzbyB3ZSBqdXN0IGludHJvZHVjZSBhZGRpdGlvbmFsIHdhaXQgaW4gbmFuZF93YWl0KCksCisgKiBlZmZlY3RpdmVseSBmb3IgYm90aCBkZXZpY2VzLgorICovCisjZGVmaW5lIFBQQ0hBTUVMT05fTkFORF9USU1FUl9IQUNLCisKICNkZWZpbmUgQ0ZHX05BTkQwX0JBU0UgMHhGRjQwMDAwMAogI2RlZmluZSBDRkdfTkFORDFfQkFTRSAweEZGMDAwMDAwCisjZGVmaW5lIENGR19OQU5EX0JBU0VfTElTVAl7IENGR19OQU5EMF9CQVNFLCBDRkdfTkFORDFfQkFTRSB9CisjZGVmaW5lIE5BTkRfQklHX0RFTEFZX1VTCTI1CisjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMgkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcyAqLwogCi0jZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMgkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcwkJKi8KLSNkZWZpbmUgU0VDVE9SU0laRSA1MTIKLSNkZWZpbmUgTkFORF9OT19SQgotCi0jZGVmaW5lIEFERFJfQ09MVU1OIDEKLSNkZWZpbmUgQUREUl9QQUdFIDIKLSNkZWZpbmUgQUREUl9DT0xVTU5fUEFHRSAzCi0KLSNkZWZpbmUgTkFORF9DaGlwSURfVU5LTk9XTgkweDAwCi0jZGVmaW5lIE5BTkRfTUFYX0ZMT09SUyAxCiAjZGVmaW5lIE5BTkRfTUFYX0NISVBTIDEKIAogI2RlZmluZSBDRkdfTkFORDBfQ0UgICgweDgwMDAwMDAwID4+IDEpCSAvKiBvdXIgQ0UgaXMgR1BJTzEgKi8KKyNkZWZpbmUgQ0ZHX05BTkQwX1JEWSAoMHg4MDAwMDAwMCA+PiA0KQkgLyogb3VyIFJEWSBpcyBHUElPNCAqLwogI2RlZmluZSBDRkdfTkFORDBfQ0xFICgweDgwMDAwMDAwID4+IDIpCSAvKiBvdXIgQ0xFIGlzIEdQSU8yICovCiAjZGVmaW5lIENGR19OQU5EMF9BTEUgKDB4ODAwMDAwMDAgPj4gMykJIC8qIG91ciBBTEUgaXMgR1BJTzMgKi8KLSNkZWZpbmUgQ0ZHX05BTkQwX1JEWSAoMHg4MDAwMDAwMCA+PiA0KQkgLyogb3VyIFJEWSBpcyBHUElPNCAqLwogCiAjZGVmaW5lIENGR19OQU5EMV9DRSAgKDB4ODAwMDAwMDAgPj4gMTQpICAvKiBvdXIgQ0UgaXMgR1BJTzE0ICovCisjZGVmaW5lIENGR19OQU5EMV9SRFkgKDB4ODAwMDAwMDAgPj4gMzEpICAvKiBvdXIgUkRZIGlzIEdQSU8zMSAqLwogI2RlZmluZSBDRkdfTkFORDFfQ0xFICgweDgwMDAwMDAwID4+IDE1KSAgLyogb3VyIENMRSBpcyBHUElPMTUgKi8KICNkZWZpbmUgQ0ZHX05BTkQxX0FMRSAoMHg4MDAwMDAwMCA+PiAxNikgIC8qIG91ciBBTEUgaXMgR1BJTzE2ICovCi0jZGVmaW5lIENGR19OQU5EMV9SRFkgKDB4ODAwMDAwMDAgPj4gMzEpICAvKiBvdXIgUkRZIGlzIEdQSU8zMSAqLwogCi0jZGVmaW5lIE5BTkRfRElTQUJMRV9DRShuYW5kKSBkbyBcCisjZGVmaW5lIE1BQ1JPX05BTkRfRElTQUJMRV9DRShuYW5kcHRyKSBkbyBcCiB7IFwKLQlzd2l0Y2goKHVuc2lnbmVkIGxvbmcpKCgoc3RydWN0IG5hbmRfY2hpcCAqKW5hbmQpLT5JT19BRERSKSkgXAorCXN3aXRjaCgodW5zaWduZWQgbG9uZyluYW5kcHRyKSBcCiAJeyBcCiAJICAgIGNhc2UgQ0ZHX05BTkQwX0JBU0U6IFwKIAkJb3V0MzIoR1BJTzBfT1IsIGluMzIoR1BJTzBfT1IpIHwgQ0ZHX05BTkQwX0NFKTsgXApAQCAtMjI2LDkgKzIyNiw5IEBACiAJfSBcCiB9IHdoaWxlKDApCiAKLSNkZWZpbmUgTkFORF9FTkFCTEVfQ0UobmFuZCkgZG8gXAorI2RlZmluZSBNQUNST19OQU5EX0VOQUJMRV9DRShuYW5kcHRyKSBkbyBcCiB7IFwKLQlzd2l0Y2goKHVuc2lnbmVkIGxvbmcpKCgoc3RydWN0IG5hbmRfY2hpcCAqKW5hbmQpLT5JT19BRERSKSkgXAorCXN3aXRjaCgodW5zaWduZWQgbG9uZyluYW5kcHRyKSBcCiAJeyBcCiAJICAgIGNhc2UgQ0ZHX05BTkQwX0JBU0U6IFwKIAkJb3V0MzIoR1BJTzBfT1IsIGluMzIoR1BJTzBfT1IpICYgfkNGR19OQU5EMF9DRSk7IFwKQEAgLTIzOSw3ICsyMzksNyBAQAogCX0gXAogfSB3aGlsZSgwKQogCi0jZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShuYW5kcHRyKSBkbyBcCisjZGVmaW5lIE1BQ1JPX05BTkRfQ1RMX0NMUkFMRShuYW5kcHRyKSBkbyBcCiB7IFwKIAlzd2l0Y2goKHVuc2lnbmVkIGxvbmcpbmFuZHB0cikgXAogCXsgXApAQCAtMjUyLDcgKzI1Miw3IEBACiAJfSBcCiB9IHdoaWxlKDApCiAKLSNkZWZpbmUgTkFORF9DVExfU0VUQUxFKG5hbmRwdHIpIGRvIFwKKyNkZWZpbmUgTUFDUk9fTkFORF9DVExfU0VUQUxFKG5hbmRwdHIpIGRvIFwKIHsgXAogCXN3aXRjaCgodW5zaWduZWQgbG9uZyluYW5kcHRyKSBcCiAJeyBcCkBAIC0yNjUsNyArMjY1LDcgQEAKIAl9IFwKIH0gd2hpbGUoMCkKIAotI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUobmFuZHB0cikgZG8gXAorI2RlZmluZSBNQUNST19OQU5EX0NUTF9DTFJDTEUobmFuZHB0cikgZG8gXAogeyBcCiAJc3dpdGNoKCh1bnNpZ25lZCBsb25nKW5hbmRwdHIpIFwKIAl7IFwKQEAgLTI3OCw3ICsyNzgsNyBAQAogCX0gXAogfSB3aGlsZSgwKQogCi0jZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShuYW5kcHRyKSBkbyB7IFwKKyNkZWZpbmUgTUFDUk9fTkFORF9DVExfU0VUQ0xFKG5hbmRwdHIpIGRvIHsgXAogCXN3aXRjaCgodW5zaWduZWQgbG9uZyluYW5kcHRyKSB7IFwKIAljYXNlIENGR19OQU5EMF9CQVNFOiBcCiAJCW91dDMyKEdQSU8wX09SLCBpbjMyKEdQSU8wX09SKSB8IENGR19OQU5EMF9DTEUpOyBcCkBAIC0yODksNiArMjg5LDE5IEBACiAJfSBcCiB9IHdoaWxlKDApCiAKKyNpZiAwCisjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCisjZGVmaW5lIE5BTkRfTk9fUkIKKworI2RlZmluZSBBRERSX0NPTFVNTiAxCisjZGVmaW5lIEFERFJfUEFHRSAyCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UgMworCisjZGVmaW5lIE5BTkRfQ2hpcElEX1VOS05PV04JMHgwMAorI2RlZmluZSBOQU5EX01BWF9GTE9PUlMgMQorCisKKwogI2lmZGVmIE5BTkRfTk9fUkIKIC8qIGNvbnN0YW50IGRlbGF5IChzZWUgYWxzbyB0UiBpbiB0aGUgZGF0YXNoZWV0KSAqLwogI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkobmFuZCkgZG8geyBcCkBAIC0zMDMsNyArMzE2LDcgQEAKICNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZylhZHIpID0gKF9fdTgpKGQpOyB9IHdoaWxlKDApCiAjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4ICopKCh1bnNpZ25lZCBsb25nKWFkcikgPSAoX191OClkOyB9IHdoaWxlKDApCiAjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgdW5zaWduZWQgY2hhcikoKih2b2xhdGlsZSBfX3U4ICopKHVuc2lnbmVkIGxvbmcpYWRyKSkKLQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQQ0kgc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMzOCwxNiArMzUxLDE2IEBACiAjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCiAKIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisvKgogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZDMDAwMAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCiAjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCisqLwogCiAvKiBSZXNlcnZlIDMyMCBrQiBmb3IgTW9uaXRvcgkqLwotLyoKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZGQjAwMDAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlDRkdfRkxBU0hfQkFTRQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgzMjAgKiAxMDI0KQotKi8KIAogI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBtYWxsb2MoKQkqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmgKaW5kZXggMjQyYzgzNy4uMjE5NDVhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaApAQCAtMzI2LDYgKzMyNiw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEaXNrLU9uLUNoaXAgY29uZmlndXJhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCisKICNkZWZpbmUgQ0ZHX01BWF9ET0NfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBET0MgZGV2aWNlcwkJKi8KICNkZWZpbmUgQ0ZHX0RPQ19TSE9SVF9USU1FT1VUCiAjZGVmaW5lIENGR19ET0NfU1VQUE9SVF8yMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaCBiL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCmluZGV4IGMxYzc2NWYuLmE4NDU0ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCkBAIC0xODMsNiArMTgzLDcgQEAKICovCiAKIC8qIE5BTkQgZmxhc2ggc3VwcG9ydCAqLworI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKICNkZWZpbmUgQ09ORklHX01URF9OQU5EX0VDQ19KRkZTMgogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJKi8KICNkZWZpbmUgU0VDVE9SU0laRSA1MTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaAppbmRleCAzY2ExMzdlLi45NmYzZDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVk9INDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1ZPSDQwNS5oCkBAIC0xNDEsNiArMTQxLDggQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaAppbmRleCBkOTJmODFmLi5mYWY4NTVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvV1VINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oCkBAIC0xMzMsNiArMTMzLDggQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKKwogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9iYW1ib28uaCBiL2luY2x1ZGUvY29uZmlncy9iYW1ib28uaAppbmRleCBlYWNjNzQ0Li42ZDMyODIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2JhbWJvby5oCkBAIC00Myw2ICs0Myw3IEBACiAgKiAybmQgZXRoZXJuZXQgcG9ydCB5b3UgaGF2ZSB0byAidW5kZWYiIHRoZSBmb2xsb3dpbmcgZGVmaW5lLgogICovCiAjZGVmaW5lIENPTkZJR19CQU1CT09fTkFORCAgICAgIDEgICAgICAgLyogZW5hYmxlIG5hbmQgZmxhc2ggc3VwcG9ydCAgICAqLworI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQmFzZSBhZGRyZXNzZXMgLS0gTm90ZSB0aGVzZSBhcmUgZWZmZWN0aXZlIGFkZHJlc3NlcyB3aGVyZSB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9uZXRzdGFyLmggYi9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Nzc5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1IDJOIFRFTEVLT01VTklLQUNFLCBMYWRpc2xhdiBNaWNobAorICoKKyAqIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgTmV0U3RhciBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworI2RlZmluZSBDT05GSUdfQVJNOTI1VAkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNXQgQ1BVICovCisjZGVmaW5lIENPTkZJR19PTUFQCTEJCS8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMTUxMCAxCQkvKiB3aGljaCBpcyBpbiBhIDU5MTAgKi8KKworLyogSW5wdXQgY2xvY2sgb2YgUExMICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMTUwMDAwMDAwCS8qIDE1ME1IeiBpbnB1dCBjbG9jayAqLworI2RlZmluZSBDT05GSUdfWFRBTF9GUkVRCTEyMDAwMDAwCisKKyN1bmRlZiBDT05GSUdfVVNFX0lSUQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgkJLyogVGhlcmUgaXMgbm90aGluZyB0byByZWFsbHkgaW5pdCAqLworI2RlZmluZSBCT0FSRF9MQVRFX0lOSVQJCQkvKiBidXQgd2UgZmxhc2ggdGhlIExFRHMgaGVyZSAqLworCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkJMQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcyAqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MJMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkJMQorCisjZGVmaW5lIENGR19ERVZJQ0VfTlVMTERFVgkJMQkvKiBlbmFibGUgbnVsbCBkZXZpY2UgKi8KKyNkZWZpbmUgQ09ORklHX1NJTEVOVF9DT05TT0xFCQkxCS8qIGVuYWJsZSBzaWxlbnQgc3RhcnR1cCAqLworCisvKgorICogUGh5c2ljYWwgTWVtb3J5IE1hcAorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDEwMDAwMDAwCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAwMDAwMDAwCS8qIEZsYXNoIEJhbmsgIzEgKi8KKworLyoKKyAqIEZMQVNIIG9yZ2FuaXphdGlvbgorICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCisjaWYgKFBIWVNfU0RSQU1fMV9TSVpFID09IFNaXzMyTSkKKy8qI2lmIDEqLworI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCQkJLyogRmxhc2ggaXMgQ0ZJIGNvbmZvcm1hbnQgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJCS8qIFVzZSB0aGUgY29tbW9uIGRyaXZlciAqLworI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTI4CisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzFfU0laRQlTWl8xTQorI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTkKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJKDUqQ0ZHX0haKSAvKiBpbiB0aWNrcyAqLworI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAkoNSpDRkdfSFopCisjZW5kaWYKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCVNaXzI1NksKKworLyoKKyAqIEVudmlyb25tZW50IHNldHRpbmdzCisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI2RlZmluZSBFTlZfSVNfU09MSVRBUlkKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkweDQwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQlTWl84SworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQlTWl84SworI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECTB4NjAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECUNGR19FTlZfU0laRQorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworLyogWFhYICNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCShTWl82NEsgLSBDRkdfR0JMX0RBVEFfU0laRSkqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJU1pfNE0KKworLyoKKyAqIFRoZSBzdGFjayBzaXplIGlzIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisvKiBYWFggI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCVNaXzhLCS9YWFgqIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQlTWl8xTQkvKiByZWd1bGFyIHN0YWNrICovCisKKy8qCisgKiBIYXJkd2FyZSBkcml2ZXJzCisgKi8KKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9TTUM5MTExMQorI2RlZmluZSBDT05GSUdfU01DOTExMTFfQkFTRQkweDA0MDAwMzAwCisKKy8qCisgKiBOUzE2NTUwIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCShDT05GSUdfWFRBTF9GUkVRKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCU9NQVAxNTEwX1VBUlQxX0JBU0UJLyogdWFydDEgKi8KKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVCovCisvKiNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVCAqLworCisvKgorICogTkFORCBmbGFzaAorICovCisjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQorI2RlZmluZSBOQU5EX01BWF9DSElQUwkJMQorI2RlZmluZSBDRkdfTkFORF9CQVNFCTB4MDQwMDAwMDAgKyAoMiA8PCAyMykKKworLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMgKG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0KQorICovCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1vbWFwZmxhc2guMCxuYW5kMD1vbWFwbmFuZC4wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1vbWFwZmxhc2guMDo4a0AxNmsoZW52KSw4ayhyX2VudiksNDQ4a0A1NzZrKHUtYm9vdCk7b21hcG5hbmQuMDo0OE0ocm9vdGZzMCksNDhNKHJvb3RmczEpLC0oZGF0YSkiCisKKyNpZiAwCisjZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJICAgIHwgXAorCQkJCSBDRkdfQ01EX0JPT1REICB8IFwKKwkJCQkgQ0ZHX0NNRF9ESENQICAgfCBcCisJCQkJIENGR19DTURfRU5WCXwgXAorCQkJCSBDRkdfQ01EX0ZMQVNIICB8IFwKKwkJCQkgQ0ZHX0NNRF9JTUkgICAgfCBcCisJCQkJIENGR19DTURfTE9BREIgIHwgXAorCQkJCSBDRkdfQ01EX05FVCAgICB8IFwKKwkJCQkgQ0ZHX0NNRF9NRU1PUlkgfCBcCisJCQkJIENGR19DTURfUElORyAgIHwgXAorCQkJCSBDRkdfQ01EX1JVTikKKworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfCBcCisJCQkJIENGR19DTURfQk9PVEQgIHwgXAorCQkJCSBDRkdfQ01EX0RIQ1AgICB8IFwKKwkJCQkgQ0ZHX0NNRF9FTlYJfCBcCisJCQkJIENGR19DTURfRkxBU0ggIHwgXAorCQkJCSBDRkdfQ01EX05BTkQJfCBcCisJCQkJIENGR19DTURfSU1JICAgIHwgXAorCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAorCQkJCSBDRkdfQ01EX0xPQURCICB8IFwKKwkJCQkgQ0ZHX0NNRF9ORVQgICAgfCBcCisJCQkJIENGR19DTURfTUVNT1JZIHwgXAorCQkJCSBDRkdfQ01EX1BJTkcgICB8IFwKKwkJCQkgQ0ZHX0NNRF9SVU4pCisKKyNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQJMQkvKiBqZmZzMiBvbiBuYW5kIHN1cHBvcnQgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisjZGVmaW5lIENPTkZJR19MT09QVworCisvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCisjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCisjZGVmaW5lIENPTkZJR19aRVJPX0JPT1RERUxBWV9DSEVDSwkvKiBhbGxvdyB0byBicmVhayBpbiBhbHdheXMgKi8KKyN1bmRlZiAgQ09ORklHX0JPT1RBUkdTCQkvKiB0aGUgYm9vdCBjb21tYW5kIHdpbGwgc2V0IGJvb3RhcmdzKi8KKyNkZWZpbmUgQ0ZHX0FVVE9MT0FECQkibiIJCS8qIE5vIGF1dG9sb2FkICovCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIG5ib290IgorI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJInJ1biBzZXR1cCIKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQlcCisJInNldHVwPXNldGVudiBib290YXJncyBjb25zb2xlPXR0eVMwLCRiYXVkcmF0ZSAiCVwKKwkJIiRtdGRwYXJ0c1wwIgkJCQkJXAorCSJvc3BhcnQ9MFwwIgkJCQkJCVwKKwkic2V0cGFydD0iCQkJCQkJXAorCSJpZiB0ZXN0IC1uICRzd2Fwb3M7IHRoZW4gIgkJCQlcCisJCSJpZiB0ZXN0ICRvc3BhcnQgLWVxIDA7IHRoZW4gY2hwYXJ0IG5hbmQwLDE7IGVsc2UgY2hwYXJ0IG5hbmQwLDA7IGZpOyAiXAorCQkic2V0ZW52IHN3YXBvczsgc2F2ZWVudjsgIgkJCVwKKwkiZWxzZSAiCQkJCQkJCVwKKwkJImNocGFydCBuYW5kMCwkb3NwYXJ0OyAiCQkJXAorCSJmaVwwIgkJCQkJCQlcCisJIm5mc2FyZ3M9c2V0ZW52IGJvb3RhcmdzICRib290YXJncyAiCQkJXAorCQkiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6Om9mZiAiIFwKKwkJIm5mc3Jvb3Q9JHJvb3RwYXRoIHJvb3Q9L2Rldi9uZnNcMCIJCVwKKwkiZmxhc2hhcmdzPXJ1biBzZXRwYXJ0O3NldGVudiBib290YXJncyAkYm9vdGFyZ3MgIglcCisJCSJyb290PS9kZXYvbXRkYmxvY2skcGFydGl0aW9uIHJvICIJCVwKKwkJInJvb3Rmc3R5cGU9amZmczJcMCIJCQkJXAorCSJpbml0cmRhcmdzPXNldGVudiBib290YXJncyAkYm9vdGFyZ3MgIgkJCVwKKwkJImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOjpvZmZcMCIgXAorCSJpYm9vdD1ib290cDtydW4gaW5pdHJkYXJnczt0ZnRwO2Jvb3RtXDAiCQlcCisJImZib290PXJ1biBmbGFzaGFyZ3M7ZnNsb2FkIC9ib290L3VJbWFnZTtib290bVwwIglcCisJIm5ib290PWJvb3RwO3J1biBuZnNhcmdzO3RmdHA7Ym9vdG1cMCIKKworI2lmIDAJLyogZmVlbCBmcmVlIHRvIGRpc2FibGUgZm9yIGRldmVsb3BtZW50ICovCisjZGVmaW5lCUNPTkZJR19BVVRPQk9PVF9LRVlFRAkJLyogRW5hYmxlIHBhc3N3b3JkIHByb3RlY3Rpb24JKi8KKyNkZWZpbmUgQ09ORklHX0FVVE9CT09UX1BST01QVAkiXG5OZXRTdGFyIFBCWCAtIGJvb3QgaW4gJWQgc2VjLi4uXG4iCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIJIlIiCS8qIDFzdCAicGFzc3dvcmQiCSovCisjZGVmaW5lIENPTkZJR19CT09UX1JFVFJZX1RJTUUJMzAKKyNlbmRpZgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIiMgIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQorCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCVBIWVNfU0RSQU1fMQorI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCVBIWVNfU0RSQU1fMSArIFBIWVNfU0RSQU1fMV9TSVpFCisKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lIENGR19MT0FEX0FERFIJCVBIWVNfU0RSQU1fMSArIDB4NDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisKKy8qIFRoZSAxNTEwIGhhcyAzIHRpbWVycywgdGhleSBjYW4gYmUgZHJpdmVuIGJ5IHRoZSBSZWZDbGsgKDEyTWh6KSBvciBieSBEUExMMS4KKyAqIFRoaXMgdGltZSBpcyBmdXJ0aGVyIHN1YmRpdmlkZWQgYnkgYSBsb2NhbCBkaXZpc29yLgorICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJCU9NQVAxNTEwX1RJTUVSMV9CQVNFCisjZGVmaW5lIENGR19QVlQJCQk3CQkvKiAyXihwdnQrMSksIGRpdmlkZSBieSAyNTYgKi8KKyNkZWZpbmUgQ0ZHX0haCQkJKChDT05GSUdfU1lTX0NMS19GUkVRKS8oMiA8PCBDRkdfUFZUKSkKKworI2RlZmluZSBPTUFQNTkxMF9EUExMX0RJVgkxCisjZGVmaW5lIE9NQVA1OTEwX0RQTExfTVVMCSgoQ09ORklHX1NZU19DTEtfRlJFUSAqIFwKKwkJCQkgKDEgPDwgT01BUDU5MTBfRFBMTF9ESVYpKSAvIENPTkZJR19YVEFMX0ZSRVEpCisKKyNkZWZpbmUgT01BUDU5MTBfQVJNX1BFUl9ESVYJMgkvKiBDS0wvNCAqLworI2RlZmluZSBPTUFQNTkxMF9MQ0RfRElWCTIJLyogQ0tMLzQgKi8KKyNkZWZpbmUgT01BUDU5MTBfQVJNX0RJVgkwCS8qIENLTC8xICovCisjZGVmaW5lIE9NQVA1OTEwX0RTUF9ESVYJMAkvKiBDS0wvMSAqLworI2RlZmluZSBPTUFQNTkxMF9UQ19ESVYJCTEJLyogQ0tMLzIgKi8KKyNkZWZpbmUgT01BUDU5MTBfRFNQX01NVV9ESVYJMQkvKiBDS0wvMiAqLworI2RlZmluZSBPTUFQNTkxMF9BUk1fVElNX1NFTAkxCS8qIENLTCB1c2VkIGZvciBNUFUgdGltZXJzICovCisKKyNkZWZpbmUgT01BUDU5MTBfQVJNX0VOX0NMSwkweDAzZDYJLyogMDAwMCAwMDExIDExMDEgMDExMGIgIENsb2NrIEVuYWJsZSAqLworI2RlZmluZSBPTUFQNTkxMF9BUk1fQ0tDVEwJKChPTUFQNTkxMF9BUk1fUEVSX0RJVikgIHwJXAorCQkJCSAoT01BUDU5MTBfTENEX0RJViA8PCAyKSB8CVwKKwkJCQkgKE9NQVA1OTEwX0FSTV9ESVYgPDwgNCkgfAlcCisJCQkJIChPTUFQNTkxMF9EU1BfRElWIDw8IDYpIHwJXAorCQkJCSAoT01BUDU5MTBfVENfRElWIDw8IDgpIHwJXAorCQkJCSAoT01BUDU5MTBfRFNQX01NVV9ESVYgPDwgMTApIHwJXAorCQkJCSAoT01BUDU5MTBfQVJNX1RJTV9TRUwgPDwgMTIpKQorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oIGIvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oCmluZGV4IDcxMThmM2YuLjkyZWU4Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3ZtX3NjOHh4LmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogCiAvKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCiAjaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L210ZC9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjBjZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvY29tcGF0LmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfTElOVVhfQ09NUEFUX0hfCisjZGVmaW5lIF9MSU5VWF9DT01QQVRfSF8KKworI2RlZmluZSBfX3VzZXIKKyNkZWZpbmUgX19pb21lbQorCisjZGVmaW5lIG5kZWxheSh4KQl1ZGVsYXkoMSkKKworI2RlZmluZSBwcmludGsJcHJpbnRmCisKKyNkZWZpbmUgS0VSTl9FTUVSRworI2RlZmluZSBLRVJOX0FMRVJUCisjZGVmaW5lIEtFUk5fQ1JJVAorI2RlZmluZSBLRVJOX0VSUgorI2RlZmluZSBLRVJOX1dBUk5JTkcKKyNkZWZpbmUgS0VSTl9OT1RJQ0UKKyNkZWZpbmUgS0VSTl9JTkZPCisjZGVmaW5lIEtFUk5fREVCVUcKKworI2RlZmluZSBrbWFsbG9jKHNpemUsIGZsYWdzKQltYWxsb2Moc2l6ZSkKKyNkZWZpbmUga2ZyZWUocHRyKQkJZnJlZShwdHIpCisKKy8qCisgKiAuLmFuZCBpZiB5b3UgY2FuJ3QgdGFrZSB0aGUgc3RyaWN0CisgKiB0eXBlcywgeW91IGNhbiBzcGVjaWZ5IG9uZSB5b3Vyc2VsZi4KKyAqCisgKiBPciBub3QgdXNlIG1pbi9tYXggYXQgYWxsLCBvZiBjb3Vyc2UuCisgKi8KKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpIFwKKwkoeyB0eXBlIF9feCA9ICh4KTsgdHlwZSBfX3kgPSAoeSk7IF9feCA8IF9feSA/IF9feDogX195OyB9KQorI2RlZmluZSBtYXhfdCh0eXBlLHgseSkgXAorCSh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194ID4gX195ID8gX194OiBfX3k7IH0pCisKKyNkZWZpbmUgQlVHKCkgZG8geyBcCisJcHJpbnRmKCJVLUJvb3QgQlVHIGF0ICVzOiVkIVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmIChjb25kaXRpb24pIEJVRygpOyB9IHdoaWxlKDApCisKKyNkZWZpbmUgbGlrZWx5KHgpCV9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjZGVmaW5lIHVubGlrZWx5KHgpCV9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisKKyNkZWZpbmUgUEFHRV9TSVpFCTQwOTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLWFiaS5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLWFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWQ0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQtYWJpLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqICRJZDogbXRkLWFiaS5oLHYgMS43IDIwMDQvMTEvMjMgMTU6Mzc6MzIgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiBQb3J0aW9ucyBvZiBNVEQgQUJJIGRlZmluaXRpb24gd2hpY2ggYXJlIHNoYXJlZCBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UKKyAqLworCisjaWZuZGVmIF9fTVREX0FCSV9IX18KKyNkZWZpbmUgX19NVERfQUJJX0hfXworCitzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIHsKKwl1aW50MzJfdCBzdGFydDsKKwl1aW50MzJfdCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgbXRkX29vYl9idWYgeworCXVpbnQzMl90IHN0YXJ0OworCXVpbnQzMl90IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7Cit9OworCisjZGVmaW5lIE1URF9BQlNFTlQJCTAKKyNkZWZpbmUgTVREX1JBTQkJCTEKKyNkZWZpbmUgTVREX1JPTQkJCTIKKyNkZWZpbmUgTVREX05PUkZMQVNICQkzCisjZGVmaW5lIE1URF9OQU5ERkxBU0gJCTQKKyNkZWZpbmUgTVREX1BFUk9NCQk1CisjZGVmaW5lIE1URF9PVEhFUgkJMTQKKyNkZWZpbmUgTVREX1VOS05PV04JCTE1CisKKyNkZWZpbmUgTVREX0NMRUFSX0JJVFMJCTEgICAgICAgLyogQml0cyBjYW4gYmUgY2xlYXJlZCAoZmxhc2gpICovCisjZGVmaW5lIE1URF9TRVRfQklUUwkJMiAgICAgICAvKiBCaXRzIGNhbiBiZSBzZXQgKi8KKyNkZWZpbmUgTVREX0VSQVNFQUJMRQkJNCAgICAgICAvKiBIYXMgYW4gZXJhc2UgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTVREX1dSSVRFQl9XUklURUFCTEUJOCAgICAgICAvKiBEaXJlY3QgSU8gaXMgcG9zc2libGUgKi8KKyNkZWZpbmUgTVREX1ZPTEFUSUxFCQkxNiAgICAgIC8qIFNldCBmb3IgUkFNcyAqLworI2RlZmluZSBNVERfWElQCQkJMzIJLyogZVhlY3V0ZS1Jbi1QbGFjZSBwb3NzaWJsZSAqLworI2RlZmluZSBNVERfT09CCQkJNjQJLyogT3V0LW9mLWJhbmQgZGF0YSAoTkFORCBmbGFzaCkgKi8KKyNkZWZpbmUgTVREX0VDQwkJCTEyOAkvKiBEZXZpY2UgY2FwYWJsZSBvZiBhdXRvbWF0aWMgRUNDICovCisjZGVmaW5lIE1URF9OT19WSVJUQkxPQ0tTCTI1NgkvKiBWaXJ0dWFsIGJsb2NrcyBub3QgYWxsb3dlZCAqLworCisvKiBTb21lIGNvbW1vbiBkZXZpY2VzIC8gY29tYmluYXRpb25zIG9mIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBNVERfQ0FQX1JPTQkJMAorI2RlZmluZSBNVERfQ0FQX1JBTQkJKE1URF9DTEVBUl9CSVRTfE1URF9TRVRfQklUU3xNVERfV1JJVEVCX1dSSVRFQUJMRSkKKyNkZWZpbmUgTVREX0NBUF9OT1JGTEFTSCAgICAgICAgKE1URF9DTEVBUl9CSVRTfE1URF9FUkFTRUFCTEUpCisjZGVmaW5lIE1URF9DQVBfTkFOREZMQVNIICAgICAgIChNVERfQ0xFQVJfQklUU3xNVERfRVJBU0VBQkxFfE1URF9PT0IpCisjZGVmaW5lIE1URF9XUklURUFCTEUJCShNVERfQ0xFQVJfQklUU3xNVERfU0VUX0JJVFMpCisKKworLyogVHlwZXMgb2YgYXV0b21hdGljIEVDQy9DaGVja3N1bSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTVREX0VDQ19OT05FCQkwIAkvKiBObyBhdXRvbWF0aWMgRUNDIGF2YWlsYWJsZSAqLworI2RlZmluZSBNVERfRUNDX1JTX0Rpc2tPbkNoaXAJMQkvKiBBdXRvbWF0aWMgRUNDIG9uIERpc2tPbkNoaXAgKi8KKyNkZWZpbmUgTVREX0VDQ19TVwkJMgkvKiBTVyBFQ0MgZm9yIFRvc2hpYmEgJiBTYW1zdW5nIGRldmljZXMgKi8KKworLyogRUNDIGJ5dGUgcGxhY2VtZW50ICovCisjZGVmaW5lIE1URF9OQU5ERUNDX09GRgkJMAkvKiBTd2l0Y2ggb2ZmIEVDQyAoTm90IHJlY29tbWVuZGVkKSAqLworI2RlZmluZSBNVERfTkFOREVDQ19QTEFDRQkxCS8qIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKFlBRkZTMSBsZWdhY3kgbW9kZSkgKi8KKyNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMQUNFCTIJLyogVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgKi8KKyNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0VPTkxZCTMJLyogVXNlIHRoZSBnaXZlbiBwbGFjZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAoRG8gbm90IHN0b3JlIGVjYyByZXN1bHQgb24gcmVhZCkgKi8KKyNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMX1VTUiAJNAkvKiBVc2UgdGhlIGdpdmVuIGF1dG9wbGFjZW1lbnQgc2NoZW1lIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBkZWZhdWx0ICovCisKK3N0cnVjdCBtdGRfaW5mb191c2VyIHsKKwl1aW50OF90IHR5cGU7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3Qgc2l6ZTsJIC8qIFRvdGFsIHNpemUgb2YgdGhlIE1URCAqLworCXVpbnQzMl90IGVyYXNlc2l6ZTsKKwl1aW50MzJfdCBvb2JibG9jazsgIC8qIFNpemUgb2YgT09CIGJsb2NrcyAoZS5nLiA1MTIpICovCisJdWludDMyX3Qgb29ic2l6ZTsgICAvKiBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KSAqLworCXVpbnQzMl90IGVjY3R5cGU7CisJdWludDMyX3QgZWNjc2l6ZTsKK307CisKK3N0cnVjdCByZWdpb25faW5mb191c2VyIHsKKwl1aW50MzJfdCBvZmZzZXQ7CQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsCisJCQkJCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdWludDMyX3QgZXJhc2VzaXplOwkJLyogRm9yIHRoaXMgcmVnaW9uICovCisJdWludDMyX3QgbnVtYmxvY2tzOwkJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHJlZ2lvbiAqLworCXVpbnQzMl90IHJlZ2lvbmluZGV4OworfTsKKworI2RlZmluZSBNRU1HRVRJTkZPICAgICAgICAgICAgICBfSU9SKCdNJywgMSwgc3RydWN0IG10ZF9pbmZvX3VzZXIpCisjZGVmaW5lIE1FTUVSQVNFICAgICAgICAgICAgICAgIF9JT1coJ00nLCAyLCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorI2RlZmluZSBNRU1XUklURU9PQiAgICAgICAgICAgICBfSU9XUignTScsIDMsIHN0cnVjdCBtdGRfb29iX2J1ZikKKyNkZWZpbmUgTUVNUkVBRE9PQiAgICAgICAgICAgICAgX0lPV1IoJ00nLCA0LCBzdHJ1Y3QgbXRkX29vYl9idWYpCisjZGVmaW5lIE1FTUxPQ0sgICAgICAgICAgICAgICAgIF9JT1coJ00nLCA1LCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorI2RlZmluZSBNRU1VTkxPQ0sgICAgICAgICAgICAgICBfSU9XKCdNJywgNiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKyNkZWZpbmUgTUVNR0VUUkVHSU9OQ09VTlQJX0lPUignTScsIDcsIGludCkKKyNkZWZpbmUgTUVNR0VUUkVHSU9OSU5GTwlfSU9XUignTScsIDgsIHN0cnVjdCByZWdpb25faW5mb191c2VyKQorI2RlZmluZSBNRU1TRVRPT0JTRUwJCV9JT1coJ00nLCA5LCBzdHJ1Y3QgbmFuZF9vb2JpbmZvKQorI2RlZmluZSBNRU1HRVRPT0JTRUwJCV9JT1IoJ00nLCAxMCwgc3RydWN0IG5hbmRfb29iaW5mbykKKyNkZWZpbmUgTUVNR0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMSwgbG9mZl90KQorI2RlZmluZSBNRU1TRVRCQURCTE9DSwkJX0lPVygnTScsIDEyLCBsb2ZmX3QpCisKK3N0cnVjdCBuYW5kX29vYmluZm8geworCXVpbnQzMl90IHVzZWVjYzsKKwl1aW50MzJfdCBlY2NieXRlczsKKwl1aW50MzJfdCBvb2JmcmVlWzhdWzJdOworCXVpbnQzMl90IGVjY3Bvc1szMl07Cit9OworCisjZW5kaWYgLyogX19NVERfQUJJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLmggYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U5MDgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiAkSWQ6IG10ZC5oLHYgMS41NiAyMDA0LzA4LzA5IDE4OjQ2OjA0IGRtYXJsaW4gRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+IGV0IGFsLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTAorICovCisKKyNpZm5kZWYgX19NVERfTVREX0hfXworI2RlZmluZSBfX01URF9NVERfSF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLWFiaS5oPgorCisjZGVmaW5lIE1BWF9NVERfREVWSUNFUyAxNgorCisjZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HICAgICAgCTB4MDEKKyNkZWZpbmUgTVREX0VSQVNJTkcJCTB4MDIKKyNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAorI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4CisjZGVmaW5lIE1URF9FUkFTRV9GQUlMRUQgICAgICAgIDB4MTAKKworLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgorICAgZmFpbF9hZGRyID0gMHhmZmZmZmZmZiwgdGhlIGZhaWx1cmUgd2FzIG5vdCBhdCB0aGUgZGV2aWNlIGxldmVsIG9yIHdhcyBub3QKKyAgIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAqLworc3RydWN0IGVyYXNlX2luZm8geworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXVfaW50MzJfdCBhZGRyOworCXVfaW50MzJfdCBsZW47CisJdV9pbnQzMl90IGZhaWxfYWRkcjsKKwl1X2xvbmcgdGltZTsKKwl1X2xvbmcgcmV0cmllczsKKwl1X2ludCBkZXY7CisJdV9pbnQgY2VsbDsKKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZXJhc2VfaW5mbyAqc2VsZik7CisJdV9sb25nIHByaXY7CisJdV9jaGFyIHN0YXRlOworCXN0cnVjdCBlcmFzZV9pbmZvICpuZXh0OworfTsKKworc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyB7CisJdV9pbnQzMl90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLworCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLworfTsKKworc3RydWN0IG10ZF9pbmZvIHsKKwl1X2NoYXIgdHlwZTsKKwl1X2ludDMyX3QgZmxhZ3M7CisJdV9pbnQzMl90IHNpemU7CSAvKiBUb3RhbCBzaXplIG9mIHRoZSBNVEQgKi8KKworCS8qICJNYWpvciIgZXJhc2Ugc2l6ZSBmb3IgdGhlIGRldmljZS4gTmHvdmUgdXNlcnMgbWF5IHRha2UgdGhpcworCSAqIHRvIGJlIHRoZSBvbmx5IGVyYXNlIHNpemUgYXZhaWxhYmxlLCBvciBtYXkgdXNlIHRoZSBtb3JlIGRldGFpbGVkCisJICogaW5mb3JtYXRpb24gYmVsb3cgaWYgdGhleSBkZXNpcmUKKwkgKi8KKwl1X2ludDMyX3QgZXJhc2VzaXplOworCisJdV9pbnQzMl90IG9vYmJsb2NrOyAgLyogU2l6ZSBvZiBPT0IgYmxvY2tzIChlLmcuIDUxMikgKi8KKwl1X2ludDMyX3Qgb29ic2l6ZTsgICAvKiBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KSAqLworCXVfaW50MzJfdCBvb2JhdmFpbDsgIC8qIE51bWJlciBvZiBieXRlcyBpbiBPT0IgYXJlYSBhdmFpbGFibGUgZm9yIGZzICAqLworCXVfaW50MzJfdCBlY2N0eXBlOworCXVfaW50MzJfdCBlY2NzaXplOworCisKKwkvKiBLZXJuZWwtb25seSBzdHVmZiBzdGFydHMgaGVyZS4gKi8KKwljaGFyICpuYW1lOworCWludCBpbmRleDsKKworCS8qIG9vYmluZm8gaXMgYSBuYW5kX29vYmluZm8gc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGlvdGNsIChNRU1TRVRPT0JJTkZPKSAqLworCXN0cnVjdCBuYW5kX29vYmluZm8gb29iaW5mbzsKKworCS8qIERhdGEgZm9yIHZhcmlhYmxlIGVyYXNlIHJlZ2lvbnMuIElmIG51bWVyYXNlcmVnaW9ucyBpcyB6ZXJvLAorCSAqIGl0IG1lYW5zIHRoYXQgdGhlIHdob2xlIGRldmljZSBoYXMgZXJhc2VzaXplIGFzIGdpdmVuIGFib3ZlLgorCSAqLworCWludCBudW1lcmFzZXJlZ2lvbnM7CisJc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyAqZXJhc2VyZWdpb25zOworCisJLyogVGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIGhlcmUuIEl0IGNhbiBnbyBhd2F5IGluIDIuNSAqLworCXVfaW50MzJfdCBiYW5rX3NpemU7CisKKwlpbnQgKCplcmFzZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOworCisJLyogVGhpcyBzdHVmZiBmb3IgZVhlY3V0ZS1Jbi1QbGFjZSAqLworCWludCAoKnBvaW50KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKTsKKworCS8qIFdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBYSVAgaWYgdGhlIHVucG9pbnQgaXNuJ3QgYSBOVUxMICovCisJdm9pZCAoKnVucG9pbnQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICogYWRkciwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pOworCisKKwlpbnQgKCpyZWFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOworCWludCAoKndyaXRlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKKworCWludCAoKnJlYWRfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOworCWludCAoKndyaXRlX2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisKKwlpbnQgKCpyZWFkX29vYikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKKwlpbnQgKCp3cml0ZV9vb2IpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOworCisJLyoKKwkgKiBNZXRob2RzIHRvIGFjY2VzcyB0aGUgcHJvdGVjdGlvbiByZWdpc3RlciBhcmVhLCBwcmVzZW50IGluIHNvbWUKKwkgKiBmbGFzaCBkZXZpY2VzLiBUaGUgdXNlciBkYXRhIGlzIG9uZSB0aW1lIHByb2dyYW1tYWJsZSBidXQgdGhlCisJICogZmFjdG9yeSBkYXRhIGlzIHJlYWQgb25seS4KKwkgKi8KKwlpbnQgKCpyZWFkX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CisKKwlpbnQgKCpyZWFkX2ZhY3RfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwlpbnQgKCp3cml0ZV91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOworI2lmIDAKKwkvKiBrdmVjLWJhc2VkIHJlYWQvd3JpdGUgbWV0aG9kcy4gV2UgbmVlZCB0aGVzZSBlc3BlY2lhbGx5IGZvciBOQU5EIGZsYXNoLAorCSAgIHdpdGggaXRzIGxpbWl0ZWQgbnVtYmVyIG9mIHdyaXRlIGN5Y2xlcyBwZXIgZXJhc2UuCisJICAgTkI6IFRoZSAnY291bnQnIHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIF92ZWN0b3JzXywgZWFjaCBvZgorCSAgIHdoaWNoIGNvbnRhaW5zIGFuIChvZnMsIGxlbikgdHVwbGUuCisJKi8KKwlpbnQgKCpyZWFkdikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qga3ZlYyAqdmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IGZyb20sIHNpemVfdCAqcmV0bGVuKTsKKwlpbnQgKCpyZWFkdl9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLAorCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CisJaW50ICgqd3JpdGV2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKTsKKwlpbnQgKCp3cml0ZXZfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sCisJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKKyNlbmRpZgorCS8qIFN5bmMgKi8KKwl2b2lkICgqc3luYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKyNpZiAwCisJLyogQ2hpcC1zdXBwb3J0ZWQgZGV2aWNlIGxvY2tpbmcgKi8KKwlpbnQgKCpsb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOworCWludCAoKnVubG9jaykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKKworCS8qIFBvd2VyIE1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisJaW50ICgqc3VzcGVuZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKwl2b2lkICgqcmVzdW1lKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOworI2VuZGlmCisJLyogQmFkIGJsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisJaW50ICgqYmxvY2tfaXNiYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CisJaW50ICgqYmxvY2tfbWFya2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKKworCXZvaWQgKnByaXY7CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlpbnQgdXNlY291bnQ7Cit9OworCisKKwkvKiBLZXJuZWwtc2lkZSBpb2N0bCBkZWZpbml0aW9ucyAqLworCitleHRlcm4gaW50IGFkZF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKK2V4dGVybiBpbnQgZGVsX210ZF9kZXZpY2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKworZXh0ZXJuIHN0cnVjdCBtdGRfaW5mbyAqZ2V0X210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBudW0pOworCitleHRlcm4gdm9pZCBwdXRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisKKyNpZiAwCitzdHJ1Y3QgbXRkX25vdGlmaWVyIHsKKwl2b2lkICgqYWRkKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm5ldyk7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm9sZCk7CisKK2ludCBkZWZhdWx0X210ZF93cml0ZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CisKK2ludCBkZWZhdWx0X210ZF9yZWFkdihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CisjZW5kaWYKKworI2RlZmluZSBNVERfRVJBU0UobXRkLCBhcmdzLi4uKSAoKihtdGQtPmVyYXNlKSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfUE9JTlQobXRkLCBhLGIsYyxkKSAoKihtdGQtPnBvaW50KSkobXRkLCBhLGIsYywgKHVfY2hhciAqKikoZCkpCisjZGVmaW5lIE1URF9VTlBPSU5UKG10ZCwgYXJnKSAoKihtdGQtPnVucG9pbnQpKShtdGQsICh1X2NoYXIgKilhcmcpCisjZGVmaW5lIE1URF9SRUFEKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkKSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfV1JJVEUobXRkLCBhcmdzLi4uKSAoKihtdGQtPndyaXRlKSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfUkVBRFYobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWR2KSkobXRkLCBhcmdzKQorI2RlZmluZSBNVERfV1JJVEVWKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZXYpKShtdGQsIGFyZ3MpCisjZGVmaW5lIE1URF9SRUFERUNDKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkX2VjYykpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1dSSVRFRUNDKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZV9lY2MpKShtdGQsIGFyZ3MpCisjZGVmaW5lIE1URF9SRUFET09CKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkX29vYikpKG10ZCwgYXJncykKKyNkZWZpbmUgTVREX1dSSVRFT09CKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZV9vb2IpKShtdGQsIGFyZ3MpCisjZGVmaW5lIE1URF9TWU5DKG10ZCkgZG8geyBpZiAobXRkLT5zeW5jKSAoKihtdGQtPnN5bmMpKShtdGQpOyAgfSB3aGlsZSAoMCkKKworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCit2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGRfZXJhc2VfY2FsbGJhY2soc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCWlmIChpbnN0ci0+Y2FsbGJhY2spCisJCWluc3RyLT5jYWxsYmFjayhpbnN0cik7Cit9CisjZW5kaWYKKworLyoKKyAqIERlYnVnZ2luZyBtYWNybyBhbmQgZGVmaW5lcworICovCisjZGVmaW5lIE1URF9ERUJVR19MRVZFTDAJKDApCS8qIFF1aWV0ICAgKi8KKyNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMQkoMSkJLyogQXVkaWJsZSAqLworI2RlZmluZSBNVERfREVCVUdfTEVWRUwyCSgyKQkvKiBMb3VkICAgICovCisjZGVmaW5lIE1URF9ERUJVR19MRVZFTDMJKDMpCS8qIE5vaXN5ICAgKi8KKworI2lmZGVmIENPTkZJR19NVERfREVCVUcKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikJCQkJXAorIAlkbyB7CQkJCQkJXAorCQlpZiAobiA8PSBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UpCVwKKwkJCXByaW50ayhLRVJOX0lORk8gYXJncyk7CQlcCisJfSB3aGlsZSgwKQorI2Vsc2UgLyogQ09ORklHX01URF9ERUJVRyAqLworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKKworI2VuZGlmIC8qIENPTkZJR19NVERfREVCVUcgKi8KKworI2VuZGlmIC8qIF9fTVREX01URF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAppbmRleCA1MjM2OTA0Li5jMTA1ZWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCkBAIC0yLDEwICsyLDEwIEBACiAgKiAgbGludXgvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCiAgKgogICogIENvcHlyaWdodCAoYykgMjAwMCBEYXZpZCBXb29kaG91c2UgPGR3bXcyQG12aGkuY29tPgotICogICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsQGNvdHcuY29tPgotICoJCSAgICAgICBUaG9tYXMgR2xlaXhuZXIgPGdsZWl4bmVyQGF1dHJvbml4LmRlPgorICogICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbT4KKyAqCQkgICAgICAgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CiAgKgotICogJElkOiBuYW5kLmgsdiAxLjcgMjAwMy8wNy8yNCAyMzozMDo0NiBhMDM4NDg2NCBFeHAgJAorICogJElkOiBuYW5kLmgsdiAxLjY4IDIwMDQvMTEvMTIgMTA6NDA6MzcgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTMyLDEwICszMiw2NiBAQAogICoJCQljb21tYW5kIGRlbGF5IHRpbWVzIGZvciBkaWZmZXJlbnQgY2hpcHMKICAqICAgMDQtMjgtMjAwMiBURwlPT0IgY29uZmlnIGRlZmluZXMgbW92ZWQgZnJvbSBuYW5kLmMgdG8gYXZvaWQgZHVwbGljYXRlCiAgKgkJCWRlZmluZXMgaW4gamZmczIvd2J1Zi5jCisgKiAgIDA4LTA3LTIwMDIgVEcJZm9yY2VkIGJhZCBibG9jayBsb2NhdGlvbiB0byBieXRlIDUgb2YgT09CLCBldmVuIGlmCisgKgkJCUNPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIgaXMgbm90IHNldAorICogICAwOC0xMC0yMDAyIFRHCWV4dGVuc2lvbnMgdG8gbmFuZF9jaGlwIHN0cnVjdHVyZSB0byBzdXBwb3J0IEhXLUVDQworICoKKyAqICAgMDgtMjktMjAwMiB0Z2x4IAluYW5kX2NoaXAgc3RydWN0dXJlOiBkYXRhX3BvaSBmb3Igc2VsZWN0aW5nCisgKgkJCWludGVybmFsIC8gZnMtZHJpdmVyIGJ1ZmZlcgorICoJCQlzdXBwb3J0IGZvciA2Ynl0ZS81MTJieXRlIGhhcmR3YXJlIEVDQworICoJCQlyZWFkX2VjYywgd3JpdGVfZWNjIGV4dGVuZGVkIGZvciBkaWZmZXJlbnQgb29iLWxheW91dAorICoJCQlvb2IgbGF5b3V0IHNlbGVjdGlvbnM6IE5BTkRfTk9ORV9PT0IsIE5BTkRfSkZGUzJfT09CLAorICoJCQlOQU5EX1lBRkZTX09PQgorICogIDExLTI1LTIwMDIgdGdseAlBZGRlZCBNYW51ZmFjdHVyZXIgY29kZSBGVUpJVFNVLCBOQVRJT05BTAorICoJCQlTcGxpdCBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRCBzdHJ1Y3R1cmVzCisgKgorICogIDAyLTA4LTIwMDQgdGdseCAJYWRkZWQgb3B0aW9uIGZpZWxkIHRvIG5hbmQgc3RydWN0dXJlIGZvciBjaGlwIGFub21hbGl0aWVzCisgKiAgMDUtMjUtMjAwNCB0Z2x4IAlhZGRlZCBiYWQgYmxvY2sgdGFibGUgc3VwcG9ydCwgU1QtTUlDUk8gbWFudWZhY3R1cmVyIGlkCisgKgkJCXVwZGF0ZSBvZiBuYW5kX2NoaXAgc3RydWN0dXJlIGRlc2NyaXB0aW9uCiAgKi8KICNpZm5kZWYgX19MSU5VWF9NVERfTkFORF9ICiAjZGVmaW5lIF9fTElOVVhfTVREX05BTkRfSAogCisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworc3RydWN0IG10ZF9pbmZvOworLyogU2NhbiBhbmQgaWRlbnRpZnkgYSBOQU5EIGRldmljZSAqLworZXh0ZXJuIGludCBuYW5kX3NjYW4gKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbWF4X2NoaXBzKTsKKy8qIEZyZWUgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIE5BTkQgZGV2aWNlICovCitleHRlcm4gdm9pZCBuYW5kX3JlbGVhc2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKworLyogUmVhZCByYXcgZGF0YSBmcm9tIHRoZSBkZXZpY2Ugd2l0aG91dCBFQ0MgKi8KK2V4dGVybiBpbnQgbmFuZF9yZWFkX3JhdyAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCBvb2JsZW4pOworCisKKworLyogVGhpcyBjb25zdGFudCBkZWNsYXJlcyB0aGUgbWF4LiBvb2JzaXplIC8gcGFnZSwgd2hpY2gKKyAqIGlzIHN1cHBvcnRlZCBub3cuIElmIHlvdSBhZGQgYSBjaGlwIHdpdGggYmlnZ2VyIG9vYnNpemUvcGFnZQorICogYWRqdXN0IHRoaXMgYWNjb3JkaW5nbHkuCisgKi8KKyNkZWZpbmUgTkFORF9NQVhfT09CU0laRQk2NAorCisvKgorICogQ29uc3RhbnRzIGZvciBoYXJkd2FyZSBzcGVjaWZpYyBDTEUvQUxFL05DRSBmdW5jdGlvbgorKi8KKy8qIFNlbGVjdCB0aGUgY2hpcCBieSBzZXR0aW5nIG5DRSB0byBsb3cgKi8KKyNkZWZpbmUgTkFORF9DVExfU0VUTkNFIAkxCisvKiBEZXNlbGVjdCB0aGUgY2hpcCBieSBzZXR0aW5nIG5DRSB0byBoaWdoICovCisjZGVmaW5lIE5BTkRfQ1RMX0NMUk5DRQkJMgorLyogU2VsZWN0IHRoZSBjb21tYW5kIGxhdGNoIGJ5IHNldHRpbmcgQ0xFIHRvIGhpZ2ggKi8KKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFCQkzCisvKiBEZXNlbGVjdCB0aGUgY29tbWFuZCBsYXRjaCBieSBzZXR0aW5nIENMRSB0byBsb3cgKi8KKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFCQk0CisvKiBTZWxlY3QgdGhlIGFkZHJlc3MgbGF0Y2ggYnkgc2V0dGluZyBBTEUgdG8gaGlnaCAqLworI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUJCTUKKy8qIERlc2VsZWN0IHRoZSBhZGRyZXNzIGxhdGNoIGJ5IHNldHRpbmcgQUxFIHRvIGxvdyAqLworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUJCTYKKy8qIFNldCB3cml0ZSBwcm90ZWN0aW9uIGJ5IHNldHRpbmcgV1AgdG8gaGlnaC4gTm90IHVzZWQhICovCisjZGVmaW5lIE5BTkRfQ1RMX1NFVFdQCQk3CisvKiBDbGVhciB3cml0ZSBwcm90ZWN0aW9uIGJ5IHNldHRpbmcgV1AgdG8gbG93LiBOb3QgdXNlZCEgKi8KKyNkZWZpbmUgTkFORF9DVExfQ0xSV1AJCTgKKwogLyoKICAqIFN0YW5kYXJkIE5BTkQgZmxhc2ggY29tbWFuZHMKICAqLwpAQCAtNDUsMTIgKzEwMSwxMDQgQEAKICNkZWZpbmUgTkFORF9DTURfUkVBRE9PQgkweDUwCiAjZGVmaW5lIE5BTkRfQ01EX0VSQVNFMQkJMHg2MAogI2RlZmluZSBOQU5EX0NNRF9TVEFUVVMJCTB4NzAKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX01VTFRJCTB4NzEKICNkZWZpbmUgTkFORF9DTURfU0VRSU4JCTB4ODAKICNkZWZpbmUgTkFORF9DTURfUkVBRElECQkweDkwCiAjZGVmaW5lIE5BTkRfQ01EX0VSQVNFMgkJMHhkMAogI2RlZmluZSBOQU5EX0NNRF9SRVNFVAkJMHhmZgogCisvKiBFeHRlbmRlZCBjb21tYW5kcyBmb3IgbGFyZ2UgcGFnZSBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfQ01EX1JFQURTVEFSVAkweDMwCisjZGVmaW5lIE5BTkRfQ01EX0NBQ0hFRFBST0cJMHgxNQorCisvKiBTdGF0dXMgYml0cyAqLworI2RlZmluZSBOQU5EX1NUQVRVU19GQUlMCTB4MDEKKyNkZWZpbmUgTkFORF9TVEFUVVNfRkFJTF9OMQkweDAyCisjZGVmaW5lIE5BTkRfU1RBVFVTX1RSVUVfUkVBRFkJMHgyMAorI2RlZmluZSBOQU5EX1NUQVRVU19SRUFEWQkweDQwCisjZGVmaW5lIE5BTkRfU1RBVFVTX1dQCQkweDgwCisKIC8qCisgKiBDb25zdGFudHMgZm9yIEVDQ19NT0RFUworICovCisKKy8qIE5vIEVDQy4gVXNhZ2UgaXMgbm90IHJlY29tbWVuZGVkICEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfTk9ORQkJMAorLyogU29mdHdhcmUgRUNDIDMgYnl0ZSBFQ0MgcGVyIDI1NiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfU09GVAkJMQorLyogSGFyZHdhcmUgRUNDIDMgYnl0ZSBFQ0MgcGVyIDI1NiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfSFczXzI1NgkyCisvKiBIYXJkd2FyZSBFQ0MgMyBieXRlIEVDQyBwZXIgNTEyIEJ5dGUgZGF0YSAqLworI2RlZmluZSBOQU5EX0VDQ19IVzNfNTEyCTMKKy8qIEhhcmR3YXJlIEVDQyAzIGJ5dGUgRUNDIHBlciA1MTIgQnl0ZSBkYXRhICovCisjZGVmaW5lIE5BTkRfRUNDX0hXNl81MTIJNAorLyogSGFyZHdhcmUgRUNDIDggYnl0ZSBFQ0MgcGVyIDUxMiBCeXRlIGRhdGEgKi8KKyNkZWZpbmUgTkFORF9FQ0NfSFc4XzUxMgk2CisvKiBIYXJkd2FyZSBFQ0MgMTIgYnl0ZSBFQ0MgcGVyIDIwNDggQnl0ZSBkYXRhICovCisjZGVmaW5lIE5BTkRfRUNDX0hXMTJfMjA0OAk3CisKKy8qCisgKiBDb25zdGFudHMgZm9yIEhhcmR3YXJlIEVDQworKi8KKy8qIFJlc2V0IEhhcmR3YXJlIEVDQyBmb3IgcmVhZCAqLworI2RlZmluZSBOQU5EX0VDQ19SRUFECQkwCisvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHdyaXRlICovCisjZGVmaW5lIE5BTkRfRUNDX1dSSVRFCQkxCisvKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tIGlzIHJlYWQgYmFjayBmcm9tIGZsYXNoICovCisjZGVmaW5lIE5BTkRfRUNDX1JFQURTWU4JMgorCisvKiBPcHRpb24gY29uc3RhbnRzIGZvciBiaXphcnJlIGRpc2Z1bmN0aW9uYWxpdHkgYW5kIHJlYWwKKyogIGZlYXR1cmVzCisqLworLyogQ2hpcCBjYW4gbm90IGF1dG8gaW5jcmVtZW50IHBhZ2VzICovCisjZGVmaW5lIE5BTkRfTk9fQVVUT0lOQ1IJMHgwMDAwMDAwMQorLyogQnVzd2l0ZGggaXMgMTYgYml0ICovCisjZGVmaW5lIE5BTkRfQlVTV0lEVEhfMTYJMHgwMDAwMDAwMgorLyogRGV2aWNlIHN1cHBvcnRzIHBhcnRpYWwgcHJvZ3JhbW1pbmcgd2l0aG91dCBwYWRkaW5nICovCisjZGVmaW5lIE5BTkRfTk9fUEFERElORwkJMHgwMDAwMDAwNAorLyogQ2hpcCBoYXMgY2FjaGUgcHJvZ3JhbSBmdW5jdGlvbiAqLworI2RlZmluZSBOQU5EX0NBQ0hFUFJHCQkweDAwMDAwMDA4CisvKiBDaGlwIGhhcyBjb3B5IGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTkFORF9DT1BZQkFDSwkJMHgwMDAwMDAxMAorLyogQU5EIENoaXAgd2hpY2ggaGFzIDQgYmFua3MgYW5kIGEgY29uZnVzaW5nIHBhZ2UgLyBibG9jaworICogYXNzaWdubWVudC4gU2VlIFJlbmVzYXMgZGF0YXNoZWV0IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE5BTkRfSVNfQU5ECQkweDAwMDAwMDIwCisvKiBDaGlwIGhhcyBhIGFycmF5IG9mIDQgcGFnZXMgd2hpY2ggY2FuIGJlIHJlYWQgd2l0aG91dAorICogYWRkaXRpb25hbCByZWFkeSAvYnVzeSB3YWl0cyAqLworI2RlZmluZSBOQU5EXzRQQUdFX0FSUkFZCTB4MDAwMDAwNDAKKworLyogT3B0aW9ucyB2YWxpZCBmb3IgU2Ftc3VuZyBsYXJnZSBwYWdlIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgXAorCShOQU5EX05PX1BBRERJTkcgfCBOQU5EX0NBQ0hFUFJHIHwgTkFORF9DT1BZQkFDSykKKworLyogTWFjcm9zIHRvIGlkZW50aWZ5IHRoZSBhYm92ZSAqLworI2RlZmluZSBOQU5EX0NBTkFVVE9JTkNSKGNoaXApICghKGNoaXAtPm9wdGlvbnMgJiBOQU5EX05PX0FVVE9JTkNSKSkKKyNkZWZpbmUgTkFORF9NVVNUX1BBRChjaGlwKSAoIShjaGlwLT5vcHRpb25zICYgTkFORF9OT19QQURESU5HKSkKKyNkZWZpbmUgTkFORF9IQVNfQ0FDSEVQUk9HKGNoaXApICgoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQ0FDSEVQUkcpKQorI2RlZmluZSBOQU5EX0hBU19DT1BZQkFDSyhjaGlwKSAoKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0NPUFlCQUNLKSkKKworLyogTWFzayB0byB6ZXJvIG91dCB0aGUgY2hpcCBvcHRpb25zLCB3aGljaCBjb21lIGZyb20gdGhlIGlkIHRhYmxlICovCisjZGVmaW5lIE5BTkRfQ0hJUE9QVElPTlNfTVNLCSgweDAwMDBmZmZmICYgfk5BTkRfTk9fQVVUT0lOQ1IpCisKKy8qIE5vbiBjaGlwIHJlbGF0ZWQgb3B0aW9ucyAqLworLyogVXNlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlLiBUaGlzIG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlCisgKiBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgTkFORF9VU0VfRkxBU0hfQkJUCTB4MDAwMTAwMDAKKy8qIFRoZSBodyBlY2MgZ2VuZXJhdG9yIHByb3ZpZGVzIGEgc3luZHJvbWUgaW5zdGVhZCBhIGVjYyB2YWx1ZSBvbiByZWFkCisgKiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgd2UgaGF2ZSB0aGUgZWNjIGJ5dGVzIGRpcmVjdGx5IGJlaGluZCB0aGUKKyAqIGRhdGEgYnl0ZXMuIEFwcGxpZXMgZm9yIERPQyBhbmQgQUctQU5EIFJlbmVzYXMgSFcgUmVlZCBTb2xvbW9uIGdlbmVyYXRvcnMgKi8KKyNkZWZpbmUgTkFORF9IV0VDQ19TWU5EUk9NRQkweDAwMDIwMDAwCisKKworLyogT3B0aW9ucyBzZXQgYnkgbmFuZCBzY2FuICovCisvKiBOYW5kIHNjYW4gaGFzIGFsbG9jYXRlZCBvb2JfYnVmICovCisjZGVmaW5lIE5BTkRfT09CQlVGX0FMTE9DCTB4NDAwMDAwMDAKKy8qIE5hbmQgc2NhbiBoYXMgYWxsb2NhdGVkIGRhdGFfYnVmICovCisjZGVmaW5lIE5BTkRfREFUQUJVRl9BTExPQwkweDgwMDAwMDAwCisKKworLyoKKyAqIG5hbmRfc3RhdGVfdCAtIGNoaXAgc3RhdGVzCiAgKiBFbnVtZXJhdGlvbiBmb3IgTkFORCBmbGFzaCBjaGlwIHN0YXRlCiAgKi8KIHR5cGVkZWYgZW51bSB7CkBAIC01OCw3MSArMjA2LDEzOCBAQAogCUZMX1JFQURJTkcsCiAJRkxfV1JJVElORywKIAlGTF9FUkFTSU5HLAotCUZMX1NZTkNJTkcKKwlGTF9TWU5DSU5HLAorCUZMX0NBQ0hFRFBSRywKIH0gbmFuZF9zdGF0ZV90OwogCisvKiBLZWVwIGdjYyBoYXBweSAqLworc3RydWN0IG5hbmRfY2hpcDsKIAotLyoKLSAqIE5BTkQgUHJpdmF0ZSBGbGFzaCBDaGlwIERhdGEKLSAqCi0gKiBTdHJ1Y3R1cmUgb3ZlcnZpZXc6Ci0gKgotICogIElPX0FERFIgLSBhZGRyZXNzIHRvIGFjY2VzcyB0aGUgOCBJL08gbGluZXMgb2YgdGhlIGZsYXNoIGRldmljZQotICoKLSAqICBod2NvbnRyb2wgLSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc2luZyBjb250cm9sLWxpbmVzCi0gKgotICogIGRldl9yZWFkeSAtIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFjY2VzaW5nIGRldmljZSByZWFkeS9idXN5IGxpbmUKLSAqCi0gKiAgY2hpcF9sb2NrIC0gc3BpbmxvY2sgdXNlZCB0byBwcm90ZWN0IGFjY2VzcyB0byB0aGlzIHN0cnVjdHVyZQotICoKLSAqICB3cSAtIHdhaXQgcXVldWUgdG8gc2xlZXAgb24gaWYgYSBOQU5EIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcwotICoKLSAqICBzdGF0ZSAtIGdpdmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIE5BTkQgZGV2aWNlCi0gKgotICogIHBhZ2Vfc2hpZnQgLSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIGluIGEgcGFnZSAoY29sdW1uIGFkZHJlc3MgYml0cykKLSAqCi0gKiAgZGF0YV9idWYgLSBkYXRhIGJ1ZmZlciBwYXNzZWQgdG8vZnJvbSBNVEQgdXNlciBtb2R1bGVzCi0gKgotICogIGRhdGFfY2FjaGUgLSBkYXRhIGNhY2hlIGZvciByZWR1bmRhbnQgcGFnZSBhY2Nlc3MgYW5kIHNoYWRvdyBmb3IKLSAqCQkgRUNDIGZhaWx1cmUKLSAqCi0gKiAgZWNjX2NvZGVfYnVmIC0gdXNlZCBvbmx5IGZvciBob2xkaW5nIGNhbGN1bGF0ZWQgb3IgcmVhZCBFQ0NzIGZvcgotICogICAgICAgICAgICAgICAgIGEgcGFnZSByZWFkIG9yIHdyaXR0ZW4gd2hlbiBFQ0MgaXMgaW4gdXNlCi0gKgotICogIHJlc2VydmVkIC0gcGFkZGluZyB0byBtYWtlIHN0cnVjdHVyZSBmYWxsIG9uIHdvcmQgYm91bmRhcnkgaWYKLSAqICAgICAgICAgICAgIHdoZW4gRUNDIGlzIGluIHVzZQorI2lmIDAKKy8qKgorICogc3RydWN0IG5hbmRfaHdfY29udHJvbCAtIENvbnRyb2wgc3RydWN0dXJlIGZvciBoYXJkd2FyZSBjb250cm9sbGVyIChlLmcgRUNDIGdlbmVyYXRvcikgc2hhcmVkIGFtb25nIGluZGVwZW5kZW5kIGRldmljZXMKKyAqIEBsb2NrOiAgICAgICAgICAgICAgIHByb3RlY3Rpb24gbG9jaworICogQGFjdGl2ZToJCXRoZSBtdGQgZGV2aWNlIHdoaWNoIGhvbGRzIHRoZSBjb250cm9sbGVyIGN1cnJlbnRseQogICovCi1zdHJ1Y3QgTmFuZCB7Ci0JY2hhciBmbG9vciwgY2hpcDsKLQl1bnNpZ25lZCBsb25nIGN1cmFkcjsKLQl1bnNpZ25lZCBjaGFyIGN1cm1vZGU7Ci0JLyogQWxzbyBzb21lIGVyYXNlL3dyaXRlL3BpcGVsaW5lIGluZm8gd2hlbiB3ZSBnZXQgdGhhdCBmYXIgKi8KK3N0cnVjdCBuYW5kX2h3X2NvbnRyb2wgeworCXNwaW5sb2NrX3QJIGxvY2s7CisJc3RydWN0IG5hbmRfY2hpcCAqYWN0aXZlOwogfTsKKyNlbmRpZgorCisvKioKKyAqIHN0cnVjdCBuYW5kX2NoaXAgLSBOQU5EIFByaXZhdGUgRmxhc2ggQ2hpcCBEYXRhCisgKiBASU9fQUREUl9SOgkJW0JPQVJEU1BFQ0lGSUNdIGFkZHJlc3MgdG8gcmVhZCB0aGUgOCBJL08gbGluZXMgb2YgdGhlIGZsYXNoIGRldmljZQorICogQElPX0FERFJfVzoJCVtCT0FSRFNQRUNJRklDXSBhZGRyZXNzIHRvIHdyaXRlIHRoZSA4IEkvTyBsaW5lcyBvZiB0aGUgZmxhc2ggZGV2aWNlCisgKiBAcmVhZF9ieXRlOgkJW1JFUExBQ0VBQkxFXSByZWFkIG9uZSBieXRlIGZyb20gdGhlIGNoaXAKKyAqIEB3cml0ZV9ieXRlOgkJW1JFUExBQ0VBQkxFXSB3cml0ZSBvbmUgYnl0ZSB0byB0aGUgY2hpcAorICogQHJlYWRfd29yZDoJCVtSRVBMQUNFQUJMRV0gcmVhZCBvbmUgd29yZCBmcm9tIHRoZSBjaGlwCisgKiBAd3JpdGVfd29yZDoJCVtSRVBMQUNFQUJMRV0gd3JpdGUgb25lIHdvcmQgdG8gdGhlIGNoaXAKKyAqIEB3cml0ZV9idWY6CQlbUkVQTEFDRUFCTEVdIHdyaXRlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHRvIHRoZSBjaGlwCisgKiBAcmVhZF9idWY6CQlbUkVQTEFDRUFCTEVdIHJlYWQgZGF0YSBmcm9tIHRoZSBjaGlwIGludG8gdGhlIGJ1ZmZlcgorICogQHZlcmlmeV9idWY6CQlbUkVQTEFDRUFCTEVdIHZlcmlmeSBidWZmZXIgY29udGVudHMgYWdhaW5zdCB0aGUgY2hpcCBkYXRhCisgKiBAc2VsZWN0X2NoaXA6CVtSRVBMQUNFQUJMRV0gc2VsZWN0IGNoaXAgbnIKKyAqIEBibG9ja19iYWQ6CQlbUkVQTEFDRUFCTEVdIGNoZWNrLCBpZiB0aGUgYmxvY2sgaXMgYmFkCisgKiBAYmxvY2tfbWFya2JhZDoJW1JFUExBQ0VBQkxFXSBtYXJrIHRoZSBibG9jayBiYWQKKyAqIEBod2NvbnRyb2w6CQlbQk9BUkRTUEVDSUZJQ10gaGFyZHdhcmVzcGVjaWZpYyBmdW5jdGlvbiBmb3IgYWNjZXNpbmcgY29udHJvbC1saW5lcworICogQGRldl9yZWFkeToJCVtCT0FSRFNQRUNJRklDXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc2luZyBkZXZpY2UgcmVhZHkvYnVzeSBsaW5lCisgKgkJCUlmIHNldCB0byBOVUxMIG5vIGFjY2VzcyB0byByZWFkeS9idXN5IGlzIGF2YWlsYWJsZSBhbmQgdGhlIHJlYWR5L2J1c3kgaW5mb3JtYXRpb24KKyAqCQkJaXMgcmVhZCBmcm9tIHRoZSBjaGlwIHN0YXR1cyByZWdpc3RlcgorICogQGNtZGZ1bmM6CQlbUkVQTEFDRUFCTEVdIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHdyaXRpbmcgY29tbWFuZHMgdG8gdGhlIGNoaXAKKyAqIEB3YWl0ZnVuYzoJCVtSRVBMQUNFQUJMRV0gaGFyZHdhcmVzcGVjaWZpYyBmdW5jdGlvbiBmb3Igd2FpdCBvbiByZWFkeQorICogQGNhbGN1bGF0ZV9lY2M6IAlbUkVQTEFDRUFCTEVdIGZ1bmN0aW9uIGZvciBlY2MgY2FsY3VsYXRpb24gb3IgcmVhZGJhY2sgZnJvbSBlY2MgaGFyZHdhcmUKKyAqIEBjb3JyZWN0X2RhdGE6CVtSRVBMQUNFQUJMRV0gZnVuY3Rpb24gZm9yIGVjYyBjb3JyZWN0aW9uLCBtYXRjaGluZyB0byBlY2MgZ2VuZXJhdG9yIChzdy9odykKKyAqIEBlbmFibGVfaHdlY2M6CVtCT0FSRFNQRUNJRklDXSBmdW5jdGlvbiB0byBlbmFibGUgKHJlc2V0KSBoYXJkd2FyZSBlY2MgZ2VuZXJhdG9yLiBNdXN0IG9ubHkKKyAqCQkJYmUgcHJvdmlkZWQgaWYgYSBoYXJkd2FyZSBFQ0MgaXMgYXZhaWxhYmxlCisgKiBAZXJhc2VfY21kOgkJW0lOVEVSTl0gZXJhc2UgY29tbWFuZCB3cml0ZSBmdW5jdGlvbiwgc2VsZWN0YWJsZSBkdWUgdG8gQU5EIHN1cHBvcnQKKyAqIEBzY2FuX2JidDoJCVtSRVBMQUNFQUJMRV0gZnVuY3Rpb24gdG8gc2NhbiBiYWQgYmxvY2sgdGFibGUKKyAqIEBlY2Ntb2RlOgkJW0JPQVJEU1BFQ0lGSUNdIG1vZGUgb2YgZWNjLCBzZWUgZGVmaW5lcworICogQGVjY3NpemU6IAkJW0lOVEVSTl0gZGF0YWJ5dGVzIHVzZWQgcGVyIGVjYy1jYWxjdWxhdGlvbgorICogQGVjY2J5dGVzOiAJCVtJTlRFUk5dIG51bWJlciBvZiBlY2MgYnl0ZXMgcGVyIGVjYy1jYWxjdWxhdGlvbiBzdGVwCisgKiBAZWNjc3RlcHM6CQlbSU5URVJOXSBudW1iZXIgb2YgZWNjIGNhbGN1bGF0aW9uIHN0ZXBzIHBlciBwYWdlCisgKiBAY2hpcF9kZWxheToJCVtCT0FSRFNQRUNJRklDXSBjaGlwIGRlcGVuZGVudCBkZWxheSBmb3IgdHJhbnNmZXJpbmcgZGF0YSBmcm9tIGFycmF5IHRvIHJlYWQgcmVncyAodFIpCisgKiBAY2hpcF9sb2NrOgkJW0lOVEVSTl0gc3BpbmxvY2sgdXNlZCB0byBwcm90ZWN0IGFjY2VzcyB0byB0aGlzIHN0cnVjdHVyZSBhbmQgdGhlIGNoaXAKKyAqIEB3cToJCQlbSU5URVJOXSB3YWl0IHF1ZXVlIHRvIHNsZWVwIG9uIGlmIGEgTkFORCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MKKyAqIEBzdGF0ZTogCQlbSU5URVJOXSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTkFORCBkZXZpY2UKKyAqIEBwYWdlX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBhZ2UgKGNvbHVtbiBhZGRyZXNzIGJpdHMpCisgKiBAcGh5c19lcmFzZV9zaGlmdDoJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBoeXNpY2FsIGVyYXNlYmxvY2sKKyAqIEBiYnRfZXJhc2Vfc2hpZnQ6CVtJTlRFUk5dIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgaW4gYSBiYnQgZW50cnkKKyAqIEBjaGlwX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBvbmUgY2hpcAorICogQGRhdGFfYnVmOgkJW0lOVEVSTl0gaW50ZXJuYWwgYnVmZmVyIGZvciBvbmUgcGFnZSArIG9vYgorICogQG9vYl9idWY6CQlbSU5URVJOXSBvb2IgYnVmZmVyIGZvciBvbmUgZXJhc2VibG9jaworICogQG9vYmRpcnR5OgkJW0lOVEVSTl0gaW5kaWNhdGVzIHRoYXQgb29iX2J1ZiBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQKKyAqIEBkYXRhX3BvaToJCVtJTlRFUk5dIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlcgorICogQG9wdGlvbnM6CQlbQk9BUkRTUEVDSUZJQ10gdmFyaW91cyBjaGlwIG9wdGlvbnMuIFRoZXkgY2FuIHBhcnRseSBiZSBzZXQgdG8gaW5mb3JtIG5hbmRfc2NhbiBhYm91dAorICoJCQlzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuIFNlZSB0aGUgZGVmaW5lcyBmb3IgZnVydGhlciBleHBsYW5hdGlvbgorICogQGJhZGJsb2NrcG9zOglbSU5URVJOXSBwb3NpdGlvbiBvZiB0aGUgYmFkIGJsb2NrIG1hcmtlciBpbiB0aGUgb29iIGFyZWEKKyAqIEBudW1jaGlwczoJCVtJTlRFUk5dIG51bWJlciBvZiBwaHlzaWNhbCBjaGlwcworICogQGNoaXBzaXplOgkJW0lOVEVSTl0gdGhlIHNpemUgb2Ygb25lIGNoaXAgZm9yIG11bHRpY2hpcCBhcnJheXMKKyAqIEBwYWdlbWFzazoJCVtJTlRFUk5dIHBhZ2UgbnVtYmVyIG1hc2sgPSBudW1iZXIgb2YgKHBhZ2VzIC8gY2hpcCkgLSAxCisgKiBAcGFnZWJ1ZjoJCVtJTlRFUk5dIGhvbGRzIHRoZSBwYWdlbnVtYmVyIHdoaWNoIGlzIGN1cnJlbnRseSBpbiBkYXRhX2J1ZgorICogQGF1dG9vb2I6CQlbUkVQTEFDRUFCTEVdIHRoZSBkZWZhdWx0IChhdXRvKXBsYWNlbWVudCBzY2hlbWUKKyAqIEBiYnQ6CQlbSU5URVJOXSBiYWQgYmxvY2sgdGFibGUgcG9pbnRlcgorICogQGJidF90ZDoJCVtSRVBMQUNFQUJMRV0gYmFkIGJsb2NrIHRhYmxlIGRlc2NyaXB0b3IgZm9yIGZsYXNoIGxvb2t1cAorICogQGJidF9tZDoJCVtSRVBMQUNFQUJMRV0gYmFkIGJsb2NrIHRhYmxlIG1pcnJvciBkZXNjcmlwdG9yCisgKiBAYmFkYmxvY2tfcGF0dGVybjoJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgc2NhbiBwYXR0ZXJuIHVzZWQgZm9yIGluaXRpYWwgYmFkIGJsb2NrIHNjYW4KKyAqIEBjb250cm9sbGVyOgkJW09QVElPTkFMXSBhIHBvaW50ZXIgdG8gYSBoYXJkd2FyZSBjb250cm9sbGVyIHN0cnVjdHVyZSB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5kZXBlbmRlbmQgZGV2aWNlcworICogQHByaXY6CQlbT1BUSU9OQUxdIHBvaW50ZXIgdG8gcHJpdmF0ZSBjaGlwIGRhdGUKKyAqLwogCiBzdHJ1Y3QgbmFuZF9jaGlwIHsKKwl2b2lkICBfX2lvbWVtCSpJT19BRERSX1I7CisJdm9pZCAgX19pb21lbSAJKklPX0FERFJfVzsKKworCXVfY2hhcgkJKCpyZWFkX2J5dGUpKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKKwl2b2lkCQkoKndyaXRlX2J5dGUpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSk7CisJdTE2CQkoKnJlYWRfd29yZCkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCXZvaWQJCSgqd3JpdGVfd29yZCkoc3RydWN0IG10ZF9pbmZvICptdGQsIHUxNiB3b3JkKTsKKworCXZvaWQJCSgqd3JpdGVfYnVmKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pOworCXZvaWQJCSgqcmVhZF9idWYpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbik7CisJaW50CQkoKnZlcmlmeV9idWYpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbik7CisJdm9pZAkJKCpzZWxlY3RfY2hpcCkoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKTsKKwlpbnQJCSgqYmxvY2tfYmFkKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgaW50IGdldGNoaXApOworCWludAkJKCpibG9ja19tYXJrYmFkKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CisJdm9pZCAJCSgqaHdjb250cm9sKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCk7CisJaW50ICAJCSgqZGV2X3JlYWR5KShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CisJdm9pZCAJCSgqY21kZnVuYykoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpOworCWludCAJCSgqd2FpdGZ1bmMpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBpbnQgc3RhdGUpOworCWludAkJKCpjYWxjdWxhdGVfZWNjKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpOworCWludCAJCSgqY29ycmVjdF9kYXRhKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpOworCXZvaWQJCSgqZW5hYmxlX2h3ZWNjKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpOworCXZvaWQJCSgqZXJhc2VfY21kKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHBhZ2UpOworCWludAkJKCpzY2FuX2JidCkoc3RydWN0IG10ZF9pbmZvICptdGQpOworCWludAkJZWNjbW9kZTsKKwlpbnQJCWVjY3NpemU7CisJaW50CQllY2NieXRlczsKKwlpbnQJCWVjY3N0ZXBzOworCWludCAJCWNoaXBfZGVsYXk7CisjaWYgMAorCXNwaW5sb2NrX3QJY2hpcF9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCW5hbmRfc3RhdGVfdCAJc3RhdGU7CisjZW5kaWYKIAlpbnQgCQlwYWdlX3NoaWZ0OworCWludAkJcGh5c19lcmFzZV9zaGlmdDsKKwlpbnQJCWJidF9lcmFzZV9zaGlmdDsKKwlpbnQJCWNoaXBfc2hpZnQ7CiAJdV9jaGFyIAkJKmRhdGFfYnVmOwotCXVfY2hhciAJCSpkYXRhX2NhY2hlOwotCWludAkJY2FjaGVfcGFnZTsKLQl1X2NoYXIgCQllY2NfY29kZV9idWZbNl07Ci0JdV9jaGFyIAkJcmVzZXJ2ZWRbMl07Ci0JY2hhciBDaGlwSUQ7IC8qIFR5cGUgb2YgRGlza09uQ2hpcCAqLwotCXN0cnVjdCBOYW5kICpjaGlwczsKLQlpbnQgY2hpcHNoaWZ0OwotCWNoYXIqIGNoaXBzX25hbWU7Ci0JdW5zaWduZWQgbG9uZyBlcmFzZXNpemU7Ci0JdW5zaWduZWQgbG9uZyBtZnI7IC8qIEZsYXNoIElEcyAtIG9ubHkgb25lIHR5cGUgb2YgZmxhc2ggcGVyIGRldmljZSAqLwotCXVuc2lnbmVkIGxvbmcgaWQ7Ci0JY2hhciogbmFtZTsKLQlpbnQgbnVtY2hpcHM7Ci0JY2hhciBwYWdlMjU2OwotCWNoYXIgcGFnZWFkcmxlbjsKLQl1bnNpZ25lZCBsb25nIElPX0FERFI7ICAvKiBhZGRyZXNzIHRvIGFjY2VzcyB0aGUgOCBJL08gbGluZXMgdG8gdGhlIGZsYXNoIGRldmljZSAqLwotCXVuc2lnbmVkIGxvbmcgdG90bGVuOwotCXVpbnQgb29iYmxvY2s7ICAvKiBTaXplIG9mIE9PQiBibG9ja3MgKGUuZy4gNTEyKSAqLwotCXVpbnQgb29ic2l6ZTsgICAvKiBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KSAqLwotCXVpbnQgZWNjc2l6ZTsKLQlpbnQgYnVzMTY7CisJdV9jaGFyCQkqb29iX2J1ZjsKKwlpbnQJCW9vYmRpcnR5OworCXVfY2hhcgkJKmRhdGFfcG9pOworCXVuc2lnbmVkIGludAlvcHRpb25zOworCWludAkJYmFkYmxvY2twb3M7CisJaW50CQludW1jaGlwczsKKwl1bnNpZ25lZCBsb25nCWNoaXBzaXplOworCWludAkJcGFnZW1hc2s7CisJaW50CQlwYWdlYnVmOworCXN0cnVjdCBuYW5kX29vYmluZm8JKmF1dG9vb2I7CisJdWludDhfdAkJKmJidDsKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IJKmJidF90ZDsKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IJKmJidF9tZDsKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IJKmJhZGJsb2NrX3BhdHRlcm47CisJc3RydWN0IG5hbmRfaHdfY29udHJvbCAgKmNvbnRyb2xsZXI7CisJdm9pZAkJKnByaXY7CiB9OwogCiAvKgpAQCAtMTMwLDcxICszNDUsMTI1IEBACiAgKi8KICNkZWZpbmUgTkFORF9NRlJfVE9TSElCQQkweDk4CiAjZGVmaW5lIE5BTkRfTUZSX1NBTVNVTkcJMHhlYworI2RlZmluZSBOQU5EX01GUl9GVUpJVFNVCTB4MDQKKyNkZWZpbmUgTkFORF9NRlJfTkFUSU9OQUwJMHg4ZgorI2RlZmluZSBOQU5EX01GUl9SRU5FU0FTCTB4MDcKKyNkZWZpbmUgTkFORF9NRlJfU1RNSUNSTwkweDIwCiAKLS8qCi0gKiBOQU5EIEZsYXNoIERldmljZSBJRCBTdHJ1Y3R1cmUKKy8qKgorICogc3RydWN0IG5hbmRfZmxhc2hfZGV2IC0gTkFORCBGbGFzaCBEZXZpY2UgSUQgU3RydWN0dXJlCiAgKgotICogU3RydWN0dXJlIG92ZXJ2aWV3OgotICoKLSAqICBuYW1lIC0gQ29tcGxldGUgbmFtZSBvZiBkZXZpY2UKLSAqCi0gKiAgbWFudWZhY3R1cmVfaWQgLSBtYW51ZmFjdHVyZXIgSUQgY29kZSBvZiBkZXZpY2UuCi0gKgotICogIG1vZGVsX2lkIC0gbW9kZWwgSUQgY29kZSBvZiBkZXZpY2UuCi0gKgotICogIGNoaXBzaGlmdCAtIHRvdGFsIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgZm9yIHRoZSBkZXZpY2Ugd2hpY2gKLSAqICAgICAgICAgICAgICBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBhZGRyZXNzIG9mZnNldHMgYW5kIHRoZSB0b3RhbAotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyB0aGUgZGV2aWNlIGlzIGNhcGFibGUgb2YuCi0gKgotICogIHBhZ2UyNTYgLSBkZW5vdGVzIGlmIGZsYXNoIGRldmljZSBoYXMgMjU2IGJ5dGUgcGFnZXMgb3Igbm90LgotICoKLSAqICBwYWdlYWRybGVuIC0gbnVtYmVyIG9mIGJ5dGVzIG1pbnVzIG9uZSBuZWVkZWQgdG8gaG9sZCB0aGUKLSAqICAgICAgICAgICAgICAgY29tcGxldGUgYWRkcmVzcyBpbnRvIHRoZSBmbGFzaCBhcnJheS4gS2VlcCBpbgotICogICAgICAgICAgICAgICBtaW5kIHRoYXQgd2hlbiBhIHJlYWQgb3Igd3JpdGUgaXMgZG9uZSB0byBhCi0gKiAgICAgICAgICAgICAgIHNwZWNpZmljIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGlzIGlucHV0IHNlcmlhbGx5Ci0gKiAgICAgICAgICAgICAgIDggYml0cyBhdCBhIHRpbWUuIFRoaXMgc3RydWN0dXJlIG1lbWJlciBpcyB1c2VkCi0gKiAgICAgICAgICAgICAgIGJ5IHRoZSByZWFkL3dyaXRlIHJvdXRpbmVzIGFzIGEgbG9vcCBpbmRleCBmb3IKLSAqICAgICAgICAgICAgICAgc2hpZnRpbmcgdGhlIGFkZHJlc3Mgb3V0IDggYml0cyBhdCBhIHRpbWUuCi0gKgotICogIGVyYXNlc2l6ZSAtIHNpemUgb2YgYW4gZXJhc2UgYmxvY2sgaW4gdGhlIGZsYXNoIGRldmljZS4KKyAqIEBuYW1lOiAgCUlkZW50aWZ5IHRoZSBkZXZpY2UgdHlwZQorICogQGlkOiAgIAlkZXZpY2UgSUQgY29kZQorICogQHBhZ2VzaXplOiAgCVBhZ2VzaXplIGluIGJ5dGVzLiBFaXRoZXIgMjU2IG9yIDUxMiBvciAwCisgKgkJSWYgdGhlIHBhZ2VzaXplIGlzIDAsIHRoZW4gdGhlIHJlYWwgcGFnZXNpemUKKyAqCQlhbmQgdGhlIGVyYXNlaXplIGFyZSBkZXRlcm1pbmVkIGZyb20gdGhlCisgKgkJZXh0ZW5kZWQgaWQgYnl0ZXMgaW4gdGhlIGNoaXAKKyAqIEBlcmFzZXNpemU6IAlTaXplIG9mIGFuIGVyYXNlIGJsb2NrIGluIHRoZSBmbGFzaCBkZXZpY2UuCisgKiBAY2hpcHNpemU6ICAJVG90YWwgY2hpcHNpemUgaW4gTWVnYSBCeXRlcworICogQG9wdGlvbnM6CUJpdGZpZWxkIHRvIHN0b3JlIGNoaXAgcmVsZXZhbnQgb3B0aW9ucwogICovCiBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgewotCWNoYXIgKiBuYW1lOwotCWludCBtYW51ZmFjdHVyZV9pZDsKLQlpbnQgbW9kZWxfaWQ7Ci0JaW50IGNoaXBzaGlmdDsKLQljaGFyIHBhZ2UyNTY7Ci0JY2hhciBwYWdlYWRybGVuOworCWNoYXIgKm5hbWU7CisJaW50IGlkOworCXVuc2lnbmVkIGxvbmcgcGFnZXNpemU7CisJdW5zaWduZWQgbG9uZyBjaGlwc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGVyYXNlc2l6ZTsKLQlpbnQgYnVzMTY7CisJdW5zaWduZWQgbG9uZyBvcHRpb25zOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXJzIC0gTkFORCBGbGFzaCBNYW51ZmFjdHVyZXIgSUQgU3RydWN0dXJlCisgKiBAbmFtZToJTWFudWZhY3R1cmVyIG5hbWUKKyAqIEBpZDogCW1hbnVmYWN0dXJlciBJRCBjb2RlIG9mIGRldmljZS4KKyovCitzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXJzIHsKKwlpbnQgaWQ7CisJY2hhciAqIG5hbWU7Cit9OworCitleHRlcm4gc3RydWN0IG5hbmRfZmxhc2hfZGV2IG5hbmRfZmxhc2hfaWRzW107CitleHRlcm4gc3RydWN0IG5hbmRfbWFudWZhY3R1cmVycyBuYW5kX21hbnVmX2lkc1tdOworCisvKioKKyAqIHN0cnVjdCBuYW5kX2JidF9kZXNjciAtIGJhZCBibG9jayB0YWJsZSBkZXNjcmlwdG9yCisgKiBAb3B0aW9uczoJb3B0aW9ucyBmb3IgdGhpcyBkZXNjcmlwdG9yCisgKiBAcGFnZXM6CXRoZSBwYWdlKHMpIHdoZXJlIHdlIGZpbmQgdGhlIGJidCwgdXNlZCB3aXRoIG9wdGlvbiBCQlRfQUJTUEFHRQorICoJCXdoZW4gYmJ0IGlzIHNlYXJjaGVkLCB0aGVuIHdlIHN0b3JlIHRoZSBmb3VuZCBiYnRzIHBhZ2VzIGhlcmUuCisgKgkJSXRzIGFuIGFycmF5IGFuZCBzdXBwb3J0cyB1cCB0byA4IGNoaXBzIG5vdworICogQG9mZnM6CW9mZnNldCBvZiB0aGUgcGF0dGVybiBpbiB0aGUgb29iIGFyZWEgb2YgdGhlIHBhZ2UKKyAqIEB2ZXJvZmZzOglvZmZzZXQgb2YgdGhlIGJidCB2ZXJzaW9uIGNvdW50ZXIgaW4gdGhlIG9vYiBhcmUgb2YgdGhlIHBhZ2UKKyAqIEB2ZXJzaW9uOgl2ZXJzaW9uIHJlYWQgZnJvbSB0aGUgYmJ0IHBhZ2UgZHVyaW5nIHNjYW4KKyAqIEBsZW46CWxlbmd0aCBvZiB0aGUgcGF0dGVybiwgaWYgMCBubyBwYXR0ZXJuIGNoZWNrIGlzIHBlcmZvcm1lZAorICogQG1heGJsb2NrczoJbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHRvIHNlYXJjaCBmb3IgYSBiYnQuIFRoaXMgbnVtYmVyIG9mCisgKgkJYmxvY2tzIGlzIHJlc2VydmVkIGF0IHRoZSBlbmQgb2YgdGhlIGRldmljZSB3aGVyZSB0aGUgdGFibGVzIGFyZQorICoJCXdyaXR0ZW4uCisgKiBAcmVzZXJ2ZWRfYmxvY2tfY29kZTogaWYgbm9uLTAsIHRoaXMgcGF0dGVybiBkZW5vdGVzIGEgcmVzZXJ2ZWQgKHJhdGhlciB0aGFuCisgKiAgICAgICAgICAgICAgYmFkKSBibG9jayBpbiB0aGUgc3RvcmVkIGJidAorICogQHBhdHRlcm46CXBhdHRlcm4gdG8gaWRlbnRpZnkgYmFkIGJsb2NrIHRhYmxlIG9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLworICoJCWJhZCBibG9ja3MsIGNhbiBiZSBOVUxMLCBpZiBsZW4gPSAwCisgKgorICogRGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtYXJrZXIgYW5kIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUKKyAqIHBhdHRlcm4gd2hpY2ggaWRlbnRpZmllcyBnb29kIGFuZCBiYWQgYmxvY2tzLiBUaGUgYXNzdW1wdGlvbiBpcyBtYWRlCisgKiB0aGF0IHRoZSBwYXR0ZXJuIGFuZCB0aGUgdmVyc2lvbiBjb3VudCBhcmUgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIG9vYiBhcmVhCisgKiBvZiB0aGUgZmlyc3QgYmxvY2suCisgKi8KK3N0cnVjdCBuYW5kX2JidF9kZXNjciB7CisJaW50CW9wdGlvbnM7CisJaW50CXBhZ2VzW05BTkRfTUFYX0NISVBTXTsKKwlpbnQJb2ZmczsKKwlpbnQJdmVyb2ZmczsKKwl1aW50OF90CXZlcnNpb25bTkFORF9NQVhfQ0hJUFNdOworCWludAlsZW47CisJaW50IAltYXhibG9ja3M7CisJaW50CXJlc2VydmVkX2Jsb2NrX2NvZGU7CisJdWludDhfdAkqcGF0dGVybjsKK307CisKKy8qIE9wdGlvbnMgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUgZGVzY3JpcHRvcnMgKi8KKworLyogVGhlIG51bWJlciBvZiBiaXRzIHVzZWQgcGVyIGJsb2NrIGluIHRoZSBiYnQgb24gdGhlIGRldmljZSAqLworI2RlZmluZSBOQU5EX0JCVF9OUkJJVFNfTVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgTkFORF9CQlRfMUJJVAkJMHgwMDAwMDAwMQorI2RlZmluZSBOQU5EX0JCVF8yQklUCQkweDAwMDAwMDAyCisjZGVmaW5lIE5BTkRfQkJUXzRCSVQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTkFORF9CQlRfOEJJVAkJMHgwMDAwMDAwOAorLyogVGhlIGJhZCBibG9jayB0YWJsZSBpcyBpbiB0aGUgbGFzdCBnb29kIGJsb2NrIG9mIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUJTkFORF9CQlRfTEFTVEJMT0NLCTB4MDAwMDAwMTAKKy8qIFRoZSBiYnQgaXMgYXQgdGhlIGdpdmVuIHBhZ2UsIGVsc2Ugd2UgbXVzdCBzY2FuIGZvciB0aGUgYmJ0ICovCisjZGVmaW5lIE5BTkRfQkJUX0FCU1BBR0UJMHgwMDAwMDAyMAorLyogVGhlIGJidCBpcyBhdCB0aGUgZ2l2ZW4gcGFnZSwgZWxzZSB3ZSBtdXN0IHNjYW4gZm9yIHRoZSBiYnQgKi8KKyNkZWZpbmUgTkFORF9CQlRfU0VBUkNICQkweDAwMDAwMDQwCisvKiBiYnQgaXMgc3RvcmVkIHBlciBjaGlwIG9uIG11bHRpY2hpcCBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfQkJUX1BFUkNISVAJMHgwMDAwMDA4MAorLyogYmJ0IGhhcyBhIHZlcnNpb24gY291bnRlciBhdCBvZmZzZXQgdmVyb2ZmcyAqLworI2RlZmluZSBOQU5EX0JCVF9WRVJTSU9OCTB4MDAwMDAxMDAKKy8qIENyZWF0ZSBhIGJidCBpZiBub25lIGF4aXN0cyAqLworI2RlZmluZSBOQU5EX0JCVF9DUkVBVEUJCTB4MDAwMDAyMDAKKy8qIFNlYXJjaCBnb29kIC8gYmFkIHBhdHRlcm4gdGhyb3VnaCBhbGwgcGFnZXMgb2YgYSBibG9jayAqLworI2RlZmluZSBOQU5EX0JCVF9TQ0FOQUxMUEFHRVMJMHgwMDAwMDQwMAorLyogU2NhbiBibG9jayBlbXB0eSBkdXJpbmcgZ29vZCAvIGJhZCBibG9jayBzY2FuICovCisjZGVmaW5lIE5BTkRfQkJUX1NDQU5FTVBUWQkweDAwMDAwODAwCisvKiBXcml0ZSBiYnQgaWYgbmVjY2VjYXJ5ICovCisjZGVmaW5lIE5BTkRfQkJUX1dSSVRFCQkweDAwMDAxMDAwCisvKiBSZWFkIGFuZCB3cml0ZSBiYWNrIGJsb2NrIGNvbnRlbnRzIHdoZW4gd3JpdGluZyBiYnQgKi8KKyNkZWZpbmUgTkFORF9CQlRfU0FWRUNPTlRFTlQJMHgwMDAwMjAwMAorLyogU2VhcmNoIGdvb2QgLyBiYWQgcGF0dGVybiBvbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcGFnZSAqLworI2RlZmluZSBOQU5EX0JCVF9TQ0FOMk5EUEFHRQkweDAwMDA0MDAwCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgdG8gc2NhbiBmb3IgYSBiYnQgKi8KKyNkZWZpbmUgTkFORF9CQlRfU0NBTl9NQVhCTE9DS1MJNAorCitleHRlcm4gaW50IG5hbmRfc2Nhbl9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKTsKK2V4dGVybiBpbnQgbmFuZF91cGRhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMpOworZXh0ZXJuIGludCBuYW5kX2RlZmF1bHRfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CitleHRlcm4gaW50IG5hbmRfaXNiYWRfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIGludCBhbGxvd2JidCk7CitleHRlcm4gaW50IG5hbmRfZXJhc2VfbmFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0ciwgaW50IGFsbG93YmJ0KTsKKwogLyoKICogQ29uc3RhbnRzIGZvciBvb2IgY29uZmlndXJhdGlvbgogKi8KLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzAJCTAKLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzEJCTEKLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzIJCTIKLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzMJCTMKLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzQJCTYKLSNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzUJCTcKLSNkZWZpbmUgTkFORF9OT09CX0JBREJQT1MJCS0xCi0jZGVmaW5lIE5BTkRfTk9PQl9FQ0NWUE9TCQktMQotCi0jZGVmaW5lIE5BTkRfSkZGUzJfT09CX0VDQ1BPUzAJCTAKLSNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDUE9TMQkJMQotI2RlZmluZSBOQU5EX0pGRlMyX09PQl9FQ0NQT1MyCQkyCi0jZGVmaW5lIE5BTkRfSkZGUzJfT09CX0VDQ1BPUzMJCTMKLSNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDUE9TNAkJNgotI2RlZmluZSBOQU5EX0pGRlMyX09PQl9FQ0NQT1M1CQk3Ci0jZGVmaW5lIE5BTkRfSkZGUzJfT09CX0JBREJQT1MJCTUKLSNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDVlBPUwkJNAotCi0jZGVmaW5lIE5BTkRfSkZGUzJfT09COF9GU0RBUE9TCQk2Ci0jZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQVBPUwk4Ci0jZGVmaW5lIE5BTkRfSkZGUzJfT09COF9GU0RBTEVOCQkyCi0jZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTgk4Ci0KLXVuc2lnbmVkIGxvbmcgbmFuZF9wcm9iZSh1bnNpZ25lZCBsb25nIHBoeXNhZHIpOworI2RlZmluZSBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUwkJNQorI2RlZmluZSBOQU5EX0xBUkdFX0JBREJMT0NLX1BPUwkJMAogCiAjZW5kaWYgLyogX19MSU5VWF9NVERfTkFORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kX2VjYy5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZF9lY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM1YmMzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZF9lY2MuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogIGRyaXZlcnMvbXRkL25hbmRfZWNjLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tKQorICoKKyAqICRJZDogbmFuZF9lY2MuaCx2IDEuNCAyMDA0LzA2LzE3IDAyOjM1OjAyIGRicm93biBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHRoZSBoZWFkZXIgZm9yIHRoZSBFQ0MgYWxnb3JpdGhtLgorICovCisKKyNpZm5kZWYgX19NVERfTkFORF9FQ0NfSF9fCisjZGVmaW5lIF9fTVREX05BTkRfRUNDX0hfXworCitzdHJ1Y3QgbXRkX2luZm87CisKKy8qCisgKiBDYWxjdWxhdGUgMyBieXRlIEVDQyBjb2RlIGZvciAyNTYgYnl0ZSBibG9jaworICovCitpbnQgbmFuZF9jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSk7CisKKy8qCisgKiBEZXRlY3QgYW5kIGNvcnJlY3QgYSAxIGJpdCBlcnJvciBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqLworaW50IG5hbmRfY29ycmVjdF9kYXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYyk7CisKKyNlbmRpZiAvKiBfX01URF9OQU5EX0VDQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmRfaWRzLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kX2lkcy5oCmluZGV4IGEzZDAzNjMuLmQ5ZWI5MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL25hbmRfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZF9pZHMuaApAQCAtMjgsNiArMjgsMTAgQEAKICNpZm5kZWYgX19MSU5VWF9NVERfTkFORF9JRFNfSAogI2RlZmluZSBfX0xJTlVYX01URF9OQU5EX0lEU19ICiAKKyNpZm5kZWYgQ0ZHX05BTkRfTEVHQUNZCisjZXJyb3IgVGhpcyBtb2R1bGUgaXMgZm9yIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiBuYW5kX2ZsYXNoX2lkc1tdID0gewogCXsiVG9zaGliYSBUQzU4MTZCREMiLCAgICAgTkFORF9NRlJfVE9TSElCQSwgMHg2NCwgMjEsIDEsIDIsIDB4MTAwMCwgMH0sCiAJeyJUb3NoaWJhIFRDNTgzMkRDIiwgICAgICBOQU5EX01GUl9UT1NISUJBLCAweDZiLCAyMiwgMCwgMiwgMHgyMDAwLCAwfSwKQEAgLTQ5LDYgKzUzLDcgQEAKIAl7IlNhbXN1bmcgS00yOVcxNjAwMCIsICAgIE5BTkRfTUZSX1NBTVNVTkcsIDB4ZWEsIDIxLCAxLCAyLCAweDEwMDAsIDB9LAogCXsiU2Ftc3VuZyBLOUY1NjE2UTBDIiwgICAgTkFORF9NRlJfU0FNU1VORywgMHg0NSwgMjUsIDAsIDIsIDB4NDAwMCwgMX0sCiAJeyJTYW1zdW5nIEs5SzEyMTZRMEMiLCAgICBOQU5EX01GUl9TQU1TVU5HLCAweDQ2LCAyNiwgMCwgMywgMHg0MDAwLCAxfSwKKwl7IlNhbXN1bmcgSzlGMUcwOFUwTSIsICAgIE5BTkRfTUZSX1NBTVNVTkcsIDB4ZjEsIDI3LCAwLCAyLCAwLCAwfSwKIAl7TlVMTCx9CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kX2xlZ2FjeS5oIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZF9sZWdhY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc2OWU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZF9sZWdhY3kuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAbXZoaS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgIFN0ZXZlbiBKLiBIaWxsIDxzamhpbGxAY290dy5jb20+CisgKgkJICAgICAgIFRob21hcyBHbGVpeG5lciA8Z2xlaXhuZXJAYXV0cm9uaXguZGU+CisgKgorICogJElkOiBuYW5kLmgsdiAxLjcgMjAwMy8wNy8yNCAyMzozMDo0NiBhMDM4NDg2NCBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEluZm86CisgKiAgIENvbnRhaW5zIHN0YW5kYXJkIGRlZmluZXMgYW5kIElEcyBmb3IgTkFORCBmbGFzaCBkZXZpY2VzCisgKgorICogIENoYW5nZWxvZzoKKyAqICAgMDEtMzEtMjAwMCBETVcgICAgIENyZWF0ZWQKKyAqICAgMDktMTgtMjAwMCBTSkggICAgIE1vdmVkIHN0cnVjdHVyZSBvdXQgb2YgdGhlIERpc2stT24tQ2hpcCBkcml2ZXJzCisgKgkJCXNvIGl0IGNhbiBiZSB1c2VkIGJ5IG90aGVyIE5BTkQgZmxhc2ggZGV2aWNlCisgKgkJCWRyaXZlcnMuIEkgYWxzbyBjaGFuZ2VkIHRoZSBjb3B5cmlnaHQgc2luY2Ugbm9uZQorICoJCQlvZiB0aGUgb3JpZ2luYWwgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzcGVjaWZpYworICoJCQl0byBEb0MgZGV2aWNlcy4gRGF2aWQgY2FuIHdoYWNrIG1lIHdpdGggYSBiYXNlYmFsbAorICoJCQliYXQgbGF0ZXIgaWYgSSBkaWQgc29tZXRoaW5nIG5hdWdodHkuCisgKiAgIDEwLTExLTIwMDAgU0pIICAgICBBZGRlZCBwcml2YXRlIE5BTkQgZmxhc2ggc3RydWN0dXJlIGZvciBkcml2ZXIKKyAqICAgMTAtMjQtMjAwMCBTSkggICAgIEFkZGVkIHByb3RvdHlwZSBmb3IgJ25hbmRfc2NhbicgZnVuY3Rpb24KKyAqICAgMTAtMjktMjAwMSBURwljaGFuZ2VkIG5hbmRfY2hpcCBzdHJ1Y3R1cmUgdG8gc3VwcG9ydAorICoJCQloYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgY29udHJvbCBsaW5lcworICogICAwMi0yMS0yMDAyIFRHCWFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCByZWFkL3dyaXRlIGFkcmVzcyBhbmQKKyAqCQkJcmVhZHkvYnVzeSBsaW5lIGFjY2VzcyBmdW5jdGlvbgorICogICAwMi0yNi0yMDAyIFRHCWFkZGVkIGNoaXBfZGVsYXkgdG8gbmFuZF9jaGlwIHN0cnVjdHVyZSB0byBvcHRpbWl6ZQorICoJCQljb21tYW5kIGRlbGF5IHRpbWVzIGZvciBkaWZmZXJlbnQgY2hpcHMKKyAqICAgMDQtMjgtMjAwMiBURwlPT0IgY29uZmlnIGRlZmluZXMgbW92ZWQgZnJvbSBuYW5kLmMgdG8gYXZvaWQgZHVwbGljYXRlCisgKgkJCWRlZmluZXMgaW4gamZmczIvd2J1Zi5jCisgKi8KKyNpZm5kZWYgX19MSU5VWF9NVERfTkFORF9MRUdBQ1lfSAorI2RlZmluZSBfX0xJTlVYX01URF9OQU5EX0xFR0FDWV9ICisKKyNpZm5kZWYgQ0ZHX05BTkRfTEVHQUNZCisjZXJyb3IgVGhpcyBtb2R1bGUgaXMgZm9yIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0CisjZW5kaWYKKworLyoKKyAqIFN0YW5kYXJkIE5BTkQgZmxhc2ggY29tbWFuZHMKKyAqLworI2RlZmluZSBOQU5EX0NNRF9SRUFEMAkJMAorI2RlZmluZSBOQU5EX0NNRF9SRUFEMQkJMQorI2RlZmluZSBOQU5EX0NNRF9QQUdFUFJPRwkweDEwCisjZGVmaW5lIE5BTkRfQ01EX1JFQURPT0IJMHg1MAorI2RlZmluZSBOQU5EX0NNRF9FUkFTRTEJCTB4NjAKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTCQkweDcwCisjZGVmaW5lIE5BTkRfQ01EX1NFUUlOCQkweDgwCisjZGVmaW5lIE5BTkRfQ01EX1JFQURJRAkJMHg5MAorI2RlZmluZSBOQU5EX0NNRF9FUkFTRTIJCTB4ZDAKKyNkZWZpbmUgTkFORF9DTURfUkVTRVQJCTB4ZmYKKworLyoKKyAqIEVudW1lcmF0aW9uIGZvciBOQU5EIGZsYXNoIGNoaXAgc3RhdGUKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlGTF9SRUFEWSwKKwlGTF9SRUFESU5HLAorCUZMX1dSSVRJTkcsCisJRkxfRVJBU0lORywKKwlGTF9TWU5DSU5HCit9IG5hbmRfc3RhdGVfdDsKKworCisvKgorICogTkFORCBQcml2YXRlIEZsYXNoIENoaXAgRGF0YQorICoKKyAqIFN0cnVjdHVyZSBvdmVydmlldzoKKyAqCisgKiAgSU9fQUREUiAtIGFkZHJlc3MgdG8gYWNjZXNzIHRoZSA4IEkvTyBsaW5lcyBvZiB0aGUgZmxhc2ggZGV2aWNlCisgKgorICogIGh3Y29udHJvbCAtIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGFjY2VzaW5nIGNvbnRyb2wtbGluZXMKKyAqCisgKiAgZGV2X3JlYWR5IC0gaGFyZHdhcmVzcGVjaWZpYyBmdW5jdGlvbiBmb3IgYWNjZXNpbmcgZGV2aWNlIHJlYWR5L2J1c3kgbGluZQorICoKKyAqICBjaGlwX2xvY2sgLSBzcGlubG9jayB1c2VkIHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoaXMgc3RydWN0dXJlCisgKgorICogIHdxIC0gd2FpdCBxdWV1ZSB0byBzbGVlcCBvbiBpZiBhIE5BTkQgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisgKgorICogIHN0YXRlIC0gZ2l2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTkFORCBkZXZpY2UKKyAqCisgKiAgcGFnZV9zaGlmdCAtIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgaW4gYSBwYWdlIChjb2x1bW4gYWRkcmVzcyBiaXRzKQorICoKKyAqICBkYXRhX2J1ZiAtIGRhdGEgYnVmZmVyIHBhc3NlZCB0by9mcm9tIE1URCB1c2VyIG1vZHVsZXMKKyAqCisgKiAgZGF0YV9jYWNoZSAtIGRhdGEgY2FjaGUgZm9yIHJlZHVuZGFudCBwYWdlIGFjY2VzcyBhbmQgc2hhZG93IGZvcgorICoJCSBFQ0MgZmFpbHVyZQorICoKKyAqICBlY2NfY29kZV9idWYgLSB1c2VkIG9ubHkgZm9yIGhvbGRpbmcgY2FsY3VsYXRlZCBvciByZWFkIEVDQ3MgZm9yCisgKiAgICAgICAgICAgICAgICAgYSBwYWdlIHJlYWQgb3Igd3JpdHRlbiB3aGVuIEVDQyBpcyBpbiB1c2UKKyAqCisgKiAgcmVzZXJ2ZWQgLSBwYWRkaW5nIHRvIG1ha2Ugc3RydWN0dXJlIGZhbGwgb24gd29yZCBib3VuZGFyeSBpZgorICogICAgICAgICAgICAgd2hlbiBFQ0MgaXMgaW4gdXNlCisgKi8KK3N0cnVjdCBOYW5kIHsKKwljaGFyIGZsb29yLCBjaGlwOworCXVuc2lnbmVkIGxvbmcgY3VyYWRyOworCXVuc2lnbmVkIGNoYXIgY3VybW9kZTsKKwkvKiBBbHNvIHNvbWUgZXJhc2Uvd3JpdGUvcGlwZWxpbmUgaW5mbyB3aGVuIHdlIGdldCB0aGF0IGZhciAqLworfTsKKworc3RydWN0IG5hbmRfY2hpcCB7CisJaW50IAkJcGFnZV9zaGlmdDsKKwl1X2NoYXIgCQkqZGF0YV9idWY7CisJdV9jaGFyIAkJKmRhdGFfY2FjaGU7CisJaW50CQljYWNoZV9wYWdlOworCXVfY2hhciAJCWVjY19jb2RlX2J1Zls2XTsKKwl1X2NoYXIgCQlyZXNlcnZlZFsyXTsKKwljaGFyIENoaXBJRDsgLyogVHlwZSBvZiBEaXNrT25DaGlwICovCisJc3RydWN0IE5hbmQgKmNoaXBzOworCWludCBjaGlwc2hpZnQ7CisJY2hhciogY2hpcHNfbmFtZTsKKwl1bnNpZ25lZCBsb25nIGVyYXNlc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1mcjsgLyogRmxhc2ggSURzIC0gb25seSBvbmUgdHlwZSBvZiBmbGFzaCBwZXIgZGV2aWNlICovCisJdW5zaWduZWQgbG9uZyBpZDsKKwljaGFyKiBuYW1lOworCWludCBudW1jaGlwczsKKwljaGFyIHBhZ2UyNTY7CisJY2hhciBwYWdlYWRybGVuOworCXVuc2lnbmVkIGxvbmcgSU9fQUREUjsgIC8qIGFkZHJlc3MgdG8gYWNjZXNzIHRoZSA4IEkvTyBsaW5lcyB0byB0aGUgZmxhc2ggZGV2aWNlICovCisJdW5zaWduZWQgbG9uZyB0b3RsZW47CisJdWludCBvb2JibG9jazsgIC8qIFNpemUgb2YgT09CIGJsb2NrcyAoZS5nLiA1MTIpICovCisJdWludCBvb2JzaXplOyAgIC8qIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpICovCisJdWludCBlY2NzaXplOworCWludCBidXMxNjsKK307CisKKy8qCisgKiBOQU5EIEZsYXNoIE1hbnVmYWN0dXJlciBJRCBDb2RlcworICovCisjZGVmaW5lIE5BTkRfTUZSX1RPU0hJQkEJMHg5OAorI2RlZmluZSBOQU5EX01GUl9TQU1TVU5HCTB4ZWMKKworLyoKKyAqIE5BTkQgRmxhc2ggRGV2aWNlIElEIFN0cnVjdHVyZQorICoKKyAqIFN0cnVjdHVyZSBvdmVydmlldzoKKyAqCisgKiAgbmFtZSAtIENvbXBsZXRlIG5hbWUgb2YgZGV2aWNlCisgKgorICogIG1hbnVmYWN0dXJlX2lkIC0gbWFudWZhY3R1cmVyIElEIGNvZGUgb2YgZGV2aWNlLgorICoKKyAqICBtb2RlbF9pZCAtIG1vZGVsIElEIGNvZGUgb2YgZGV2aWNlLgorICoKKyAqICBjaGlwc2hpZnQgLSB0b3RhbCBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIGZvciB0aGUgZGV2aWNlIHdoaWNoCisgKiAgICAgICAgICAgICAgaXMgdXNlZCB0byBjYWxjdWxhdGUgYWRkcmVzcyBvZmZzZXRzIGFuZCB0aGUgdG90YWwKKyAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdGhlIGRldmljZSBpcyBjYXBhYmxlIG9mLgorICoKKyAqICBwYWdlMjU2IC0gZGVub3RlcyBpZiBmbGFzaCBkZXZpY2UgaGFzIDI1NiBieXRlIHBhZ2VzIG9yIG5vdC4KKyAqCisgKiAgcGFnZWFkcmxlbiAtIG51bWJlciBvZiBieXRlcyBtaW51cyBvbmUgbmVlZGVkIHRvIGhvbGQgdGhlCisgKiAgICAgICAgICAgICAgIGNvbXBsZXRlIGFkZHJlc3MgaW50byB0aGUgZmxhc2ggYXJyYXkuIEtlZXAgaW4KKyAqICAgICAgICAgICAgICAgbWluZCB0aGF0IHdoZW4gYSByZWFkIG9yIHdyaXRlIGlzIGRvbmUgdG8gYQorICogICAgICAgICAgICAgICBzcGVjaWZpYyBhZGRyZXNzLCB0aGUgYWRkcmVzcyBpcyBpbnB1dCBzZXJpYWxseQorICogICAgICAgICAgICAgICA4IGJpdHMgYXQgYSB0aW1lLiBUaGlzIHN0cnVjdHVyZSBtZW1iZXIgaXMgdXNlZAorICogICAgICAgICAgICAgICBieSB0aGUgcmVhZC93cml0ZSByb3V0aW5lcyBhcyBhIGxvb3AgaW5kZXggZm9yCisgKiAgICAgICAgICAgICAgIHNoaWZ0aW5nIHRoZSBhZGRyZXNzIG91dCA4IGJpdHMgYXQgYSB0aW1lLgorICoKKyAqICBlcmFzZXNpemUgLSBzaXplIG9mIGFuIGVyYXNlIGJsb2NrIGluIHRoZSBmbGFzaCBkZXZpY2UuCisgKi8KK3N0cnVjdCBuYW5kX2ZsYXNoX2RldiB7CisJY2hhciAqIG5hbWU7CisJaW50IG1hbnVmYWN0dXJlX2lkOworCWludCBtb2RlbF9pZDsKKwlpbnQgY2hpcHNoaWZ0OworCWNoYXIgcGFnZTI1NjsKKwljaGFyIHBhZ2VhZHJsZW47CisJdW5zaWduZWQgbG9uZyBlcmFzZXNpemU7CisJaW50IGJ1czE2OworfTsKKworLyoKKyogQ29uc3RhbnRzIGZvciBvb2IgY29uZmlndXJhdGlvbgorKi8KKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzAJCTAKKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzEJCTEKKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzIJCTIKKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzMJCTMKKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzQJCTYKKyNkZWZpbmUgTkFORF9OT09CX0VDQ1BPUzUJCTcKKyNkZWZpbmUgTkFORF9OT09CX0JBREJQT1MJCS0xCisjZGVmaW5lIE5BTkRfTk9PQl9FQ0NWUE9TCQktMQorCisjZGVmaW5lIE5BTkRfSkZGUzJfT09CX0VDQ1BPUzAJCTAKKyNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDUE9TMQkJMQorI2RlZmluZSBOQU5EX0pGRlMyX09PQl9FQ0NQT1MyCQkyCisjZGVmaW5lIE5BTkRfSkZGUzJfT09CX0VDQ1BPUzMJCTMKKyNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDUE9TNAkJNgorI2RlZmluZSBOQU5EX0pGRlMyX09PQl9FQ0NQT1M1CQk3CisjZGVmaW5lIE5BTkRfSkZGUzJfT09CX0JBREJQT1MJCTUKKyNkZWZpbmUgTkFORF9KRkZTMl9PT0JfRUNDVlBPUwkJNAorCisjZGVmaW5lIE5BTkRfSkZGUzJfT09COF9GU0RBUE9TCQk2CisjZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQVBPUwk4CisjZGVmaW5lIE5BTkRfSkZGUzJfT09COF9GU0RBTEVOCQkyCisjZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTgk4CisKK3Vuc2lnbmVkIGxvbmcgbmFuZF9wcm9iZSh1bnNpZ25lZCBsb25nIHBoeXNhZHIpOworI2VuZGlmIC8qIF9fTElOVVhfTVREX05BTkRfTEVHQUNZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmFuZC5oIGIvaW5jbHVkZS9uYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1MTE1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmFuZC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUKKyAqIDJOIFRlbGVrb211bmlrYWNlLCBhLnMuIDx3d3cuMm4uY3o+CisgKiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfTkFORF9IXworI2RlZmluZSBfTkFORF9IXworCisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorCit0eXBlZGVmIHN0cnVjdCBtdGRfaW5mbyBuYW5kX2luZm9fdDsKKworZXh0ZXJuIGludCBuYW5kX2N1cnJfZGV2aWNlOworZXh0ZXJuIG5hbmRfaW5mb190IG5hbmRfaW5mb1tdOworCitzdGF0aWMgaW5saW5lIGludCBuYW5kX3JlYWQobmFuZF9pbmZvX3QgKmluZm8sIHVsb25nIG9mcywgdWxvbmcgKmxlbiwgdV9jaGFyICpidWYpCit7CisJcmV0dXJuIGluZm8tPnJlYWQoaW5mbywgb2ZzLCAqbGVuLCAoc2l6ZV90ICopbGVuLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuYW5kX3dyaXRlKG5hbmRfaW5mb190ICppbmZvLCB1bG9uZyBvZnMsIHVsb25nICpsZW4sIHVfY2hhciAqYnVmKQoreworCXJldHVybiBpbmZvLT53cml0ZShpbmZvLCBvZnMsICpsZW4sIChzaXplX3QgKilsZW4sIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5hbmRfYmxvY2tfaXNiYWQobmFuZF9pbmZvX3QgKmluZm8sIHVsb25nIG9mcykKK3sKKwlyZXR1cm4gaW5mby0+YmxvY2tfaXNiYWQoaW5mbywgb2ZzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmFuZF9lcmFzZShuYW5kX2luZm9fdCAqaW5mbywgdWxvbmcgb2ZmLCB1bG9uZyBzaXplKQoreworCXN0cnVjdCBlcmFzZV9pbmZvIGluc3RyOworCisJaW5zdHIubXRkID0gaW5mbzsKKwlpbnN0ci5hZGRyID0gb2ZmOworCWluc3RyLmxlbiA9IHNpemU7CisJaW5zdHIuY2FsbGJhY2sgPSAwOworCisJcmV0dXJuIGluZm8tPmVyYXNlKGluZm8sICZpbnN0cik7Cit9CisKKyNlbmRpZgo=