ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CmluZGV4IDFjNDFkYjIuLjU5MTA4Y2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dApAQCAtODIsMTMgKzgyLDYgQEAKICAgL2Rldi9mZCA6IC0+IDB4MDIwMCAoZmxvcHB5IGRpc2spCiAgIC9kZXYveGRhOiAtPiAweDBjMDAgKGZpcnN0IFhUIGRpc2ssIHVudXNlZCBpbiBMaW51eC9tNjhrKQogICAvZGV2L3hkYjogLT4gMHgwYzQwIChzZWNvbmQgWFQgZGlzaywgdW51c2VkIGluIExpbnV4L202OGspCi0gIC9kZXYvYWRhOiAtPiAweDFjMDAgKGZpcnN0IEFDU0kgZGV2aWNlKQotICAvZGV2L2FkYjogLT4gMHgxYzEwIChzZWNvbmQgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRjOiAtPiAweDFjMjAgKHRoaXJkIEFDU0kgZGV2aWNlKQotICAvZGV2L2FkZDogLT4gMHgxYzMwIChmb3J0aCBBQ1NJIGRldmljZSkKLQotVGhlIGxhc3QgZm91ciBuYW1lcyBhcmUgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIGtlcm5lbCBoYXMgYmVlbiBjb21waWxlZAotd2l0aCBBdGFyaSBhbmQgQUNTSSBzdXBwb3J0LgogCiAgIFRoZSBuYW1lIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBkZWNpbWFsIG51bWJlciwgdGhhdCBzdGFuZHMgZm9yIHRoZQogcGFydGl0aW9uIG51bWJlci4gSW50ZXJuYWxseSwgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXIgaXMganVzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQKaW5kZXggMGIyNzg2My4uOThjNDM5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0CkBAIC0xNDYsMTIgKzE0Niw2IEBACiAJaXJxID0gMAogCShQcm9iZXMgcG9ydHM6IDB4MjYwLCAweDI4MCwgMHgyQTAsIDB4MjQwLCAweDM0MCwgMHgzMjAsIDB4MzgwLCAweDMwMCkKIAotYXRhcmlfYmlvbmV0LmM6Ci0JU3VwcG9ydHMgZnVsbCBhdXRvcHJvYmluZy4gKG02OGsvQXRhcmkpCi0KLWF0YXJpX3BhbXNuZXQuYzoKLQlTdXBwb3J0cyBmdWxsIGF1dG9wcm9iaW5nLiAobTY4ay9BdGFyaSkKLQogYXRhcmlsYW5jZS5jOgogCVN1cHBvcnRzIGZ1bGwgYXV0b3Byb2JpbmcuIChtNjhrL0F0YXJpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggNmUyM2FmMS4uOTVkNjgzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtNTksMTcgKzU5LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHoycmFtLgogCi1jb25maWcgQVRBUklfU0xNCi0JdHJpc3RhdGUgIkF0YXJpIFNMTSBsYXNlciBwcmludGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVEFSSQotCWhlbHAKLQkgIElmIHlvdSBoYXZlIGFuIEF0YXJpIFNMTSBsYXNlciBwcmludGVyLCBzYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yCi0JICBpdCBpbiB0aGUga2VybmVsLiBPdGhlcndpc2UsIHNheSBOLiBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcwotCSAgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlCi0JICBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKLQkgIGFjc2lfc2xtLiBCZSB3YXJuZWQ6IHRoZSBkcml2ZXIgbmVlZHMgbXVjaCBTVC1SQU0gYW5kIGNhbiBjYXVzZQotCSAgcHJvYmxlbXMgZHVlIHRvIHRoYXQgZmFjdCEKLQogY29uZmlnIEJMS19ERVZfWEQKIAl0cmlzdGF0ZSAiWFQgaGFyZCBkaXNrIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJU0EgJiYgSVNBX0RNQV9BUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUgYi9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCmluZGV4IGU1Zjk4YWMuLmJiYTMxMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX0ZEKQkrPSBmbG9wcHkubwogb2JqLSQoQ09ORklHX0FNSUdBX0ZMT1BQWSkJKz0gYW1pZmxvcC5vCiBvYmotJChDT05GSUdfQVRBUklfRkxPUFBZKQkrPSBhdGFmbG9wLm8KLW9iai0kKENPTkZJR19BVEFSSV9TTE0pCQkrPSBhY3NpX3NsbS5vCiBvYmotJChDT05GSUdfQU1JR0FfWjJSQU0pCSs9IHoycmFtLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1JBTSkJKz0gcmQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfTE9PUCkJKz0gbG9vcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMgYi9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWQ5YjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogYWNzaV9zbG0uYyAtLSBEZXZpY2UgZHJpdmVyIGZvciB0aGUgQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NSBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICogCi0gKi8KLQotLyoKLQotTm90ZXM6Ci0KLVRoZSBtYWpvciBudW1iZXIgZm9yIFNMTSBwcmludGVycyBpcyAyOCAobGlrZSBBQ1NJKSwgYnV0IGFzIGEgY2hhcmFjdGVyCi1kZXZpY2UsIG5vdCBibG9jayBkZXZpY2UuIFRoZSBtaW5vciBudW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcHJpbnRlciAoaWYKLXlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgU0xNOyBjdXJyZW50bHkgbWF4LiAyICgjZGVmaW5lLWNvbnN0YW50KSBTTE1zIGFyZQotc3VwcG9ydGVkKS4gVGhlIGRldmljZSBjYW4gYmUgb3BlbmVkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiBJZiByZWFkaW5nIGl0LAoteW91IGdldCBzb21lIHN0YXR1cyBpbmZvcyAoTU9ERSBTRU5TRSBkYXRhKS4gV3JpdGluZyBtb2RlIGlzIHVzZWQgZm9yIHRoZSBkYXRhCi10byBiZSBwcmludGVkLiBTb21lIGlvY3RscyBhbGxvdyB0byBnZXQgdGhlIHByaW50ZXIgc3RhdHVzIGFuZCB0byB0dW5lIHByaW50ZXIKLW1vZGVzIGFuZCBzb21lIGludGVybmFsIHZhcmlhYmxlcy4KLQotQSBzcGVjaWFsIHByb2JsZW0gb2YgdGhlIFNMTSBkcml2ZXIgaXMgdGhlIHRpbWluZyBhbmQgdGh1cyB0aGUgYnVmZmVyaW5nIG9mCi10aGUgcHJpbnQgZGF0YS4gVGhlIHByb2JsZW0gaXMgdGhhdCBhbGwgdGhlIGRhdGEgZm9yIG9uZSBwYWdlIG11c3QgYmUgcHJlc2VudAotaW4gbWVtb3J5IHdoZW4gcHJpbnRpbmcgc3RhcnRzLCBlbHNlIC0td2hlbiBzd2FwcGluZyBvY2N1cnMtLSB0aGUgdGltaW5nIGNvdWxkCi1ub3QgYmUgZ3VhcmFudGVlZC4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBhc3N1cmUgdGhpczoKLQotIDEpIFJlc2VydmUgYSBidWZmZXIgb2YgMTE5NmsgKG1heGltdW0gcGFnZSBzaXplKSBzdGF0aWNhbGx5IGJ5Ci0gICAgYXRhcmlfc3RyYW1fYWxsb2MoKS4gVGhlIGRhdGEgYXJlIGNvbGxlY3RlZCB0aGVyZSB1bnRpbCB0aGV5J3JlIGNvbXBsZXRlLAotCWFuZCB0aGVuIHByaW50aW5nIHN0YXJ0cy4gU2luY2UgdGhlIGJ1ZmZlciBpcyByZXNlcnZlZCwgbm8gZnVydGhlcgotCWNvbnNpZGVyYXRpb25zIGFib3V0IG1lbW9yeSBhbmQgc3dhcHBpbmcgYXJlIG5lZWRlZC4gU28gdGhpcyBpcyB0aGUKLQlzaW1wbGVzdCBtZXRob2QsIGJ1dCBpdCBuZWVkcyBhIGxvdCBvZiBtZW1vcnkgZm9yIGp1c3QgdGhlIFNMTS4KLQotICAgIEFuIHN0cmlraW5nIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyAoc3VwcG9zZWQgdGhlIFNMTV9DT05UX0NOVF9SRVBST0cKLQltZXRob2Qgd29ya3MsIHNlZSB0aGVyZSksIHRoYXQgdGhlcmUgYXJlIG5vIHRpbWluZyBwcm9ibGVtcyB3aXRoIHRoZSBETUEKLQlhbnltb3JlLgotCQotIDIpIFRoZSBvdGhlciBtZXRob2Qgd291bGQgYmUgdG8gcmVzZXJ2ZSB0aGUgYnVmZmVyIGR5bmFtaWNhbGx5IGVhY2ggdGltZQotICAgIHByaW50aW5nIGlzIHJlcXVpcmVkLiBJIGNvdWxkIHRoaW5rIG9mIGxvb2tpbmcgYXQgbWVtX21hcCB3aGVyZSB0aGUKLQlsYXJnZXN0IHVuYWxsb2N0ZWQgU1QtUkFNIGFyZWEgaXMsIHRha2luZyB0aGUgYXJlYSwgYW5kIHRoZW4gZXh0ZW5kaW5nIGl0Ci0JYnkgc3dhcHBpbmcgb3V0IHRoZSBuZWlnaGJvcmVkIHBhZ2VzLCB1bnRpbCB0aGUgbmVlZGVkIHNpemUgaXMgcmVhY2hlZC4KLQlUaGlzIHJlcXVpcmVzIHNvbWUgbW0gaGFja2luZywgYnV0IHNlZW1zIHBvc3NpYmxlLiBUaGUgb25seSBvYnN0YWNsZSBjb3VsZAotCWJlIHBhZ2VzIHRoYXQgY2Fubm90IGJlIHN3YXBwZWQgb3V0IChyZXNlcnZlZCBwYWdlcykuLi4KLQotIDMpIEFub3RoZXIgcG9zc2liaWxpdHkgd291bGQgYmUgdG8gbGVhdmUgdGhlIHJlYWwgZGF0YSBpbiB1c2VyIHNwYWNlIGFuZCB0bwotICAgIHdvcmsgd2l0aCB0d28gZHJpYmJsZSBidWZmZXJzIG9mIGFib3V0IDMyayBpbiB0aGUgZHJpdmVyOiBXaGlsZSB0aGUgb25lCi0JYnVmZmVyIGlzIERNQWVkIHRvIHRoZSBTTE0sIHRoZSBvdGhlciBjYW4gYmUgZmlsbGVkIHdpdGggbmV3IGRhdGEuIEJ1dAotCXRvIGtlZXAgdGhlIHRpbWluZywgdGhhdCByZXF1aXJlcyB0aGF0IHRoZSB1c2VyIGRhdGEgcmVtYWluIGluIG1lbW9yeSBhbmQKLQlhcmUgbm90IHN3YXBwZWQgb3V0LiBSZXF1aXJlcyBtbSBoYWNraW5nLCB0b28sIGJ1dCBtYXliZSBub3Qgc28gYmFkIGFzCi0JbWV0aG9kIDIpLgotCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX1NMTS5oPgotCi0KLSN1bmRlZglERUJVRwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgcGFnZSBkYXRhIGFyZSBjb250aW51b3VzIGluIHBoeXNpY2FsIG1lbW9yeS4gVGhhdAotICogcmVxdWlyZXMgbGVzcyByZXByb2dyYW1taW5nIG9mIHRoZSBTVC1ETUEgKi8KLSNkZWZpbmUJU0xNX0NPTlRJTlVPVVNfRE1BCi0KLS8qIFVzZSBjb250aW51b3VzIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIFNULURNQSBjb3VudGVyIHJlZ2lzdGVyLiBUaGlzIGlzCi0gKiAtLXN0cmljdGx5IHNwZWFraW5nLS0gbm90IGFsbG93ZWQsIEF0YXJpIHJlY29tbWVuZHMgbm90IHRvIGxvb2sgYXQgdGhlCi0gKiBjb3VudGVyIHJlZ2lzdGVyIHdoaWxlIGEgRE1BIGlzIGdvaW5nIG9uLiBCdXQgSSBkb24ndCBrbm93IGlmIHRoYXQgYXBwbGllcwotICogb25seSBmb3IgcmVhZGluZyB0aGUgcmVnaXN0ZXIsIG9yIGFsc28gd3JpdGluZyB0byBpdC4gV3JpdGluZyBvbmx5IHdvcmtzCi0gKiBmaW5lIGZvciBtZS4uLiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIHRpbWluZyBiZWNvbWVzIGFic29sdXRlbHkKLSAqIHVuY3JpdGljYWw6IEp1c3QgdXBkYXRlIGVhY2gsIHNheSAyMDBtcywgdGhlIGNvdW50ZXIgcmVnIHRvIGl0cyBtYXhpbXVtLAotICogYW5kIHRoZSBETUEgd2lsbCB3b3JrIHVudGlsIHRoZSBzdGF0dXMgYnl0ZSBpbnRlcnJ1cHQgb2NjdXJzLgotICovCi0jZGVmaW5lCVNMTV9DT05UX0NOVF9SRVBST0cKLQotI2RlZmluZSBDTURTRVRfVEFSR19MVU4oY21kLHRhcmcsbHVuKQkJCVwKLSAgICBkbyB7CQkJCQkJCQkJCVwKLQkJY21kWzBdID0gKGNtZFswXSAmIH4weGUwKSB8ICh0YXJnKTw8NTsJXAotCQljbWRbMV0gPSAoY21kWzFdICYgfjB4ZTApIHwgKGx1bik8PDU7CVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUJU1RBUlRfVElNRVIodG8pCW1vZF90aW1lcigmc2xtX3RpbWVyLCBqaWZmaWVzICsgKHRvKSkKLSNkZWZpbmUJU1RPUF9USU1FUigpCWRlbF90aW1lcigmc2xtX3RpbWVyKQotCi0KLXN0YXRpYyBjaGFyIHNsbXJlcXNlbnNlX2NtZFs2XSA9IHsgMHgwMywgMCwgMCwgMCwgMCwgMCB9Owotc3RhdGljIGNoYXIgc2xtcHJpbnRfY21kWzZdICAgID0geyAweDBhLCAwLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgY2hhciBzbG1pbnF1aXJ5X2NtZFs2XSAgPSB7IDB4MTIsIDAsIDAsIDAsIDAsIDB4ODAgfTsKLXN0YXRpYyBjaGFyIHNsbW1zZW5zZV9jbWRbNl0gICA9IHsgMHgxYSwgMCwgMCwgMCwgMjU1LCAwIH07Ci0jaWYgMAotc3RhdGljIGNoYXIgc2xtbXNlbGVjdF9jbWRbNl0gID0geyAweDE1LCAwLCAwLCAwLCAwLCAwIH07Ci0jZW5kaWYKLQotCi0jZGVmaW5lCU1BWF9TTE0JCTIKLQotc3RhdGljIHN0cnVjdCBzbG0gewotCXVuc2lnbmVkCXRhcmdldDsJCQkvKiB0YXJnZXQgbnVtYmVyICovCi0JdW5zaWduZWQJbHVuOwkJCS8qIExVTiBpbiB0YXJnZXQgY29udHJvbGxlciAqLwotCWF0b21pY190CXdyX29rOyAJCQkvKiBzZXQgdG8gMCBpZiBvdXRwdXQgcGFydCBidXN5ICovCi0JYXRvbWljX3QJcmRfb2s7CQkJLyogc2V0IHRvIDAgaWYgc3RhdHVzIHBhcnQgYnVzeSAqLwotfSBzbG1faW5mb1tNQVhfU0xNXTsKLQotaW50IE5fU0xNX1ByaW50ZXJzID0gMDsKLQotLyogcHJpbnRlciBidWZmZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCSpTTE1CdWZmZXI7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIJKkJ1ZmZlclA7CS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCi1zdGF0aWMgaW50CQkJCUJ1ZmZlclNpemU7CS8qIGxlbmd0aCBvZiBidWZmZXIgZm9yIHBhZ2Ugc2l6ZSAqLwotCi10eXBlZGVmIGVudW0geyBJRExFLCBGSUxMSU5HLCBQUklOVElORyB9IFNMTVNUQVRFOwotc3RhdGljIFNMTVNUQVRFCQkJU0xNU3RhdGU7Ci1zdGF0aWMgaW50CQkJCVNMTUJ1Zk93bmVyOwkvKiBTTE0jIGN1cnJlbnRseSB1c2luZyB0aGUgYnVmZmVyICovCi0KLS8qIERNQSB2YXJpYWJsZXMgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNQ3VyQWRkcjsJCS8qIGN1cnJlbnQgYmFzZSBhZGRyIG9mIERNQSBjaHVuayAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNRW5kQWRkcjsJCS8qIGV4cGVjdGVkIGVuZCBhZGRyICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlTTE1TbGljZVNpemU7CS8qIHNpemUgb2Ygb25lIERNQSBjaHVuayAqLwotI2VuZGlmCi1zdGF0aWMgaW50CQkJCVNMTUVycm9yOwotCi0vKiB3YWl0IHF1ZXVlcyAqLwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNsbV93YWl0KTsJLyogd2FpdGluZyBmb3IgYnVmZmVyICovCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJpbnRfd2FpdCk7CS8qIHdhaXRpbmcgZm9yIHByaW50aW5nIGZpbmlzaGVkICovCi0KLS8qIHN0YXR1cyBjb2RlcyAqLwotI2RlZmluZQlTTE1TVEFUX09LCQkweDAwCi0jZGVmaW5lCVNMTVNUQVRfT1JORVJZCTB4MDIKLSNkZWZpbmUJU0xNU1RBVF9UT05FUgkweDAzCi0jZGVmaW5lCVNMTVNUQVRfV0FSTVVQCTB4MDQKLSNkZWZpbmUJU0xNU1RBVF9QQVBFUgkweDA1Ci0jZGVmaW5lCVNMTVNUQVRfRFJVTQkweDA2Ci0jZGVmaW5lCVNMTVNUQVRfSU5KQU0JMHgwNwotI2RlZmluZQlTTE1TVEFUX1RIUkpBTQkweDA4Ci0jZGVmaW5lCVNMTVNUQVRfT1VUSkFNCTB4MDkKLSNkZWZpbmUJU0xNU1RBVF9DT1ZFUgkweDBhCi0jZGVmaW5lCVNMTVNUQVRfRlVTRVIJMHgwYgotI2RlZmluZQlTTE1TVEFUX0lNQUdFUgkweDBjCi0jZGVmaW5lCVNMTVNUQVRfTU9UT1IJMHgwZAotI2RlZmluZQlTTE1TVEFUX1ZJREVPCTB4MGUKLSNkZWZpbmUJU0xNU1RBVF9TWVNUTwkweDEwCi0jZGVmaW5lCVNMTVNUQVRfT1BDT0RFCTB4MTIKLSNkZWZpbmUJU0xNU1RBVF9ERVZOVU0JMHgxNQotI2RlZmluZQlTTE1TVEFUX1BBUkFNCTB4MWEKLSNkZWZpbmUJU0xNU1RBVF9BQ1NJVE8JMHgxYgkvKiBkcml2ZXIgZGVmaW5lZCAqLwotI2RlZmluZQlTTE1TVEFUX05PVEFMTAkweDFjCS8qIGRyaXZlciBkZWZpbmVkICovCi0KLXN0YXRpYyBjaGFyICpTTE1FcnJvcnNbXSA9IHsKLQkvKiAweDAwICovCSJPSyBhbmQgcmVhZHkiLAotCS8qIDB4MDEgKi8JTlVMTCwKLQkvKiAweDAyICovCSJvcm5lcnkgcHJpbnRlciIsCi0JLyogMHgwMyAqLwkidG9uZXIgZW1wdHkiLAotCS8qIDB4MDQgKi8JIndhcm1pbmcgdXAiLAotCS8qIDB4MDUgKi8JInBhcGVyIGVtcHR5IiwKLQkvKiAweDA2ICovCSJkcnVtIGVtcHR5IiwKLQkvKiAweDA3ICovCSJpbnB1dCBqYW0iLAotCS8qIDB4MDggKi8JInRocm91Z2ggamFtIiwKLQkvKiAweDA5ICovCSJvdXRwdXQgamFtIiwKLQkvKiAweDBhICovCSJjb3ZlciBvcGVuIiwKLQkvKiAweDBiICovCSJmdXNlciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwYyAqLwkiaW1hZ2VyIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBkICovCSJtb3RvciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwZSAqLwkidmlkZW8gbWFsZnVuY3Rpb24iLAotCS8qIDB4MGYgKi8JTlVMTCwKLQkvKiAweDEwICovCSJwcmludGVyIHN5c3RlbSB0aW1lb3V0IiwKLQkvKiAweDExICovCU5VTEwsCi0JLyogMHgxMiAqLwkiaW52YWxpZCBvcGVyYXRpb24gY29kZSIsCi0JLyogMHgxMyAqLwlOVUxMLAotCS8qIDB4MTQgKi8JTlVMTCwKLQkvKiAweDE1ICovCSJpbnZhbGlkIGRldmljZSBudW1iZXIiLAotCS8qIDB4MTYgKi8JTlVMTCwKLQkvKiAweDE3ICovCU5VTEwsCi0JLyogMHgxOCAqLwlOVUxMLAotCS8qIDB4MTkgKi8JTlVMTCwKLQkvKiAweDFhICovCSJpbnZhbGlkIHBhcmFtZXRlciBsaXN0IiwKLQkvKiAweDFiICovCSJBQ1NJIHRpbWVvdXQiLAotCS8qIDB4MWMgKi8JIm5vdCBhbGwgcHJpbnRlZCIKLX07Ci0KLSNkZWZpbmUJTl9FUlJPUlMJKHNpemVvZihTTE1FcnJvcnMpL3NpemVvZigqU0xNRXJyb3JzKSkKLQotLyogcmVhbCAoZHJpdmVyIGNhdXNlZCkgZXJyb3I/ICovCi0jZGVmaW5lCUlTX1JFQUxfRVJST1IoeCkJKHggPiAweDEwKQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIJKm5hbWU7Ci0JaW50IAl3LCBoOwotfSBTdGRQYWdlU2l6ZVtdID0gewotCXsgIkxldHRlciIsIDI0MDAsIDMxODAgfSwKLQl7ICJMZWdhbCIsICAyNDAwLCA0MDgwIH0sCi0JeyAiQTQiLCAgICAgMjMzNiwgMzM4NiB9LAotCXsgIkI1IiwgICAgIDIwMTYsIDI5MTQgfQotfTsKLQotI2RlZmluZQlOX1NURF9TSVpFUwkJKHNpemVvZihTdGRQYWdlU2l6ZSkvc2l6ZW9mKCpTdGRQYWdlU2l6ZSkpCi0KLSNkZWZpbmUJU0xNX0JVRkZFUl9TSVpFCSgyMzM2KjMzODYvOCkJLyogQTQgZm9yIG5vdyAqLwotI2RlZmluZQlTTE1fRE1BX0FNT1VOVAkyNTUJCQkJLyogI3NlY3RvcnMgdG8gcHJvZ3JhbSB0aGUgRE1BIGZvciAqLwotCi0jaWZkZWYJU0xNX0NPTlRJTlVPVVNfRE1BCi0jIGRlZmluZQlTTE1fRE1BX0lOVF9PRkZTRVQJMAkJLyogRE1BIGdvZXMgdW50aWwgc2VjY250IDAsIG5vIG9mZnMgKi8KLSMgZGVmaW5lCVNMTV9ETUFfRU5EX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX1NMSUNFX1NJWkUodykgCSgyNTUqNTEyKQotI2Vsc2UKLSMgZGVmaW5lCVNMTV9ETUFfSU5UX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX0RNQV9FTkRfT0ZGU0VUCTMyCQkvKiAzMiBCeXRlIFNULURNQSBGSUZPICovCi0jIGRlZmluZQlTTE1fU0xJQ0VfU0laRSh3KQkoKDI1NCo1MTIpLyh3LzgpKih3LzgpKQotI2VuZGlmCi0KLS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdCBmb3IgJ24nIGJ5dGVzICovCi0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotI2RlZmluZQlETUFfVElNRV9GT1IobikJCTUwCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJMAotI2Vsc2UKLSNkZWZpbmUJRE1BX1RJTUVfRk9SKG4pCQkobi8xNDAwLTEpCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJNjUwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApOwotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApOwotc3RhdGljIHNzaXplX3Qgc2xtX3JlYWQoIHN0cnVjdCBmaWxlKiBmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKnBwb3MgKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X3ByaW50KCBpbnQgZGV2aWNlICk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgc2xtX2ludGVycnVwdChpbnQgaXJjLCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIHNsbV90ZXN0X3JlYWR5KCB1bnNpZ25lZCBsb25nIGR1bW15ICk7Ci1zdGF0aWMgdm9pZCBzZXRfZG1hX2FkZHIoIHVuc2lnbmVkIGxvbmcgcGFkZHIgKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9kbWFfYWRkciggdm9pZCApOwotc3RhdGljIHNzaXplX3Qgc2xtX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyApOwotc3RhdGljIGludCBzbG1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci1zdGF0aWMgaW50IHNsbV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOwotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKLXN0YXRpYyBpbnQgc2xtX3JlcV9zZW5zZSggaW50IGRldmljZSApOwotc3RhdGljIGludCBzbG1fbW9kZV9zZW5zZSggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgYWJzX2ZsYWcgKTsKLSNpZiAwCi1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbGVjdCggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZsYWcgKTsKLSNlbmRpZgotc3RhdGljIGludCBzbG1fZ2V0X3BhZ2VzaXplKCBpbnQgZGV2aWNlLCBpbnQgKncsIGludCAqaCApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgREVGSU5FX1RJTUVSKHNsbV90aW1lciwgc2xtX3Rlc3RfcmVhZHksIDAsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbG1fZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkucmVhZCA9CQlzbG1fcmVhZCwKLQkud3JpdGUgPQlzbG1fd3JpdGUsCi0JLmlvY3RsID0Jc2xtX2lvY3RsLAotCS5vcGVuID0JCXNsbV9vcGVuLAotCS5yZWxlYXNlID0Jc2xtX3JlbGVhc2UsCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgIFN0YXR1cyBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApCi0KLXsJY2hhciAqcDsKLQlzdGF0aWMgY2hhcglzdHJbMjJdOwotCi0Jc3RhdCAmPSAweDFmOwotCWlmIChzdGF0ID49IDAgJiYgc3RhdCA8IE5fRVJST1JTICYmIChwID0gU0xNRXJyb3JzW3N0YXRdKSkKLQkJcmV0dXJuKCBwICk7Ci0Jc3ByaW50Ziggc3RyLCAidW5rbm93biBzdGF0dXMgMHglMDJ4Iiwgc3RhdCApOwotCXJldHVybiggc3RyICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApCi0KLXsJaW50IAkJCWxlbiA9IDAsIHN0YXQsIGksIHcsIGg7Ci0JdW5zaWduZWQgY2hhcglidWZbMjU2XTsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JaWYgKElTX1JFQUxfRVJST1Ioc3RhdCkpCi0JCXJldHVybiggLUVJTyApOwotCQotI2RlZmluZSBTSE9SVERBVEEoaSkJCSgoYnVmW2ldIDw8IDgpIHwgYnVmW2krMV0pCi0jZGVmaW5lCUJPT0xEQVRBKGksbWFzaykJKChidWZbaV0gJiBtYXNrKSA/ICJvbiIgOiAib2ZmIikKLQotCXcgPSBTSE9SVERBVEEoIDMgKTsKLQloID0gU0hPUlREQVRBKCAxICk7Ci0JCQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhdHVzXHRcdCVzXG4iLAotCQkJCQlzbG1fZXJyc3RyKCBzdGF0ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlBhZ2UgU2l6ZVx0JWR4JWQiLAotCQkJCQl3LCBoICk7Ci0KLQlmb3IoIGkgPSAwOyBpIDwgTl9TVERfU0laRVM7ICsraSApIHsKLQkJaWYgKHcgPT0gU3RkUGFnZVNpemVbaV0udyAmJiBoID09IFN0ZFBhZ2VTaXplW2ldLmgpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPCBOX1NURF9TSVpFUykKLQkJbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICIgKCVzKSIsIFN0ZFBhZ2VTaXplW2ldLm5hbWUgKTsKLQlidWZmZXJbbGVuKytdID0gJ1xuJzsKLQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiVG9wL0xlZnQgTWFyZ2luXHQlZC8lZFxuIiwKLQkJCQkJU0hPUlREQVRBKCA1ICksIFNIT1JUREFUQSggNyApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJNYW51YWwgRmVlZFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDAxICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIklucHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbOV0gPj4gMSkgJiA3ICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJBdXRvIFNlbGVjdFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlByZWZlZWQgUGFwZXJcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHgyMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJUaGljayBQaXhlbHNcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHg0MCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJIL1YgUmVzb2wuXHQlZC8lZCBkcGlcbiIsCi0JCQkJCVNIT1JUREFUQSggMTIgKSwgU0hPUlREQVRBKCAxMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTeXN0ZW0gVGltZW91dFx0JWRcbiIsCi0JCQkJCWJ1ZlsxNF0gKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlNjYW4gVGltZVx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTUgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiUGFnZSBDb3VudFx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTcgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiSW4vT3V0IENhcC5cdCVkLyVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDE5ICksIFNIT1JUREFUQSggMjEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhZ2dlciBPdXRwdXRcdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MDEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiT3V0cHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbMjNdID4+IDEpICYgNyApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiRHVwbGV4IFByaW50XHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDIzLCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkNvbG9yIFNlcC5cdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MjAgKSApOwotCi0JcmV0dXJuKCBsZW4gKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzbG1fcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJIGxvZmZfdCAqcHBvcyApCi0KLXsKLQlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgbGVuZ3RoOwotCWludCBlbmQ7Ci0KLQlpZiAoIShwYWdlID0gX19nZXRfZnJlZV9wYWdlKCBHRlBfS0VSTkVMICkpKQotCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQkKLQlsZW5ndGggPSBzbG1fZ2V0c3RhdHMoIChjaGFyICopcGFnZSwgaW1pbm9yKG5vZGUpICk7Ci0JaWYgKGxlbmd0aCA8IDApIHsKLQkJY291bnQgPSBsZW5ndGg7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoZmlsZS0+Zl9wb3MgPj0gbGVuZ3RoKSB7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjb3VudCArIGZpbGUtPmZfcG9zID4gbGVuZ3RoKQotCQljb3VudCA9IGxlbmd0aCAtIGZpbGUtPmZfcG9zOwotCWVuZCA9IGNvdW50ICsgZmlsZS0+Zl9wb3M7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWYsIChjaGFyICopcGFnZSArIGZpbGUtPmZfcG9zLCBjb3VudCkpIHsKLQkJY291bnQgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0JZmlsZS0+Zl9wb3MgPSBlbmQ7Ci1vdXQ6CWZyZWVfcGFnZSggcGFnZSApOwotCXJldHVybiggY291bnQgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJICAgUHJpbnRpbmcJCQkJCQkJCSAgKi8KLQotCi1zdGF0aWMgdm9pZCBzdGFydF9wcmludCggaW50IGRldmljZSApCi0KLXsJc3RydWN0IHNsbSAqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JdW5zaWduZWQgY2hhcgkqY21kOwotCXVuc2lnbmVkIGxvbmcJcGFkZHI7Ci0JaW50CQkJCWk7Ci0JCi0Jc3RkbWFfbG9jayggc2xtX2ludGVycnVwdCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1wcmludF9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCWNtZCA9IHNsbXByaW50X2NtZDsKLQlwYWRkciA9IHZpcnRfdG9fcGh5cyggU0xNQnVmZmVyICk7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCBwYWRkciwgdmlydF90b19waHlzKEJ1ZmZlclApLXBhZGRyLCAxICk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCS8qIExvdyBvbiBBMSAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDg4OwotCU1GUERFTEFZKCk7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIGJ5dGVzIGV4Y2VwdCB0aGUgbGFzdCAqLwotCWZvciggaSA9IDA7IGkgPCA1OyArK2kgKSB7Ci0JCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4OGEgKTsKLQkJdWRlbGF5KDIwKTsKLQkJaWYgKCFhY3NpX3dhaXRfZm9yX0lSUSggSFovMiApKSB7Ci0JCQlTTE1FcnJvciA9IDE7Ci0JCQlyZXR1cm47IC8qIHRpbWVvdXQgKi8KLQkJfQotCX0KLQkvKiBsYXN0IGNvbW1hbmQgYnl0ZSAqLwotCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4ODIgKTsKLQlNRlBERUxBWSgpOwotCS8qIHNldCBETUEgYWRkcmVzcyAqLwotCXNldF9kbWFfYWRkciggcGFkZHIgKTsKLQkvKiBwcm9ncmFtIERNQSBmb3Igd3JpdGUgYW5kIHNlbGVjdCBzZWN0b3IgY291bnRlciByZWcgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHgxOTI7Ci0JTUZQREVMQVkoKTsKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFuZCBzdGFydCBETUEgKi8KLQlETUFfTE9OR19XUklURSggU0xNX0RNQV9BTU9VTlQsIDB4MTEyICk7Ci0KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCVNMTUN1ckFkZHIgPSBwYWRkcjsKLQlTTE1FbmRBZGRyID0gcGFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0jZW5kaWYKLQlTVEFSVF9USU1FUiggRE1BX1NUQVJUVVBfVElNRSArIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkpOwotI2lmICFkZWZpbmVkKFNMTV9DT05UX0NOVF9SRVBST0cpICYmIGRlZmluZWQoREVCVUcpCi0JcHJpbnRrKCAiU0xNOiBDdXJBZGRyPSUjbHggRW5kQWRkcj0lI2x4IHRpbWVyPSVsZFxuIiwKLQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCQotCUVOQUJMRV9JUlEoKTsKLX0KLQotCi0vKiBPbmx5IGNhbGxlZCB3aGVuIGFuIGVycm9yIGhhcHBlbmVkIG9yIGF0IHRoZSBlbmQgb2YgYSBwYWdlICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzbG1faW50ZXJydXB0KGludCBpcmMsIHZvaWQgKmRhdGEpCi0KLXsJdW5zaWduZWQgbG9uZwlhZGRyOwotCWludAkJCQlzdGF0OwotCQotCVNUT1BfVElNRVIoKTsKLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JU0xNRXJyb3IgPSAoc3RhdCA8IDApICAgICAgICAgICAgID8gU0xNU1RBVF9BQ1NJVE8gOgotCQkgICAgICAgKGFkZHIgPCB2aXJ0X3RvX3BoeXMoQnVmZmVyUCkpID8gU0xNU1RBVF9OT1RBTEwgOgotCQkJCQkJCQkJICAgIHN0YXQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKLQlNRlBERUxBWSgpOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiBpbnRlcnJ1cHQsIGFkZHI9JSNseCwgZXJyb3I9JWRcbiIsIGFkZHIsIFNMTUVycm9yICk7Ci0jZW5kaWYKLQotCXdha2VfdXAoICZwcmludF93YWl0ICk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCUVOQUJMRV9JUlEoKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgc2xtX3Rlc3RfcmVhZHkoIHVuc2lnbmVkIGxvbmcgZHVtbXkgKQotCi17Ci0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYWdhaW4gKi8KLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gU0xNX0RNQV9BTU9VTlQ7Ci0JU1RBUlRfVElNRVIoIERNQV9USU1FX0ZPUigwKSApOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiByZXByb2dyYW1taW5nIHRpbWVyIGZvciAlZCBqaWZmaWVzLCBhZGRyPSUjbHhcbiIsCi0JCQlETUFfVElNRV9GT1IoMCksIGdldF9kbWFfYWRkcigpICk7Ci0jZW5kaWYKLQkKLSNlbHNlIC8qICFTTE1fQ09OVF9DTlRfUkVQUk9HICovCi0KLQl1bnNpZ25lZCBsb25nCWZsYWdzLCBhZGRyOwotCWludAkJCQlkLCB0aTsKLSNpZmRlZiBERUJVRwotCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RtLCBlbmRfdG07Ci0JaW50CQkJICAgZGlkX3dhaXQgPSAwOwotI2VuZGlmCi0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0JaWYgKChkID0gU0xNRW5kQWRkciAtIGFkZHIpID4gMCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQotCQkvKiBzbGljZSBub3QgeWV0IGZpbmlzaGVkLCBkZWNpZGUgd2hldGhlciB0byBzdGFydCBhbm90aGVyIHRpbWVyIG9yIHRvCi0JCSAqIGJ1c3ktd2FpdCAqLwotCQl0aSA9IERNQV9USU1FX0ZPUiggZCApOwotCQlpZiAodGkgPiAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJCXByaW50ayggIlNMTTogcmVwcm9ncmFtbWluZyB0aW1lciBmb3IgJWQgamlmZmllcywgcmVzdCAlZCBieXRlc1xuIiwKLQkJCQkJdGksIGQgKTsKLSNlbmRpZgotCQkJU1RBUlRfVElNRVIoIHRpICk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogd2FpdCBmb3IgZGVzaXJlZCBlbmQgYWRkcmVzcyB0byBiZSByZWFjaGVkICovCi0jaWZkZWYgREVCVUcKLQkJZG9fZ2V0dGltZW9mZGF5KCAmc3RhcnRfdG0gKTsKLQkJZGlkX3dhaXQgPSAxOwotI2VuZGlmCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCXdoaWxlKCBnZXRfZG1hX2FkZHIoKSA8IFNMTUVuZEFkZHIgKQotCQkJYmFycmllcigpOwotCX0KLQotCS8qIHNsaWNlIGZpbmlzaGVkLCBzdGFydCBuZXh0IG9uZSAqLwotCVNMTUN1ckFkZHIgKz0gU0xNU2xpY2VTaXplOwotCi0jaWZkZWYgU0xNX0NPTlRJTlVPVVNfRE1BCi0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhZ2FpbiAqLwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSBTTE1fRE1BX0FNT1VOVDsKLSNlbHNlCi0JLyogc2V0IERNQSBhZGRyZXNzOwotCSAqIGFkZCAyIGJ5dGVzIGZvciB0aGUgb25lcyBpbiB0aGUgU0xNIGNvbnRyb2xsZXIgRklGTyEgKi8KLQlzZXRfZG1hX2FkZHIoIFNMTUN1ckFkZHIgKyAyICk7Ci0JLyogdG9nZ2xlIERNQSB0byB3cml0ZSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZyAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDkyOwotCU1GUERFTEFZKCk7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4MTkyOwotCU1GUERFTEFZKCk7Ci0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhbmQgc3RhcnQgRE1BICovCi0JRE1BX0xPTkdfV1JJVEUoIFNMTV9ETUFfQU1PVU5ULCAweDExMiApOwotI2VuZGlmCi0JCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0jaWZkZWYgREVCVUcKLQlpZiAoZGlkX3dhaXQpIHsKLQkJaW50IG1zOwotCQlkb19nZXR0aW1lb2ZkYXkoICZlbmRfdG0gKTsKLQkJbXMgPSAoZW5kX3RtLnR2X3NlYyoxMDAwMDAwK2VuZF90bS50dl91c2VjKSAtCi0JCQkgKHN0YXJ0X3RtLnR2X3NlYyoxMDAwMDAwK3N0YXJ0X3RtLnR2X3VzZWMpOyAKLQkJcHJpbnRrKCAiU0xNOiBkaWQgJWxkLiVsZCBtcyBidXN5IHdhaXRpbmcgZm9yICVkIGJ5dGVzXG4iLAotCQkJCW1zLzEwMDAsIG1zJTEwMDAsIGQgKTsKLQl9Ci0JZWxzZQotCQlwcmludGsoICJTTE06IGRpZG4ndCB3YWl0ICghKVxuIiApOwotI2VuZGlmCi0KLQlpZiAoKHVuc2lnbmVkIGNoYXIgKilQVE9WKCBTTE1DdXJBZGRyICsgU0xNU2xpY2VTaXplICkgPj0gQnVmZmVyUCkgewotCQkvKiB3aWxsIGJlIGxhc3Qgc2xpY2UsIG5vIHRpbWVyIG5lY2Vzc2FyeSAqLwotI2lmZGVmIERFQlVHCi0JCXByaW50ayggIlNMTTogQ3VyQWRkcj0lI2x4IEVuZEFkZHI9JSNseCBsYXN0IHNsaWNlIC0+IG5vIHRpbWVyXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIgKTsKLSNlbmRpZgotCX0KLQllbHNlIHsKLQkJLyogbm90IGxhc3Qgc2xpY2UgKi8KLQkJU0xNRW5kQWRkciA9IFNMTUN1ckFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0JCVNUQVJUX1RJTUVSKCBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApKTsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoICJTTE06IEN1ckFkZHI9JSNseCBFbmRBZGRyPSUjbHggdGltZXI9JWxkXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCX0KLSNlbmRpZiAvKiBTTE1fQ09OVF9DTlRfUkVQUk9HICovCi19Ci0KLQotc3RhdGljIHZvaWQgc2V0X2RtYV9hZGRyKCB1bnNpZ25lZCBsb25nIHBhZGRyICkKLQotewl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWRtYV93ZC5kbWFfbG8gPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWRtYV93ZC5kbWFfbWQgPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWlmIChBVEFSSUhXX1BSRVNFTlQoIEVYVERfRE1BICkpCi0JCXN0X2RtYV9leHRfZG1haGkgPSAodW5zaWduZWQgc2hvcnQpcGFkZHI7Ci0JZWxzZQotCQlkbWFfd2QuZG1hX2hpID0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JTUZQREVMQVkoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9hZGRyKCB2b2lkICkKLQotewl1bnNpZ25lZCBsb25nCWFkZHI7Ci0JCi0JYWRkciA9IGRtYV93ZC5kbWFfbG8gJiAweGZmOwotCU1GUERFTEFZKCk7Ci0JYWRkciB8PSAoZG1hX3dkLmRtYV9tZCAmIDB4ZmYpIDw8IDg7Ci0JTUZQREVMQVkoKTsKLQlhZGRyIHw9IChkbWFfd2QuZG1hX2hpICYgMHhmZikgPDwgMTY7Ci0JTUZQREVMQVkoKTsKLQotCXJldHVybiggYWRkciApOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHNsbV93cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJICBsb2ZmX3QgKnBwb3MgKQotCi17Ci0Jc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQJCWRldmljZSA9IGltaW5vcihub2RlKTsKLQlpbnQJCW4sIGZpbGxlZCwgdywgaDsKLQotCXdoaWxlKCBTTE1TdGF0ZSA9PSBQUklOVElORyB8fAotCQkgICAoU0xNU3RhdGUgPT0gRklMTElORyAmJiBTTE1CdWZPd25lciAhPSBkZXZpY2UpICkgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCAmc2xtX3dhaXQgKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuKCAtRVJFU1RBUlRTWVMgKTsKLQl9Ci0JaWYgKFNMTVN0YXRlID09IElETEUpIHsKLQkJLyogZmlyc3QgZGF0YSBvZiBwYWdlOiBnZXQgY3VycmVudCBwYWdlIHNpemUgICovCi0JCWlmIChzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKQotCQkJcmV0dXJuKCAtRUlPICk7Ci0JCUJ1ZmZlclNpemUgPSB3KmgvODsKLQkJaWYgKEJ1ZmZlclNpemUgPiBTTE1fQlVGRkVSX1NJWkUpCi0JCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQotCQlTTE1TdGF0ZSA9IEZJTExJTkc7Ci0JCVNMTUJ1Zk93bmVyID0gZGV2aWNlOwotCX0KLQotCW4gPSBjb3VudDsKLQlmaWxsZWQgPSBCdWZmZXJQIC0gU0xNQnVmZmVyOwotCWlmIChmaWxsZWQgKyBuID4gQnVmZmVyU2l6ZSkKLQkJbiA9IEJ1ZmZlclNpemUgLSBmaWxsZWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoQnVmZmVyUCwgYnVmLCBuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JQnVmZmVyUCArPSBuOwotCWZpbGxlZCArPSBuOwotCi0JaWYgKGZpbGxlZCA9PSBCdWZmZXJTaXplKSB7Ci0JCS8qIENoZWNrIHRoZSBwYXBlciBzaXplIGFnYWluISBUaGUgdXNlciBtYXkgaGF2ZSBzd2l0Y2hlZCBpdCBpbiB0aGUKLQkJICogdGltZSBiZXR3ZWVuIHN0YXJ0aW5nIHRoZSBkYXRhIGFuZCBmaW5pc2hpbmcgdGhlbS4gV291bGQgZW5kIHVwIGluCi0JCSAqIGEgdHJhc2h5IHBhZ2UuLi4gKi8KLQkJaWYgKHNsbV9nZXRfcGFnZXNpemUoIGRldmljZSwgJncsICZoICkpCi0JCQlyZXR1cm4oIC1FSU8gKTsKLQkJaWYgKEJ1ZmZlclNpemUgIT0gdypoLzgpIHsKLQkJCXByaW50ayggS0VSTl9OT1RJQ0UgInNsbSVkOiBwYWdlIHNpemUgY2hhbmdlZCB3aGlsZSBwcmludGluZ1xuIiwKLQkJCQkJZGV2aWNlICk7Ci0JCQlyZXR1cm4oIC1FQUdBSU4gKTsKLQkJfQotCi0JCVNMTVN0YXRlID0gUFJJTlRJTkc7Ci0JCS8qIGNob29zZSBhIHNsaWNlIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIHRoZSBsaW5lIHNpemUgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCQlTTE1TbGljZVNpemUgPSBTTE1fU0xJQ0VfU0laRSh3KTsKLSNlbmRpZgotCQkKLQkJc3RhcnRfcHJpbnQoIGRldmljZSApOwotCQlzbGVlcF9vbiggJnByaW50X3dhaXQgKTsKLQkJaWYgKFNMTUVycm9yICYmIElTX1JFQUxfRVJST1IoU0xNRXJyb3IpKSB7Ci0JCQlwcmludGsoIEtFUk5fRVJSICJzbG0lZDogJXNcbiIsIGRldmljZSwgc2xtX2VycnN0cihTTE1FcnJvcikgKTsKLQkJCW4gPSAtRUlPOwotCQl9Ci0KLQkJU0xNU3RhdGUgPSBJRExFOwotCQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZzbG1fd2FpdCApOwotCX0KLQkKLQlyZXR1cm4oIG4gKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgICBpb2N0bCBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX2lvY3RsKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCi0KLXsJaW50CQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpLCBlcnI7Ci0JCi0JLyogSSBjYW4gdGhpbmsgb2Ygc2V0dGluZzoKLQkgKiAgLSBtYW51YWwgZmVlZAotCSAqICAtIHBhcGVyIGZvcm1hdAotCSAqICAtIGNvcHkgY291bnQKLQkgKiAgLSAuLi4KLQkgKiBidXQgaGF2ZW4ndCBpbXBsZW1lbnRlZCB0aGF0IHlldCA6LSkKLQkgKiBCVFcsIGhhcyBhbnlib2R5IGJldHRlciBkb2NzIGFib3V0IHRoZSBNT0RFIFNFTlNFL01PREUgU0VMRUNUIGRhdGE/Ci0JICovCi0Jc3dpdGNoKCBjbWQgKSB7Ci0KLQkgIGNhc2UgU0xNSU9SRVNFVDoJCS8qIHJlc2V0IGJ1ZmZlciwgaS5lLiBlbXB0eSB0aGUgYnVmZmVyICovCi0JCWlmICghKGZpbGUtPmZfbW9kZSAmIDIpKQotCQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0JCWlmIChTTE1TdGF0ZSA9PSBQUklOVElORykKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCVNMTVN0YXRlID0gSURMRTsKLQkJQnVmZmVyUCA9IFNMTUJ1ZmZlcjsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmc2xtX3dhaXQgKTsKLQkJcmV0dXJuKCAwICk7Ci0JCQotCSAgY2FzZSBTTE1JT0dTVEFUOiB7CS8qIGdldCBzdGF0dXMgKi8KLQkJaW50IHN0YXQ7Ci0JCWNoYXIgKnN0cjsKLQotCQlzdGF0ID0gc2xtX3JlcV9zZW5zZSggZGV2aWNlICk7Ci0JCWlmIChhcmcpIHsKLQkJCXN0ciA9IHNsbV9lcnJzdHIoIHN0YXQgKTsKLQkJCWlmIChwdXRfdXNlcihzdGF0LAotICAgIAkgICAgCSAgICAJICAgIAkgICAgIChsb25nICopJigoc3RydWN0IFNMTV9zdGF0dXMgKilhcmcpLT5zdGF0KSkKLSAgICAJICAgIAkgICAgCSAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAoY29weV90b191c2VyKCAoKHN0cnVjdCBTTE1fc3RhdHVzICopYXJnKS0+c3RyLCBzdHIsCi0JCQkJCQkgc3RybGVuKHN0cikgKyAxKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyZXR1cm4oIHN0YXQgKTsKLQkgIH0KLQkJCi0JICBjYXNlIFNMTUlPR1BTSVpFOiB7CS8qIGdldCBwYXBlciBzaXplICovCi0JCWludCB3LCBoOwotCQkKLQkJaWYgKChlcnIgPSBzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKSkgcmV0dXJuKCBlcnIgKTsKLQkJCi0gICAgCSAgICAJaWYgKHB1dF91c2VyKHcsIChsb25nICopJigoc3RydWN0IFNMTV9wYXBlcl9zaXplICopYXJnKS0+d2lkdGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChwdXRfdXNlcihoLCAobG9uZyAqKSYoKHN0cnVjdCBTTE1fcGFwZXJfc2l6ZSAqKWFyZyktPmhlaWdodCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuKCAwICk7Ci0JICB9Ci0JCQotCSAgY2FzZSBTTE1JT0dNRkVFRDoJLyogZ2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JICBjYXNlIFNMTUlPU1BTSVpFOgkvKiBzZXQgcGFwZXIgc2l6ZSAqLwotCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQotCSAgY2FzZSBTTE1JT1NNRkVFRDoJLyogc2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JfQotCXJldHVybiggLUVJTlZBTCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSBPcGVuaW5nIGFuZCBDbG9zaW5nCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkKLQotewlpbnQgZGV2aWNlOwotCXN0cnVjdCBzbG0gKnNpcDsKLQkKLQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpOwotCWlmIChkZXZpY2UgPj0gTl9TTE1fUHJpbnRlcnMpCi0JCXJldHVybiggLUVOWElPICk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikgewotCQkvKiBvcGVuIGZvciB3cml0aW5nIGlzIGV4Y2x1c2l2ZSAqLwotCQlpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPndyX29rKSApIHsKLQkJCWF0b21pY19pbmMoJnNpcC0+d3Jfb2spOwkKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIDEpIHsKLQkJLyogb3BlbiBmb3IgcmVhZGluZyBpcyBleGNsdXNpdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPnJkX29rKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnNpcC0+cmRfb2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCAtRUJVU1kgKTsKLSAgICAgICAgICAgICAgICB9Ci0JfQotCi0JcmV0dXJuKCAwICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQotCi17CWludCBkZXZpY2U7Ci0Jc3RydWN0IHNsbSAqc2lwOwotCQotCWRldmljZSA9IGltaW5vcihpbm9kZSk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikKLQkJYXRvbWljX2luYyggJnNpcC0+d3Jfb2sgKTsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgMSkKLQkJYXRvbWljX2luYyggJnNpcC0+cmRfb2sgKTsKLQkKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCSBBQ1NJIFByaW1pdGl2ZXMgZm9yIHRoZSBTTE0JCQkJCSAgKi8KLQotCi1zdGF0aWMgaW50IHNsbV9yZXFfc2Vuc2UoIGludCBkZXZpY2UgKQotCi17CWludAkJCXN0YXQsIHJ2OwotCXN0cnVjdCBzbG0gKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCQotCXN0ZG1hX2xvY2soIE5VTEwsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtcmVxc2Vuc2VfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbXJlcXNlbnNlX2NtZCwgMCApIHx8Ci0JCShzdGF0ID0gYWNzaV9nZXRzdGF0dXMoKSkgPCAwKQotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCWVsc2UKLQkJcnYgPSBzdGF0ICYgMHgxZjsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuKCBydiApOwotfQotCi0KLXN0YXRpYyBpbnQgc2xtX21vZGVfc2Vuc2UoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGFic19mbGFnICkKLQotewl1bnNpZ25lZCBjaGFyCXN0YXQsIGxlbjsKLQlpbnQJCQkJcnYgPSAwOwotCXN0cnVjdCBzbG0JCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZW5zZV9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCXNsbW1zZW5zZV9jbWRbNV0gPSBhYnNfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbnNlX2NtZCwgMCApKSB7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCAmc3RhdCwgMSApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWlmICghYWNzaV9leHRzdGF0dXMoICZsZW4sIDEgKSkgewotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQlidWZmZXJbMF0gPSBsZW47Ci0JaWYgKCFhY3NpX2V4dHN0YXR1cyggYnVmZmVyKzEsIGxlbiApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCXJ2ID0gc3RhdCAmIDB4MWY7Ci0KLSAgdGhlX2VuZDoKLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiggcnYgKTsKLX0KLQotCi0jaWYgMAotLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIGludCBzbG1fbW9kZV9zZWxlY3QoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwKLQkJCQkJCQlpbnQgZGVmYXVsdF9mbGFnICkKLQotewlpbnQJCQlzdGF0LCBydjsKLQlzdHJ1Y3Qgc2xtCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZWxlY3RfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlzbG1tc2VsZWN0X2NtZFs1XSA9IGRlZmF1bHRfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbGVjdF9jbWQsIDAgKSkgewotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCi0JaWYgKCFkZWZhdWx0X2ZsYWcpIHsKLQkJdW5zaWduZWQgY2hhciBjID0gbGVuOwotCQlpZiAoIWFjc2lfZXh0Y21kKCAmYywgMSApKSB7Ci0JCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQkJZ290byB0aGVfZW5kOwotCQl9Ci0JCWlmICghYWNzaV9leHRjbWQoIGJ1ZmZlciwgbGVuICkpIHsKLQkJCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCQlnb3RvIHRoZV9lbmQ7Ci0JCX0KLQl9Ci0JCi0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JcnYgPSAoc3RhdCA8IDAgPyBTTE1TVEFUX0FDU0lUTyA6IHN0YXQpOwotCi0gIHRoZV9lbmQ6Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4oIHJ2ICk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IHNsbV9nZXRfcGFnZXNpemUoIGludCBkZXZpY2UsIGludCAqdywgaW50ICpoICkKLQotewljaGFyCWJ1ZlsyNTZdOwotCWludAkJc3RhdDsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCWlmIChzdGF0ICE9IFNMTVNUQVRfT0spCi0JCXJldHVybiggLUVJTyApOwotCi0JKncgPSAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwotCSpoID0gKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJSW5pdGlhbGl6YXRpb24JCQkJCQkJICAqLwotCi0KLWludCBhdHRhY2hfc2xtKCBpbnQgdGFyZ2V0LCBpbnQgbHVuICkKLQotewlzdGF0aWMgaW50CWRpZF9yZWdpc3RlcjsKLQlpbnQJCQlsZW47Ci0KLQlpZiAoTl9TTE1fUHJpbnRlcnMgPj0gTUFYX1NMTSkgewotCQlwcmludGsoIEtFUk5fV0FSTklORyAiVG9vIG11Y2ggU0xNc1xuIiApOwotCQlyZXR1cm4oIDAgKTsKLQl9Ci0JCi0JLyogZG8gYW4gSU5RVUlSWSAqLwotCXVkZWxheSgxMDApOwotCUNNRFNFVF9UQVJHX0xVTiggc2xtaW5xdWlyeV9jbWQsIHRhcmdldCwgbHVuICk7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1pbnF1aXJ5X2NtZCwgMCApKSB7Ci0JICBpbnFfdGltZW91dDoKLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgY29tbWFuZCB0aW1lZCBvdXQuXG4iICk7Ci0JICBpbnFfZmFpbDoKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJldHVybiggMCApOwotCX0KLQkvKiByZWFkIHN0YXR1cyBhbmQgaGVhZGVyIG9mIHJldHVybiBkYXRhICovCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggU0xNQnVmZmVyLCA2ICkpCi0JCWdvdG8gaW5xX3RpbWVvdXQ7Ci0KLQlpZiAoU0xNQnVmZmVyWzFdICE9IDIpIHsgLyogZGV2aWNlIHR5cGUgPT0gcHJpbnRlcj8gKi8KLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgcmV0dXJuZWQgZGV2aWNlIHR5cGUgIT0gcHJpbnRlclxuIiApOwotCQlnb3RvIGlucV9mYWlsOwotCX0KLQlsZW4gPSBTTE1CdWZmZXJbNV07Ci0JCi0JLyogcmVhZCBpZCBzdHJpbmcgKi8KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCBTTE1CdWZmZXIsIGxlbiApKQotCQlnb3RvIGlucV90aW1lb3V0OwotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCVNMTUJ1ZmZlcltsZW5dID0gMDsKLQotCWlmICghZGlkX3JlZ2lzdGVyKSB7Ci0JCWRpZF9yZWdpc3RlciA9IDE7Ci0JfQotCi0Jc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLnRhcmdldCA9IHRhcmdldDsKLQlzbG1faW5mb1tOX1NMTV9QcmludGVyc10ubHVuICAgID0gbHVuOwotCWF0b21pY19zZXQoJnNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS53cl9vaywgMSApOyAKLQlhdG9taWNfc2V0KCZzbG1faW5mb1tOX1NMTV9QcmludGVyc10ucmRfb2ssIDEgKTsKLQkKLQlwcmludGsoIEtFUk5fSU5GTyAiICBQcmludGVyOiAlc1xuIiwgU0xNQnVmZmVyICk7Ci0JcHJpbnRrKCBLRVJOX0lORk8gIkRldGVjdGVkIHNsbSVkIGF0IGlkICVkIGx1biAlZFxuIiwKLQkJCU5fU0xNX1ByaW50ZXJzLCB0YXJnZXQsIGx1biApOwotCU5fU0xNX1ByaW50ZXJzKys7Ci0JcmV0dXJuKCAxICk7Ci19Ci0KLWludCBzbG1faW5pdCggdm9pZCApCi0KLXsKLQlpbnQgaTsKLQlpZiAocmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiwgJnNsbV9mb3BzICkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgQUNTSSBTTE1cbiIsIEFDU0lfTUFKT1IgKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JCi0JaWYgKCEoU0xNQnVmZmVyID0gYXRhcmlfc3RyYW1fYWxsb2MoIFNMTV9CVUZGRVJfU0laRSwgIlNMTSIgKSkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBTTE0gU1QtUmFtIGJ1ZmZlci5cbiIgKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXYoIEFDU0lfTUFKT1IsICJzbG0iICk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCVNMTVN0YXRlID0gSURMRTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIE1PRFVMRQotCi0vKiBmcm9tIGFjc2kuYyAqLwotdm9pZCBhY3NpX2F0dGFjaF9TTE1zKCBpbnQgKCphdHRhY2hfZnVuYykoIGludCwgaW50ICkgKTsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc2xtX2luaXQoKSkpCi0JCXJldHVybiggZXJyICk7Ci0JLyogVGhpcyBjYWxscyBhdHRhY2hfc2xtKCkgZm9yIGV2ZXJ5IHRhcmdldC9sdW4gd2hlcmUgYWNzaS5jIGRldGVjdGVkIGEKLQkgKiBwcmludGVyICovCi0JYWNzaV9hdHRhY2hfU0xNcyggYXR0YWNoX3NsbSApOwotCXJldHVybiggMCApOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKHVucmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiApICE9IDApCi0JCXByaW50ayggS0VSTl9FUlIgImFjc2lfc2xtOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOwotCWF0YXJpX3N0cmFtX2ZyZWUoIFNMTUJ1ZmZlciApOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCBkMTdkNjRlLi43MWU3ZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTQwNSwyMiArNDA1LDYgQEAKIAkgIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldDogUmllYmxDYXJkICh3aXRoIG9yIHdpdGhvdXQgYmF0dGVyeSksIG9yCiAJICBQQU1DYXJkIFZNRSAoYWxzbyB0aGUgdmVyc2lvbiBieSBSaG90cm9uLCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzZXMpLgogCi1jb25maWcgQVRBUklfQklPTkVUCi0JdHJpc3RhdGUgIkJpb05ldC0xMDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBCaW9EYXRhJ3MgQmlvTmV0LTEwMCBFdGhlcm5ldCBhZGFwdGVyCi0JICBmb3IgdGhlIEFDU0kgcG9ydC4gVGhlIGRyaXZlciB3b3JrcyAoaGFzIHRvIHdvcmsuLi4pIHdpdGggYSBwb2xsZWQKLQkgIEkvTyBzY2hlbWUsIHNvIGl0J3MgcmF0aGVyIHNsb3cgOi0oCi0KLWNvbmZpZyBBVEFSSV9QQU1TTkVUCi0JdHJpc3RhdGUgIlBBTXNOZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUEFNc05ldCBFdGhlcm5ldCBhZGFwdGVyIGZvciB0aGUKLQkgIEFDU0kgcG9ydCAoIkFDU0kgbm9kZSIpLiBUaGUgZHJpdmVyIHdvcmtzIChoYXMgdG8gd29yay4uLikgd2l0aCBhCi0JICBwb2xsZWQgSS9PIHNjaGVtZSwgc28gaXQncyByYXRoZXIgc2xvdyA6LSgKLQogY29uZmlnIFNVTjNMQU5DRQogCXRyaXN0YXRlICJTdW4zL1N1bjN4IG9uLWJvYXJkIExBTkNFIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTVU4zIHx8IFNVTjNYCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGMyNmI4NjcuLmEyMWI5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0xODAsOCArMTgwLDYgQEAKIG9iai0kKENPTkZJR19TR0lfSU9DM19FVEgpICs9IGlvYzMtZXRoLm8KIG9iai0kKENPTkZJR19ERUNMQU5DRSkgKz0gZGVjbGFuY2Uubwogb2JqLSQoQ09ORklHX0FUQVJJTEFOQ0UpICs9IGF0YXJpbGFuY2Uubwotb2JqLSQoQ09ORklHX0FUQVJJX0JJT05FVCkgKz0gYXRhcmlfYmlvbmV0Lm8KLW9iai0kKENPTkZJR19BVEFSSV9QQU1TTkVUKSArPSBhdGFyaV9wYW1zbmV0Lm8KIG9iai0kKENPTkZJR19BMjA2NSkgKz0gYTIwNjUubwogb2JqLSQoQ09ORklHX0hZRFJBKSArPSBoeWRyYS5vCiBvYmotJChDT05GSUdfQVJJQURORSkgKz0gYXJpYWRuZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9TcGFjZS5jIGIvZHJpdmVycy9uZXQvU3BhY2UuYwppbmRleCAxYzNlMjkzLi4zYjc5YzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9TcGFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKQEAgLTc1LDggKzc1LDYgQEAKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM2xhbmNlX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM184MjU4Nl9wcm9iZShpbnQgdW5pdCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFwbmVfcHJvYmUoaW50IHVuaXQpOwotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9uZXRfcHJvYmUoaW50IHVuaXQpOwotZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1zbmV0X3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3M4OXgwX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBsYW5jZV9wcm9iZShpbnQgdW5pdCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJhZ2V0bGFuY2VfcHJvYmUoaW50IHVuaXQpOwpAQCAtMjY0LDEyICsyNjIsNiBAQAogI2lmZGVmIENPTkZJR19BUE5FCQkvKiBBMTIwMCBQQ01DSUEgTkUyMDAwICovCiAJe2FwbmVfcHJvYmUsIDB9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FUQVJJX0JJT05FVAkvKiBBdGFyaSBCaW9uZXQgRXRoZXJuZXQgYm9hcmQgKi8KLQl7YmlvbmV0X3Byb2JlLCAwfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BVEFSSV9QQU1TTkVUCS8qIEF0YXJpIFBBTXNOZXQgRXRoZXJuZXQgYm9hcmQgKi8KLQl7cGFtc25ldF9wcm9iZSwgMH0sCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfTVZNRTE0N19ORVQJLyogTVZNRTE0NyBpbnRlcm5hbCBFdGhlcm5ldCAqLwogCXttdm1lMTQ3bGFuY2VfcHJvYmUsIDB9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDg3YmQyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qIGJpb25ldC5jICAgICBCaW9OZXQtMTAwIGRldmljZSBkcml2ZXIgZm9yIGxpbnV4NjhrLgotICoKLSAqIFZlcnNpb246CUAoIyliaW9uZXQuYwkxLjAJMDIvMDYvOTYKLSAqCi0gKiBBdXRob3I6CUhhcnRtdXQgTGF1ZSA8bGF1ZUBpZmstbXAudW5pLWtpZWwuZGU+Ci0gKiBhbmQJCVRvcnN0ZW4gTmFyamVzIDxuYXJqZXNAaWZrLW1wLnVuaS1raWVsLmRlPgotICoKLSAqIExpdHRsZSBhZGFwdGlvbnMgZm9yIGludGVncmF0aW9uIGludG8gcGw3IGJ5IFJvbWFuIEhvZGVrCi0gKgotICogU29tZSBjaGFuZ2VzIGluIGJpb25ldF9wb2xsX3J4IGJ5IEthcmwtSGVpbnogTG9obmVyCi0gKgotCVdoYXQgaXMgaXQgPwotCS0tLS0tLS0tLS0tLQotCVRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBCSU9ORVQtMTAwIExBTi1BZGFwdGVyIHdoaWNoIGNvbm5lY3RzCi0JYW4gQVRBUkkgU1QvVFQgdmlhIHRoZSBBQ1NJLXBvcnQgdG8gYW4gRXRoZXJuZXQtYmFzZWQgbmV0d29yay4KLQotCVRoaXMgdmVyc2lvbiBjYW4gYmUgY29tcGlsZWQgYXMgYSBsb2FkYWJsZSBtb2R1bGUgKFNlZSB0aGUKLQljb21waWxlIGNvbW1hbmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUpLgotCUF0IGxvYWQgdGltZSwgeW91IGNhbiBvcHRpb25hbGx5IHNldCB0aGUgZGVidWdnaW5nIGxldmVsIGFuZCB0aGUKLQlmYXN0ZXN0IHJlc3BvbnNlIHRpbWUgb24gdGhlIGNvbW1hbmQgbGluZSBvZiAnaW5zbW9kJy4KLQotCSdiaW9uZXRfZGVidWcnCi0JCWNvbnRyb2xzIHRoZSBhbW91bnQgb2YgZGlhZ25vc3RpYyBtZXNzYWdlczoKLQkgIDAgIDogbm8gbWVzc2FnZXMKLQkgID4wIDogc2VlIGNvZGUgZm9yIG1lYW5pbmcgb2YgcHJpbnRlZCBtZXNzYWdlcwotCi0JJ2Jpb25ldF9taW5fcG9sbF90aW1lJyAoYWx3YXlzID49MSkKLQkJZ2l2ZXMgdGhlIHRpbWUgKGluIGppZmZpZXMpIGJldHdlZW4gcG9sbHMuIExvdyB2YWx1ZXMKLQkJaW5jcmVhc2UgdGhlIHN5c3RlbSBsb2FkIChiZXdhcmUhKQotCi0JV2hlbiBsb2FkZWQsIGEgbmV0IGRldmljZSB3aXRoIHRoZSBuYW1lICdiaW8wJyBiZWNvbWVzIGF2YWlsYWJsZSwKLQl3aGljaCBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSB1c3VhbCAnaWZjb25maWcnIGNvbW1hbmQuCi0KLQlJdCBpcyBwb3NzaWJsZSB0byBjb21waWxlIHRoaXMgZHJpdmVyIGludG8gdGhlIGtlcm5lbCBsaWtlIG90aGVyCi0JKG5ldCkgZHJpdmVycy4gRm9yIHRoaXMgcHVycG9zZSwgc29tZSBzb3VyY2UgZmlsZXMgKGUuZy4gY29uZmlnLWZpbGVzCi0JbWFrZWZpbGVzLCBTcGFjZS5jKSBtdXN0IGJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuIChZb3UgbWF5IHJlZmVyIHRvCi0Jb3RoZXIgZHJpdmVycyBob3cgdG8gZG8gaXQuKSBJbiB0aGlzIGNhc2UsIHRoZSBkZXZpY2Ugd2lsbCBiZSBkZXRlY3RlZAotCWF0IGJvb3QgdGltZSBhbmQgKHByb2JhYmx5KSBhcHBlYXIgYXMgJ2V0aDAnLgotCi0JVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHNldmVyYWwgc291cmNlczoKLQktIFRoZSBkcml2ZXIgY29kZSBmb3IgYSBwYXJhbGxlbCBwb3J0IGV0aGVybmV0IGFkYXB0ZXIgYnkKLQkgIERvbmFsZCBCZWNrZXIgKHNlZSBmaWxlICdhdHAuYycgZnJvbSB0aGUgUEMgbGludXggZGlzdHJpYnV0aW9uKQotCS0gVGhlIEFDU0kgY29kZSBieSBSb21hbiBIb2RlayBmb3IgdGhlIEFUQVJJLUFDU0kgaGFyZGRpc2sgc3VwcG9ydAotCSAgYW5kIERNQSBoYW5kbGluZy4KLQktIFZlcnkgbGltaXRlZCBpbmZvcm1hdGlvbiBhYm91dCBtb3ZpbmcgcGFja2V0cyBpbiBhbmQgb3V0IG9mIHRoZQotCSAgQklPTkVULWFkYXB0ZXIgZnJvbSB0aGUgVENQIHBhY2thZ2UgZm9yIFRPUyBieSBCaW9EYXRhIEdtYkguCi0KLQlUaGVvcnkgb2YgT3BlcmF0aW9uCi0JLS0tLS0tLS0tLS0tLS0tLS0tLQotCUJlY2F1c2UgdGhlIEFUQVJJIERNQSBwb3J0IGlzIHVzdWFsbHkgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbAotCWRldmljZXMgKGVnLiBoYXJkZGlzaywgZmxvcHB5KSB3ZSBjYW5ub3QgYmxvY2sgdGhlIEFDU0kgYnVzCi0Jd2hpbGUgd2FpdGluZyBmb3IgaW50ZXJydXB0cy4gVGhlcmVmb3JlIHdlIHVzZSBhIHBvbGxpbmcgbWVjaGFuaXNtCi0JdG8gZmV0Y2ggcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBzZW5kCi0JcGFja2V0cyB3aXRob3V0IGNoZWNraW5nIHRoYXQgdGhlIHByZXZpb3VzIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvCi0JdGhlIExBTi4gV2UgcmVseSBvbiB0aGUgaGlnaGVyIGxldmVscyBvZiB0aGUgbmV0d29ya2luZyBjb2RlIHRvIGRldGVjdAotCW1pc3NpbmcgcGFja2V0cyBhbmQgcmVzZW5kIHRoZW0uCi0KLQlCZWZvcmUgd2UgYWNjZXNzIHRoZSBBVEFSSSBETUEgY29udHJvbGxlciwgd2UgY2hlY2sgaWYgYW5vdGhlcgotCXByb2Nlc3MgaXMgdXNpbmcgdGhlIERNQS4gSWYgbm90LCB3ZSBsb2NrIHRoZSBETUEsIHBlcmZvcm0gb25lIG9yCi0JbW9yZSBwYWNrZXQgdHJhbnNmZXJzIGFuZCB1bmxvY2sgdGhlIERNQSBiZWZvcmUgcmV0dXJuaW5nLgotCVdlIGRvIG5vdCB1c2UgJ3N0ZG1hX2xvY2snIHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIGl0IGlzIHVuY2xlYXIKLQlpZiB0aGUgbmV0d29ya2luZyBjb2RlIGNhbiBiZSBzZXQgdG8gc2xlZXAsIHdoaWNoIHdpbGwgaGFwcGVuIGlmCi0JYW5vdGhlciAocG9zc2libHkgc2xvdykgZGV2aWNlIGlzIHVzaW5nIHRoZSBETUEgY29udHJvbGxlci4KLQotCVRoZSBwb2xsaW5nIGlzIGRvbmUgdmlhIHRpbWVyIGludGVycnVwdHMgd2hpY2ggcGVyaW9kaWNhbGx5Ci0JJ3NpbXVsYXRlJyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgRXRoZXJuZXQgYWRhcHRlci4gVGhlIHRpbWUgKGluIGppZmZpZXMpCi0JYmV0d2VlbiBwb2xscyB2YXJpZXMgZGVwZW5kaW5nIG9uIGFuIGVzdGltYXRlIG9mIHRoZSBuZXQgYWN0aXZpdHkuCi0JVGhlIGFsbG93ZWQgcmFuZ2UgaXMgZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlICdiaW9uZXRfbWluX3BvbGxfdGltZScKLQlmb3IgdGhlIGxvd2VyIChmYXN0ZXN0KSBsaW1pdCBhbmQgdGhlIGNvbnN0YW50ICdNQVhfUE9MTF9USU1FJwotCWZvciB0aGUgaGlnaGVyIChzbG93ZXN0KSBsaW1pdC4KLQotCVdoZW5ldmVyIGEgcGFja2V0IGFycml2ZXMsIHdlIHN3aXRjaCB0byBmYXN0ZXN0IHJlc3BvbnNlIGJ5IHNldHRpbmcKLQl0aGUgcG9sbGluZyB0aW1lIHRvIGl0cyBsb3dlc3QgbGltaXQuIElmIHRoZSBmb2xsb3dpbmcgcG9sbCBmYWlscywKLQliZWNhdXNlIG5vIHBhY2tldHMgaGF2ZSBhcnJpdmVkLCB3ZSBpbmNyZWFzZSB0aGUgdGltZSBmb3IgdGhlIG5leHQKLQlwb2xsLiBXaGVuIHRoZSBuZXQgYWN0aXZpdHkgaXMgbG93LCB0aGUgcG9sbGluZyB0aW1lIGVmZmVjdGl2ZWx5Ci0Jc3RheXMgYXQgaXRzIG1heGltdW0gdmFsdWUsIHJlc3VsdGluZyBpbiB0aGUgbG93ZXN0IGxvYWQgZm9yIHRoZQotCW1hY2hpbmUuCi0gKi8KLQotI2RlZmluZSBNQVhfUE9MTF9USU1FCTEwCi0KLXN0YXRpYyBjaGFyIHZlcnNpb25bXSA9Ci0JImJpb25ldC5jOnYxLjAgMDYtZmViLTk2IChjKSBIYXJ0bXV0IExhdWUuXG4iOwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX2Fjc2kuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfc3RkbWEuaD4KLQotCi0vKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcKLSAqLwotI2lmbmRlZiBORVRfREVCVUcKLSNkZWZpbmUgTkVUX0RFQlVHIDAKLSNlbmRpZgotLyoKLSAqIEdsb2JhbCB2YXJpYWJsZSAnYmlvbmV0X2RlYnVnJy4gQ2FuIGJlIHNldCBhdCBsb2FkIHRpbWUgYnkgJ2luc21vZCcKLSAqLwotdW5zaWduZWQgaW50IGJpb25ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKLW1vZHVsZV9wYXJhbShiaW9uZXRfZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJpb25ldF9kZWJ1ZywgImJpb25ldCBkZWJ1ZyBsZXZlbCAoMC0yKSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGJpb25ldF9taW5fcG9sbF90aW1lID0gMjsKLQotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KLSAqLwotc3RydWN0IG5ldF9sb2NhbCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0JbG9uZyBvcGVuX3RpbWU7CQkJLyogZm9yIGRlYnVnZ2luZyAqLwotCWludCAgcG9sbF90aW1lOwkJCS8qIHBvbGxpbmcgdGltZSB2YXJpZXMgd2l0aCBuZXQgbG9hZCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBuaWNfcGt0X3MgewkJLyogcGFja2V0IGZvcm1hdCAqLwotCXVuc2lnbmVkIGNoYXIJc3RhdHVzOwotCXVuc2lnbmVkIGNoYXIJZHVtbXk7Ci0JdW5zaWduZWQgY2hhcglsX2xvLCBsX2hpOwotCXVuc2lnbmVkIGNoYXIJYnVmZmVyWzMwMDBdOwotfSAqbmljX3BhY2tldDsKLXVuc2lnbmVkIGNoYXIgKnBoeXNfbmljX3BhY2tldDsKLQotLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi1zdGF0aWMgaW50IGJpb25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBiaW9uZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBiaW9uZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBpbnQgYmlvbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYmlvbmV0X3RpY2sodW5zaWduZWQgbG9uZyk7Ci0KLXN0YXRpYyBERUZJTkVfVElNRVIoYmlvbmV0X3RpbWVyLCBiaW9uZXRfdGljaywgMCwgMCk7Ci0KLSNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWNjZXNzIHRoZSBldGhlcm5ldCBib2FyZCBjb25uZWN0ZWQgdG8gdGhlCi0gKiBBQ1NJIHBvcnQgdmlhIHRoZSBzdF9kbWEgY2hpcC4KLSAqLwotI2RlZmluZSBOT0RFX0FEUiAweDYwCi0KLSNkZWZpbmUgQ19SRUFEIDgKLSNkZWZpbmUgQ19XUklURSAweDBhCi0jZGVmaW5lIENfR0VURUEgMHgwZgotI2RlZmluZSBDX1NFVENSIDB4MGUKLQotc3RhdGljIGludAotc2VuZGNtZCh1bnNpZ25lZCBpbnQgYTAsIHVuc2lnbmVkIGludCBtb2QsIHVuc2lnbmVkIGludCBjbWQpIHsKLQl1bnNpZ25lZCBpbnQgYzsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAobW9kIHwgKChhMCkgPyAyIDogMCkgfCAweDg4KTsKLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gY21kOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAobW9kIHwgMHg4YSk7Ci0KLQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKEhaLzIpICkJLyogd2FpdCBmb3IgY21kIGFjayAqLwotCQlyZXR1cm4gLTE7CQkvKiB0aW1lb3V0ICovCi0KLQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQlyZXR1cm4gKGMgJiAweGZmKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3N0YXR1cyhpbnQgY3IpIHsKLQlzZW5kY21kKDAsMHgxMDAsTk9ERV9BRFIgfCBDX1NFVENSKTsgICAgLyogQ01EOiBTRVQgQ1IgKi8KLQlzZW5kY21kKDEsMHgxMDAsY3IpOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9zdGF0dXModW5zaWduZWQgY2hhciAqYWRyKSB7Ci0JaW50IGksYzsKLQotCURJU0FCTEVfSVJRKCk7Ci0JYyA9IHNlbmRjbWQoMCwweDAwLE5PREVfQURSIHwgQ19HRVRFQSk7ICAvKiBDTUQ6IEdFVCBFVEggQURSKi8KLQlpZiggYyA8IDAgKSBnb3RvIGdzZW5kOwotCi0JLyogbm93IHJlYWQgc3RhdHVzIGJ5dGVzICovCi0KLQlmb3IgKGk9MDsgaTw2OyBpKyspIHsKLQkJZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IDA7CS8qIHJlcXVlc3QgbmV4dCBieXRlICovCi0KLSAgICAJCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoSFovMikgKSB7CS8qIHdhaXQgZm9yIGNtZCBhY2sgKi8KLQkJCWMgPSAtMTsKLQkJCWdvdG8gZ3NlbmQ7CQkvKiB0aW1lb3V0ICovCi0JCX0KLQkJYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0JCSphZHIrKyA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0JfQotCWMgPSAxOwotZ3NlbmQ6Ci0gIAlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKLQlyZXR1cm4gYzsKLX0KLQotc3RhdGljIGlycXJldHVybl90Ci1iaW9uZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKSB7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF9mcmFtZSh1bnNpZ25lZCBsb25nIHBhZGRyLCBpbnQgb2RkKSB7Ci0JaW50IGM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURJU0FCTEVfSVJRKCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHgxOWE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDlhOwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQJPSAweDA0OwkJLyogc2VjdG9yIGNvdW50ICh3YXMgNSkgKi8KLQlkbWFfd2QuZG1hX2xvCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlkbWFfd2QuZG1hX21kCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlkbWFfd2QuZG1hX2hpCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQljID0gc2VuZGNtZCgwLDB4MDAsTk9ERV9BRFIgfCBDX1JFQUQpOwkvKiBDTUQ6IFJFQUQgKi8KLQlpZiggYyA8IDEyOCApIGdvdG8gcmVuZDsKLQotCS8qIG5vdyByZWFkIGJsb2NrICovCi0KLQljID0gc2VuZGNtZCgxLDB4MDAsb2RkKTsJLyogb2RkIGZsYWcgZm9yIGFkZHJlc3Mgc2hpZnQgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgwYTsKLQotCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoMTAwKSApIHsJLyogd2FpdCBmb3IgRE1BIHRvIGNvbXBsZXRlICovCi0JCWMgPSAtMTsKLQkJZ290byByZW5kOwotCX0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOGE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OGE7Ci0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4ODsKLQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQljID0gMTsKLQotcmVuZDoKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4MDsKLQl1ZGVsYXkoNDApOwotCWFjc2lfd2FpdF9mb3Jfbm9JUlEoMjApOwotCXJldHVybiBjOwotfQotCi0KLXN0YXRpYyBpbnQKLWhhcmR3YXJlX3NlbmRfcGFja2V0KHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBjbnQpIHsKLQl1bnNpZ25lZCBpbnQgYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OWE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOwotCWRtYV93ZC5kbWFfbG8JCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9tZAkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlkbWFfd2QuZG1hX2hpCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCi0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAk9IDB4NDsJCS8qIHNlY3RvciBjb3VudCAqLwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWMgPSBzZW5kY21kKDAsMHgxMDAsTk9ERV9BRFIgfCBDX1dSSVRFKTsJLyogQ01EOiBXUklURSAqLwotCWMgPSBzZW5kY21kKDEsMHgxMDAsY250JjB4ZmYpOwotCWMgPSBzZW5kY21kKDEsMHgxMDAsY250Pj44KTsKLQotCS8qIG5vdyB3cml0ZSBibG9jayAqLwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTBhOwkvKiBETUEgZW5hYmxlICovCi0JaWYoICFhY3NpX3dhaXRfZm9yX0lSUSgxMDApICkJCS8qIHdhaXQgZm9yIERNQSB0byBjb21wbGV0ZSAqLwotCQlnb3RvIGVuZDsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsJLyogRE1BIGRpc2FibGUgISAqLwotCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCi1lbmQ6Ci0JYyA9IHNlbmRjbWQoMSwweDEwMCwwKTsKLQljID0gc2VuZGNtZCgxLDB4MTAwLDApOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTgwOwotCXVkZWxheSg0MCk7Ci0JYWNzaV93YWl0X2Zvcl9ub0lSUSgyMCk7Ci0JcmV0dXJuKCBjICYgMHgwMik7Ci19Ci0KLQotLyogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KLSAqLwotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYmlvbmV0X3Byb2JlKGludCB1bml0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07Ci0Jc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKLQlzdGF0aWMgaW50IG5vX21vcmVfZm91bmQ7CS8qIGF2b2lkICJQcm9iaW5nIGZvci4uLiIgcHJpbnRlZCA0IHRpbWVzICovCi0JaW50IGk7Ci0JaW50IGVycjsKLQotCWlmICghTUFDSF9JU19BVEFSSSB8fCBub19tb3JlX2ZvdW5kKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmICh1bml0ID49IDApIHsKLQkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOwotCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOwotCX0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0KLQlwcmludGsoIlByb2JpbmcgZm9yIEJpb05ldCAxMDAgQWRhcHRlci4uLlxuIik7Ci0KLQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQlpID0gZ2V0X3N0YXR1cyhzdGF0aW9uX2FkZHIpOwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgUFJPTS4gICovCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCS8qIENoZWNrIHRoZSBmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlIFMuQS4gZm9yIHRoZSBtYW51ZmFjdG9yJ3MgY29kZS4KLQkgKi8KLQotCWlmKCBpIDwgMAotCXx8ICBzdGF0aW9uX2FkZHJbMF0gIT0gJ0InCi0JfHwgIHN0YXRpb25fYWRkclsxXSAhPSAnSScKLQl8fCAgc3RhdGlvbl9hZGRyWzJdICE9ICdPJyApIHsKLQkJbm9fbW9yZV9mb3VuZCA9IDE7Ci0JCXByaW50ayggIk5vIEJpb05ldCAxMDAgZm91bmQuXG4iICk7Ci0JCWZyZWVfbmV0ZGV2KGRldik7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCWlmIChiaW9uZXRfZGVidWcgPiAwICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCi0JCXByaW50ayh2ZXJzaW9uKTsKLQotCXByaW50aygiJXM6ICVzIGZvdW5kLCBldGgtYWRkcjogJTAyeC0lMDJ4LSUwMng6JTAyeC0lMDJ4LSUwMnguXG4iLAotCQlkZXYtPm5hbWUsICJCaW9OZXQgMTAwIiwKLQkJc3RhdGlvbl9hZGRyWzBdLCBzdGF0aW9uX2FkZHJbMV0sIHN0YXRpb25fYWRkclsyXSwKLQkJc3RhdGlvbl9hZGRyWzNdLCBzdGF0aW9uX2FkZHJbNF0sIHN0YXRpb25fYWRkcls1XSk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCi0JbmljX3BhY2tldCA9IChzdHJ1Y3QgbmljX3BrdF9zICopYWNzaV9idWZmZXI7Ci0JcGh5c19uaWNfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilwaHlzX2Fjc2lfYnVmZmVyOwotCWlmIChiaW9uZXRfZGVidWcgPiAwKSB7Ci0JCXByaW50aygibmljX3BhY2tldCBhdCAweCVwLCBwaHlzIGF0IDB4JXBcbiIsCi0JCQluaWNfcGFja2V0LCBwaHlzX25pY19wYWNrZXQgKTsKLQl9Ci0KLQlkZXYtPm9wZW4JCT0gYmlvbmV0X29wZW47Ci0JZGV2LT5zdG9wCQk9IGJpb25ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGJpb25ldF9zZW5kX3BhY2tldDsKLQlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOwotCi0JLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYwotCSAqIHZhbHVlcy4gVGhpcyBzaG91bGQgYmUgaW4gYSBjb21tb24gZmlsZSBpbnN0ZWFkIG9mIHBlci1kcml2ZXIuCi0JICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotI2lmIDAKLQkJZGV2LT5icm9hZGNhc3RbaV0gPSAweGZmOwotI2VuZGlmCi0JCWRldi0+ZGV2X2FkZHJbaV0gID0gc3RhdGlvbl9hZGRyW2ldOwotCX0KLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIGRldjsKLQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQotICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgotCi0gICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCi0gICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAotICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KLSAqLwotc3RhdGljIGludAotYmlvbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChiaW9uZXRfZGVidWcgPiAwKQotCQlwcmludGsoImJpb25ldF9vcGVuXG4iKTsKLQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQotCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLgotCSAqLwotCXNldF9zdGF0dXMoNCk7Ci0JbHAtPm9wZW5fdGltZSA9IDA7CS8qamlmZmllcyovCi0JbHAtPnBvbGxfdGltZSA9IE1BWF9QT0xMX1RJTUU7Ci0KLQlkZXYtPnRidXN5ID0gMDsKLQlkZXYtPmludGVycnVwdCA9IDA7Ci0JZGV2LT5zdGFydCA9IDE7Ci0KLQlzdGRtYV9yZWxlYXNlKCk7Ci0JYmlvbmV0X3RpbWVyLmRhdGEgPSAobG9uZylkZXY7Ci0JYmlvbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJmJpb25ldF90aW1lcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWJpb25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICBUaGlzIGNvdWxkIGJldHRlciBiZQotCSAqIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBkZXYtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgotCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOwotCX0KLQllbHNlIHsKLQkJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOwotCQl1bnNpZ25lZCBsb25nIGJ1ZiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpOwotCQlpbnQgc3RhdDsKLQotCQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKLQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCi0JCQkJCQkgIGxlbmd0aCk7Ci0JCQlidWYgPSAodW5zaWduZWQgbG9uZykmKChzdHJ1Y3QgbmljX3BrdF9zICopcGh5c19uaWNfcGFja2V0KS0+YnVmZmVyOwotCQl9Ci0KLQkJaWYgKGJpb25ldF9kZWJ1ZyA+MSkgewotCQkJdV9jaGFyICpkYXRhID0gbmljX3BhY2tldC0+YnVmZmVyLCAqcDsKLQkJCWludCBpOwotCi0JCQlwcmludGsoICIlczogVFggcGt0IHR5cGUgMHglNHggZnJvbSAiLCBkZXYtPm5hbWUsCi0JCQkJICAoKHVfc2hvcnQgKilkYXRhKVs2XSk7Ci0KLQkJCWZvciggcCA9ICZkYXRhWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCi0JCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICk7Ci0JCQlwcmludGsoIiB0byAiKTsKLQotCQkJZm9yKCBwID0gZGF0YSwgaSA9IDA7IGkgPCA2OyBpKysgKQotCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiAiXG4iICk7Ci0KLQkJCXByaW50ayggIiVzOiAiLCBkZXYtPm5hbWUgKTsKLQkJCXByaW50aygiIGRhdGEgJTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCIKLQkJCSAgICAgICAiICUwMnglMDJ4JTAyeCUwMnggbGVuICVkXG4iLAotCQkJCSAgZGF0YVsxMl0sIGRhdGFbMTNdLCBkYXRhWzE0XSwgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsxOF0sIGRhdGFbMTldLAotCQkJCSAgZGF0YVsyMF0sIGRhdGFbMjFdLCBkYXRhWzIyXSwgZGF0YVsyM10sIGRhdGFbMjRdLCBkYXRhWzI1XSwgZGF0YVsyNl0sIGRhdGFbMjddLAotCQkJCSAgZGF0YVsyOF0sIGRhdGFbMjldLCBkYXRhWzMwXSwgZGF0YVszMV0sIGRhdGFbMzJdLCBkYXRhWzMzXSwKLQkJCQkgIGxlbmd0aCApOwotCQl9Ci0JCWRtYV9jYWNoZV9tYWludGVuYW5jZShidWYsIGxlbmd0aCwgMSk7Ci0KLQkJc3RhdCA9IGhhcmR3YXJlX3NlbmRfcGFja2V0KGJ1ZiwgbGVuZ3RoKTsKLQkJRU5BQkxFX0lSUSgpOwotCQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWRldi0+dGJ1c3kJID0gMDsKLQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJbHAtPnN0YXRzLnR4X2J5dGVzKz1sZW5ndGg7Ci0JfQotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KLSAqLwotc3RhdGljIHZvaWQKLWJpb25ldF9wb2xsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGJvZ3VzY291bnQgPSAxMDsKLQlpbnQgcGt0X2xlbiwgc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogKytyb21hbjogVGFrZSBjYXJlIGF0IGxvY2tpbmcgdGhlIFNULURNQS4uLiBUaGlzIG11c3QgYmUgZG9uZSB3aXRoIGludHMKLQkgKiBvZmYsIHNpbmNlIG90aGVyd2lzZSBhbiBpbnQgY291bGQgc2xpcCBpbiBiZXR3ZWVuIHRoZSBxdWVzdGlvbiBhbmQgdGhlCi0JICogbG9ja2luZyBpdHNlbGYsIGFuZCB0aGVuIHdlJ2QgZ28gdG8gc2xlZXAuLi4gQW5kIGxvY2tpbmcgaXRzZWxmIGlzCi0JICogbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIGZsb3BweV9jaGFuZ2UgdGltZXIgZnJvbSB3b3JraW5nIHdpdGggU1QtRE1BCi0JICogcmVnaXN0ZXJzLiAqLwotCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWlmKCBscC0+cG9sbF90aW1lIDwgTUFYX1BPTExfVElNRSApIGxwLT5wb2xsX3RpbWUrKzsKLQotCXdoaWxlKGJvZ3VzY291bnQtLSkgewotCQlzdGF0dXMgPSBnZXRfZnJhbWUoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCAwKTsKLQotCQlpZiggc3RhdHVzID09IDAgKSBicmVhazsKLQotCQkvKiBHb29kIHBhY2tldC4uLiAqLwotCi0JCWRtYV9jYWNoZV9tYWludGVuYW5jZSgodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQsIDE1MjAsIDApOwotCi0JCXBrdF9sZW4gPSAobmljX3BhY2tldC0+bF9oaSA8PCA4KSB8IG5pY19wYWNrZXQtPmxfbG87Ci0KLQkJbHAtPnBvbGxfdGltZSA9IGJpb25ldF9taW5fcG9sbF90aW1lOyAgICAvKiBmYXN0IHBvbGwgKi8KLQkJaWYoIHBrdF9sZW4gPj0gNjAgJiYgcGt0X2xlbiA8PSAxNTIwICkgewotCQkJCQkvKgleXl5eIHdhciAxNTE0ICBLSEwgKi8KLQkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLgotCQkJICovCi0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYiggcGt0X2xlbiArIDIgKTsKLQkJCWlmIChza2IgPT0gTlVMTCkgewotCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJCQlkZXYtPm5hbWUpOwotCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJCS8qIDE2IEJ5dGUgYWxpZ24gICovCi0JCQlza2JfcHV0KCBza2IsIHBrdF9sZW4gKTsJLyogbWFrZSByb29tICovCi0KLQkJCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuCi0JCQkgKi8KLQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAotCQkJCQkJcGt0X2xlbik7Ci0JCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7Ci0JCQluZXRpZl9yeChza2IpOwotCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47Ci0KLQkvKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKLQkgICBoYXMgZG9uZSBhIG1hcmtfYmgoSU5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQotCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLgotCSAqLwotCi0gCQkJaWYgKGJpb25ldF9kZWJ1ZyA+MSkgewotIAkJCQl1X2NoYXIgKmRhdGEgPSBuaWNfcGFja2V0LT5idWZmZXIsICpwOwotIAkJCQlpbnQgaTsKLQotIAkJCQlwcmludGsoICIlczogUlggcGt0IHR5cGUgMHglNHggZnJvbSAiLCBkZXYtPm5hbWUsCi0gCQkJCQkgICgodV9zaG9ydCAqKWRhdGEpWzZdKTsKLQotCi0gCQkJCWZvciggcCA9ICZkYXRhWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCi0gCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgKTsKLSAJCQkJcHJpbnRrKCIgdG8gIik7Ci0gCQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKLSAJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiAiXG4iICk7Ci0KLSAJCQkJcHJpbnRrKCAiJXM6ICIsIGRldi0+bmFtZSApOwotIAkJCQlwcmludGsoIiBkYXRhICUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCi0gCQkJCSAgICAgICAiICUwMnglMDJ4JTAyeCUwMnggbGVuICVkXG4iLAotIAkJCQkJICBkYXRhWzEyXSwgZGF0YVsxM10sIGRhdGFbMTRdLCBkYXRhWzE1XSwgZGF0YVsxNl0sIGRhdGFbMTddLCBkYXRhWzE4XSwgZGF0YVsxOV0sCi0gCQkJCQkgIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sIGRhdGFbMjNdLCBkYXRhWzI0XSwgZGF0YVsyNV0sIGRhdGFbMjZdLCBkYXRhWzI3XSwKLSAJCQkJCSAgZGF0YVsyOF0sIGRhdGFbMjldLCBkYXRhWzMwXSwgZGF0YVszMV0sIGRhdGFbMzJdLCBkYXRhWzMzXSwKLSAJCQkJCQkgIHBrdF9sZW4gKTsKLSAJCQl9Ci0gCQl9Ci0gCQllbHNlIHsKLSAJCQlwcmludGsoIiBQYWNrZXQgaGFzIHdyb25nIGxlbmd0aDogJTA0ZCBieXRlc1xuIiwgcGt0X2xlbik7Ci0gCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwotIAkJfQotIAl9Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCUVOQUJMRV9JUlEoKTsKLQlyZXR1cm47Ci19Ci0KLS8qIGJpb25ldF90aWNrOiBjYWxsZWQgYnkgYmlvbmV0X3RpbWVyLiBSZWFkcyBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIsCi0gKiBwYXNzZXMgdGhlbSB0byB0aGUgaGlnaGVyIGxheWVycyBhbmQgcmVzdGFydHMgdGhlIHRpbWVyLgotICovCi1zdGF0aWMgdm9pZAotYmlvbmV0X3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKSB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmKCBiaW9uZXRfZGVidWcgPiAwICYmIChscC0+b3Blbl90aW1lKysgJiA3KSA9PSA4ICkKLQkJcHJpbnRrKCJiaW9uZXRfdGljazogJWxkXG4iLCBscC0+b3Blbl90aW1lKTsKLQotCWlmKCAhc3RkbWFfaXNsb2NrZWQoKSApIGJpb25ldF9wb2xsX3J4KGRldik7Ci0KLQliaW9uZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOwotCWFkZF90aW1lcigmYmlvbmV0X3RpbWVyKTsKLX0KLQotLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBiaW9uZXRfb3BlbigpLgotICovCi1zdGF0aWMgaW50Ci1iaW9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChiaW9uZXRfZGVidWcgPiAwKQotCQlwcmludGsoImJpb25ldF9jbG9zZSwgb3Blbl90aW1lPSVsZFxuIiwgbHAtPm9wZW5fdGltZSk7Ci0JZGVsX3RpbWVyKCZiaW9uZXRfdGltZXIpOwotCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOwotCi0Jc2V0X3N0YXR1cygwKTsKLQlscC0+b3Blbl90aW1lID0gMDsKLQotCWRldi0+dGJ1c3kgPSAxOwotCWRldi0+c3RhcnQgPSAwOwotCi0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiAwOwotfQotCi0vKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KLSAgIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZscC0+c3RhdHM7Ci19Ci0KLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJpb19kZXY7Ci0KLWludCBpbml0X21vZHVsZSh2b2lkKQotewotCWJpb19kZXYgPSBiaW9uZXRfcHJvYmUoLTEpOwotCWlmIChJU19FUlIoYmlvX2RldikpCi0JCXJldHVybiBQVFJfRVJSKGJpb19kZXYpOwotCXJldHVybiAwOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9uZXRkZXYoYmlvX2Rldik7Ci0JZnJlZV9uZXRkZXYoYmlvX2Rldik7Ci19Ci0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KLQotLyogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9pbmNsdWRlCi0JLWIgbTY4ay1saW51eGFvdXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIKLQktZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtRE1PRFVMRSAtSS4uLy4uL25ldC9pbmV0IC1jIGJpb25ldC5jIgotICogIHZlcnNpb24tY29udHJvbDogdAotICogIGtlcHQtbmV3LXZlcnNpb25zOiA1Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNTYzNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzggKzAsMCBAQAotLyogYXRhcmlfcGFtc25ldC5jICAgICBQQU1zTmV0IGRldmljZSBkcml2ZXIgZm9yIGxpbnV4NjhrLgotICoKLSAqIFZlcnNpb246CUAoIylQQU1zTmV0LmMJMC4y3wkwMy8zMS85NgotICoKLSAqIEF1dGhvcjogIFRvcnN0ZW4gTGFuZyA8VG9yc3Rlbi5MYW5nQGFwLnBoeXNpay51bmktZ2llc3Nlbi5kZT4KLSAqICAgICAgICAgICAgICAgICAgICAgICA8VG9yc3Rlbi5MYW5nQGp1bmcuZGU+Ci0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gbXkgZHJpdmVyIFBBTVNETUEuYyBmb3IgTWlOVC1OZXQgYW5kCi0gKiBvbiB0aGUgZHJpdmVyIGJpb25ldC5jIHdyaXR0ZW4gYnkKLSAqICAgICAgICAgIEhhcnRtdXQgTGF1ZSA8bGF1ZUBpZmstbXAudW5pLWtpZWwuZGU+Ci0gKiBhbmQgICAgICBUb3JzdGVuIE5hcmplcyA8bmFyamVzQGlmay1tcC51bmkta2llbC5kZT4KLSAqCi0gKiBMaXR0bGUgYWRhcHRpb25zIGZvciBpbnRlZ3JhdGlvbiBpbnRvIHBsNyBieSBSb21hbiBIb2RlawotICoKLQlXaGF0IGlzIGl0ID8KLQktLS0tLS0tLS0tLS0KLQlUaGlzIGRyaXZlciBjb250cm9scyB0aGUgUEFNc05ldCBMQU4tQWRhcHRlciB3aGljaCBjb25uZWN0cwotCWFuIEFUQVJJIFNUL1RUIHZpYSB0aGUgQUNTSS1wb3J0IHRvIGFuIEV0aGVybmV0LWJhc2VkIG5ldHdvcmsuCi0KLQlUaGlzIHZlcnNpb24gY2FuIGJlIGNvbXBpbGVkIGFzIGEgbG9hZGFibGUgbW9kdWxlIChTZWUgdGhlCi0JY29tcGlsZSBjb21tYW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlKS4KLQlBdCBsb2FkIHRpbWUsIHlvdSBjYW4gb3B0aW9uYWxseSBzZXQgdGhlIGRlYnVnZ2luZyBsZXZlbCBhbmQgdGhlCi0JZmFzdGVzdCByZXNwb25zZSB0aW1lIG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgJ2luc21vZCcuCi0KLQkncGFtc25ldF9kZWJ1ZycKLQkJY29udHJvbHMgdGhlIGFtb3VudCBvZiBkaWFnbm9zdGljIG1lc3NhZ2VzOgotCSAgMCAgOiBubyBtZXNzYWdlcwotCSAgPjAgOiBzZWUgY29kZSBmb3IgbWVhbmluZyBvZiBwcmludGVkIG1lc3NhZ2VzCi0KLQkncGFtc25ldF9taW5fcG9sbF90aW1lJyAoYWx3YXlzID49MSkKLQkJZ2l2ZXMgdGhlIHRpbWUgKGluIGppZmZpZXMpIGJldHdlZW4gcG9sbHMuIExvdyB2YWx1ZXMKLQkJaW5jcmVhc2UgdGhlIHN5c3RlbSBsb2FkIChiZXdhcmUhKQotCi0JV2hlbiBsb2FkZWQsIGEgbmV0IGRldmljZSB3aXRoIHRoZSBuYW1lICdldGg/JyBiZWNvbWVzIGF2YWlsYWJsZSwKLQl3aGljaCBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSB1c3VhbCAnaWZjb25maWcnIGNvbW1hbmQuCi0KLQlJdCBpcyBwb3NzaWJsZSB0byBjb21waWxlIHRoaXMgZHJpdmVyIGludG8gdGhlIGtlcm5lbCBsaWtlIG90aGVyCi0JKG5ldCkgZHJpdmVycy4gRm9yIHRoaXMgcHVycG9zZSwgc29tZSBzb3VyY2UgZmlsZXMgKGUuZy4gY29uZmlnLWZpbGVzCi0JbWFrZWZpbGVzLCBTcGFjZS5jKSBtdXN0IGJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuIChZb3UgbWF5IHJlZmVyIHRvCi0Jb3RoZXIgZHJpdmVycyBob3cgdG8gZG8gaXQuKSBJbiB0aGlzIGNhc2UsIHRoZSBkZXZpY2Ugd2lsbCBiZSBkZXRlY3RlZAotCWF0IGJvb3QgdGltZSBhbmQgKHByb2JhYmx5KSBhcHBlYXIgYXMgJ2V0aDAnLgotCi0JVGhlb3J5IG9mIE9wZXJhdGlvbgotCS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlCZWNhdXNlIHRoZSBBVEFSSSBETUEgcG9ydCBpcyB1c3VhbGx5IHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwKLQlkZXZpY2VzIChlZy4gaGFyZGRpc2ssIGZsb3BweSkgd2UgY2Fubm90IGJsb2NrIHRoZSBBQ1NJIGJ1cwotCXdoaWxlIHdhaXRpbmcgZm9yIGludGVycnVwdHMuIFRoZXJlZm9yZSB3ZSB1c2UgYSBwb2xsaW5nIG1lY2hhbmlzbQotCXRvIGZldGNoIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlci4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2Ugc2VuZAotCXBhY2tldHMgd2l0aG91dCBjaGVja2luZyB0aGF0IHRoZSBwcmV2aW91cyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0bwotCXRoZSBMQU4uIFdlIHJlbHkgb24gdGhlIGhpZ2hlciBsZXZlbHMgb2YgdGhlIG5ldHdvcmtpbmcgY29kZSB0byBkZXRlY3QKLQltaXNzaW5nIHBhY2tldHMgYW5kIHJlc2VuZCB0aGVtLgotCi0JQmVmb3JlIHdlIGFjY2VzcyB0aGUgQVRBUkkgRE1BIGNvbnRyb2xsZXIsIHdlIGNoZWNrIGlmIGFub3RoZXIKLQlwcm9jZXNzIGlzIHVzaW5nIHRoZSBETUEuIElmIG5vdCwgd2UgbG9jayB0aGUgRE1BLCBwZXJmb3JtIG9uZSBvcgotCW1vcmUgcGFja2V0IHRyYW5zZmVycyBhbmQgdW5sb2NrIHRoZSBETUEgYmVmb3JlIHJldHVybmluZy4KLQlXZSBkbyBub3QgdXNlICdzdGRtYV9sb2NrJyB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBpdCBpcyB1bmNsZWFyCi0JaWYgdGhlIG5ldHdvcmtpbmcgY29kZSBjYW4gYmUgc2V0IHRvIHNsZWVwLCB3aGljaCB3aWxsIGhhcHBlbiBpZgotCWFub3RoZXIgKHBvc3NpYmx5IHNsb3cpIGRldmljZSBpcyB1c2luZyB0aGUgRE1BIGNvbnRyb2xsZXIuCi0KLQlUaGUgcG9sbGluZyBpcyBkb25lIHZpYSB0aW1lciBpbnRlcnJ1cHRzIHdoaWNoIHBlcmlvZGljYWxseQotCSdzaW11bGF0ZScgYW4gaW50ZXJydXB0IGZyb20gdGhlIEV0aGVybmV0IGFkYXB0ZXIuIFRoZSB0aW1lIChpbiBqaWZmaWVzKQotCWJldHdlZW4gcG9sbHMgdmFyaWVzIGRlcGVuZGluZyBvbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbmV0IGFjdGl2aXR5LgotCVRoZSBhbGxvd2VkIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSAnYmlvbmV0X21pbl9wb2xsX3RpbWUnCi0JZm9yIHRoZSBsb3dlciAoZmFzdGVzdCkgbGltaXQgYW5kIHRoZSBjb25zdGFudCAnTUFYX1BPTExfVElNRScKLQlmb3IgdGhlIGhpZ2hlciAoc2xvd2VzdCkgbGltaXQuCi0KLQlXaGVuZXZlciBhIHBhY2tldCBhcnJpdmVzLCB3ZSBzd2l0Y2ggdG8gZmFzdGVzdCByZXNwb25zZSBieSBzZXR0aW5nCi0JdGhlIHBvbGxpbmcgdGltZSB0byBpdHMgbG93ZXN0IGxpbWl0LiBJZiB0aGUgZm9sbG93aW5nIHBvbGwgZmFpbHMsCi0JYmVjYXVzZSBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZCwgd2UgaW5jcmVhc2UgdGhlIHRpbWUgZm9yIHRoZSBuZXh0Ci0JcG9sbC4gV2hlbiB0aGUgbmV0IGFjdGl2aXR5IGlzIGxvdywgdGhlIHBvbGxpbmcgdGltZSBlZmZlY3RpdmVseQotCXN0YXlzIGF0IGl0cyBtYXhpbXVtIHZhbHVlLCByZXN1bHRpbmcgaW4gdGhlIGxvd2VzdCBsb2FkIGZvciB0aGUKLQltYWNoaW5lLgotICovCi0KLSNkZWZpbmUgTUFYX1BPTExfVElNRQkxMAotCi1zdGF0aWMgY2hhciAqdmVyc2lvbiA9Ci0JInBhbXNuZXQuYzp2MC4yYmV0YSAzMC1tYXItOTYgKGMpIFRvcnN0ZW4gTGFuZy5cbiI7Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX2Fjc2kuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jdW5kZWYgUkVBRAotI3VuZGVmIFdSSVRFCi0KLS8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZwotICovCi0jaWZuZGVmIE5FVF9ERUJVRwotI2RlZmluZSBORVRfREVCVUcgMAotI2VuZGlmCi0vKgotICogR2xvYmFsIHZhcmlhYmxlICdwYW1zbmV0X2RlYnVnJy4gQ2FuIGJlIHNldCBhdCBsb2FkIHRpbWUgYnkgJ2luc21vZCcKLSAqLwotdW5zaWduZWQgaW50IHBhbXNuZXRfZGVidWcgPSBORVRfREVCVUc7Ci1tb2R1bGVfcGFyYW0ocGFtc25ldF9kZWJ1ZywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocGFtc25ldF9kZWJ1ZywgInBhbXNuZXQgZGVidWcgZW5hYmxlICgwLTEpIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFtc25ldF9taW5fcG9sbF90aW1lID0gMjsKLQotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KLSAqLwotc3RydWN0IG5ldF9sb2NhbCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0JbG9uZyBvcGVuX3RpbWU7CQkJLyogZm9yIGRlYnVnZ2luZyAqLwotCWludCAgcG9sbF90aW1lOwkJCS8qIHBvbGxpbmcgdGltZSB2YXJpZXMgd2l0aCBuZXQgbG9hZCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBuaWNfcGt0X3MgewkJLyogcGFja2V0IGZvcm1hdCAqLwotCXVuc2lnbmVkIGNoYXIJYnVmZmVyWzIwNDhdOwotfSAqbmljX3BhY2tldCA9IDA7Ci11bnNpZ25lZCBjaGFyICpwaHlzX25pY19wYWNrZXQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBIQUREUls2XTsgLyogNi1ieXRlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgbGFuY2UgKi8KLQotLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi1zdGF0aWMgdm9pZAlzdGFydCAoaW50IHRhcmdldCk7Ci1zdGF0aWMgaW50CXN0b3AgKGludCB0YXJnZXQpOwotc3RhdGljIGludAl0ZXN0cGt0IChpbnQgdGFyZ2V0KTsKLXN0YXRpYyBpbnQJc2VuZHBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyBpbnQJcmVjZWl2ZXBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKLXN0YXRpYyBpbnQJaW5xdWlyeSAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKLXN0YXRpYyBIQUREUgkqcmVhZF9od19hZGRyKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1zdGF0aWMgdm9pZAlzZXR1cF9kbWEgKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIHJ3X2ZsYWcsIGludCBudW1fYmxvY2tzKTsKLXN0YXRpYyBpbnQJc2VuZF9maXJzdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciBieXRlKTsKLXN0YXRpYyBpbnQJc2VuZF8xXzUgKGludCBsdW4sIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGludCBkbWEpOwotc3RhdGljIGludAlnZXRfc3RhdHVzICh2b2lkKTsKLXN0YXRpYyBpbnQJY2FsY19yZWNlaXZlZCAodm9pZCAqc3RhcnRfYWRkcmVzcyk7Ci0KLXN0YXRpYyBpbnQgcGFtc25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBwYW1zbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgcGFtc25ldF9wb2xsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIGludCBwYW1zbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgcGFtc25ldF90aWNrKHVuc2lnbmVkIGxvbmcpOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgcGFtc25ldF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpOwotCi1zdGF0aWMgREVGSU5FX1RJTUVSKHBhbXNuZXRfdGltZXIsIHBhbXNuZXRfdGljaywgMCwgMCk7Ci0KLSNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0JdW5zaWduZWQgY2hhciByZXNlcnZlZDFbMHgzOF07Ci0JSEFERFIgIGh3YWRkcjsKLQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMlsweDFjMl07Ci19IERNQUhXQUREUjsKLQotLyoKLSAqIERlZmluaXRpb25zIG9mIGNvbW1hbmRzIHVuZGVyc3Rvb2QgYnkgdGhlIFBBTXMgRE1BIGFkYXB0b3IuCi0gKgotICogSW4gZ2VuZXJhbCB0aGUgRE1BIGFkYXB0b3IgdXNlcyBMVU4gMCwgNSwgNiBhbmQgNyBvbiBvbmUgSUQgY2hhbmdlYWJsZQotICogYnkgdGhlIFBBTSdzIE5ldCBzb2Z0d2FyZS4KLSAqCi0gKiBMVU4gMCB3b3JrcyBhcyBhIGhhcmRkaXNrLiBZb3UgY2FuIGJvb3QgdGhlIFBBTSdzIE5ldCBkcml2ZXIgdGhlcmUuCi0gKiBMVU4gNSB3b3JrcyBhcyBhIGhhcmRkaXNrIGFuZCBsZXRzIHlvdSBhY2Nlc3MgdGhlIFJBTSBhbmQgc29tZSBJL08gSFcKLSAqICAgICAgIGFyZWEuIEluIHNlY3RvciAwLCBieXRlcyAweDM4LTB4M2QgeW91IGZpbmQgdGhlIGV0aGVybmV0IEhXIGFkZHJlc3MKLSAqICAgICAgIG9mIHRoZSBhZGFwdG9yLgotICogTFVOIDYgd29ya3MgYXMgYSBoYXJkZGlzayBhbmQgbGV0cyB5b3UgYWNjZXNzIHRoZSBmaXJtd2FyZSBST00uCi0gKiBMVU4gNyBsZXRzIHlvdSBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMuCi0gKgotICogU29tZSBjb21tYW5kcyBsaWtlIHRoZSBJTlFVSVJZIGNvbW1hbmQgd29yayBpZGVudGljYWwgb24gYWxsIHVzZWQgTFVOcy4KLSAqCi0gKiBVTktOT1dOMSBzZWVtcyB0byByZWFkIHNvbWUgZGF0YS4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBVTktOT1dOMiBzZWVtcyB0byByZWFkIHNvbWUgZGF0YSAoY29tbWFuZCBieXRlIDEgbXVzdCBiZSAhPTApLiBUaGUKLSAqICAgICAgICAgIGZvbGxvd2luZyBieXRlcyBzZWVtIHRvIGJlIHNvbWV0aGluZyBsaWtlIGFuIGFsbG9jYXRpb24gbGVuZ3RoLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KLSAqIFJFQURQS1QgIHJlYWRzIGEgcGFja2V0IHJlY2VpdmVkIGJ5IHRoZSBETUEgYWRhcHRvci4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBXUklURVBLVCBzZW5kcyBhIHBhY2tldCB0cmFuc2ZlcnJlZCBieSB0aGUgZm9sbG93aW5nIERNQSBwaGFzZS4gVGhlIGxlbmd0aAotICogICAgICAgICAgb2YgdGhlIHBhY2tldCBpcyB0cmFuc2ZlcnJlZCBpbiBjb21tYW5kIGJ5dGVzIDMgYW5kIDQuCi0gKiAgICAgICAgICBUaGUgYWRhcHRvciBhdXRvbWF0aWNhbGx5IHJlcGxhY2VzIHRoZSBzcmMgaHcgYWRkcmVzcyBpbiBhbiBldGhlcm5ldAotICogICAgICAgICAgcGFja2V0IGJ5IGl0cyBvd24gaHcgYWRkcmVzcy4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBJTlFVSVJZICBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIElOUVVJUlkgY29tbWFuZCBzdXBwb3J0ZWQgYnkgaGFyZGRpc2tzCi0gKiAgICAgICAgICBhbmQgb3RoZXIgU0NTSSBkZXZpY2VzLiBJdCBsZXRzIHlvdSBkZXRlY3Qgd2hpY2ggZGV2aWNlIHlvdSBmb3VuZAotICogICAgICAgICAgYXQgYSBnaXZlbiBhZGRyZXNzLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KLSAqIFNUQVJUICAgIGluaXRpYWxpemVzIHRoZSBETUEgYWRhcHRvci4gQWZ0ZXIgdGhpcyBjb21tYW5kIGl0IGlzIGFibGUgdG8gc2VuZAotICogICAgICAgICAgYW5kIHJlY2VpdmUgcGFja2V0cy4gVGhlcmUgaXMgbm8gc3RhdHVzIGJ5dGUgcmV0dXJuZWQhCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCi0gKiBOVU1QS1RTICBnaXZlcyBiYWNrIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBxdWV1ZSBpbgotICogICAgICAgICAgdGhlIHN0YXR1cyBieXRlLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgotICogVU5LTk9XTjMKLSAqIFVOS05PV040IEZ1bmN0aW9uIG9mIHRoZXNlIHRocmVlIGNvbW1hbmRzIGlzIHVua25vd24uCi0gKiBVTktOT1dONSBUaGUgY29tbWFuZCBsZW5ndGggb2YgdGhlc2UgdGhyZWUgY29tbWFuZHMgaXMgMSBieXRlLgotICogREVTRUxFQ1QgaW1tZWRpYXRlbHkgZGVzZWxlY3RzIHRoZSBETUEgYWRhcHRvci4gTWF5IGltcG9ydGFudCB3aXRoIGludGVycnVwdAotICogICAgICAgICAgZHJpdmVuIG9wZXJhdGlvbi4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KLSAqIFNUT1AgICAgIHJlc2V0cyB0aGUgRE1BIGFkYXB0b3IuIEFmdGVyIHRoaXMgY29tbWFuZCBwYWNrZXRzIGNhbiBubyBsb25nZXIKLSAqICAgICAgICAgIGJlIHJlY2VpdmVkIG9yIHRyYW5zZmVycmVkLgotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlLgotICovCi0KLWVudW0ge1VOS05PV04xPTMsIFJFQURQS1Q9OCwgVU5LTk9XTjIsIFdSSVRFUEtUPTEwLCBJTlFVSVJZPTE4LCBTVEFSVCwKLSAgICAgIE5VTVBLVFM9MjIsIFVOS05PV04zLCBVTktOT1dONCwgVU5LTk9XTjUsIERFU0VMRUNULCBTVE9QfTsKLQotI2RlZmluZSBSRUFEU0VDVE9SICBSRUFEUEtUCi0jZGVmaW5lIFdSSVRFU0VDVE9SIFdSSVRFUEtUCi0KLXVfY2hhciAqaW5xdWlyZTg9Ik1WICAgICAgUEFNJ3MgTkVUL0dLIjsKLQotI2RlZmluZSBETUFMT1cgICBkbWFfd2QuZG1hX2xvCi0jZGVmaW5lIERNQU1JRCAgIGRtYV93ZC5kbWFfbWQKLSNkZWZpbmUgRE1BSElHSCAgZG1hX3dkLmRtYV9oaQotI2RlZmluZSBEQUNDRVNTICBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50Ci0KLSNkZWZpbmUgTUZQX0dQSVAgbWZwLnBhcl9kdF9yZWcKLQotLyogU29tZSB1c2VmdWwgZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgSU5UICAgICAgKCEoTUZQX0dQSVAgJiAweDIwKSkKLSNkZWZpbmUgREVMQVkgKHtNRlBfR1BJUDsgTUZQX0dQSVA7IE1GUF9HUElQO30pCi0jZGVmaW5lIFdSSVRFTU9ERSh2YWx1ZSkJCQkJCVwKLQkoewl1X3Nob3J0IGR1bW15ID0gdmFsdWU7CQkJCVwKLQkJX19hc21fXyB2b2xhdGlsZSgibW92ZXcgJTAsIDB4RkZGRjg2MDYiIDogOiAiZCIoZHVtbXkpKTsJXAotCQlERUxBWTsJCQkJCQlcCi0JfSkKLSNkZWZpbmUgV1JJVEVCT1RIKHZhbHVlMSwgdmFsdWUyKQkJCQlcCi0JKHsJdV9sb25nIGR1bW15ID0gKHVfbG9uZykodmFsdWUxKTw8MTYgfCAodV9zaG9ydCkodmFsdWUyKTsJXAotCQlfX2FzbV9fIHZvbGF0aWxlKCJtb3ZlbCAlMCwgMHhGRkZGODYwNCIgOiA6ICJkIihkdW1teSkpOwlcCi0JCURFTEFZOwkJCQkJCVwKLQl9KQotCi0vKiBEZWZpbml0aW9ucyBmb3IgRE1PREUgKi8KLQotI2RlZmluZSBSRUFEICAgICAgICAweDAwMAotI2RlZmluZSBXUklURSAgICAgICAweDEwMAotCi0jZGVmaW5lIERNQV9GREMgICAgIDB4MDgwCi0jZGVmaW5lIERNQV9BQ1NJICAgIDB4MDAwCi0KLSNkZWZpbmUgRE1BX0RJU0FCTEUgMHgwNDAKLQotI2RlZmluZSBTRUNfQ09VTlQgICAweDAxMAotI2RlZmluZSBETUFfV0lORE9XICAweDAwMAotCi0jZGVmaW5lIFJFR19BQ1NJICAgIDB4MDA4Ci0jZGVmaW5lIFJFR19GREMgICAgIDB4MDAwCi0KLSNkZWZpbmUgQTEgICAgICAgICAgMHgwMDIKLQotLyogVGltZW91dCBjb25zdGFudHMgKi8KLQotI2RlZmluZSBUSU1FT1VUQ01EIEhaLzIgICAvKiBjYS4gNTAwbXMgKi8KLSNkZWZpbmUgVElNRU9VVERNQSBIWiAgICAgLyogY2EuIDFzICovCi0jZGVmaW5lIENPTU1BTkRfREVMQVkgNTAwIC8qIGNhLiAwLjVtcyAqLwotCi11bnNpZ25lZCBydzsKLWludCBsYW5jZV90YXJnZXQgPSAtMTsKLWludCBpZl91cCA9IDA7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWNjZXNzIHRoZSBldGhlcm5ldCBib2FyZCBjb25uZWN0ZWQgdG8gdGhlCi0gKiBBQ1NJIHBvcnQgdmlhIHRoZSBzdF9kbWEgY2hpcC4KLSAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGxvd2xldmVsIHJvdXRpbmVzIHdvcmsgb24gcGh5c2ljYWwgYWRkcmVzc2VzIG9ubHkgYW5kIGFzc3VtZQotICogdGhhdCBldmVudHVhbGx5IG5lZWRlZCBidWZmZXJzIGFyZQotICogLSBjb21wbGV0ZWx5IGxvY2F0ZWQgaW4gU1QgUkFNCi0gKiAtIGFyZSBjb250aWdvdXMgaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKLSAqLwotCi0vKiBTZXR1cCB0aGUgRE1BIGNvdW50ZXIgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX2RtYSAodm9pZCAqYWRkcmVzcywgdW5zaWduZWQgcndfZmxhZywgaW50IG51bV9ibG9ja3MpCi17Ci0JV1JJVEVNT0RFKCh1bnNpZ25lZCkgcndfZmxhZyAgICAgICAgICB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8Ci0JCSAgQTEpOwotCVdSSVRFTU9ERSgodW5zaWduZWQpKHJ3X2ZsYWcgXiBXUklURSkgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAotCQkgIEExKTsKLQlXUklURU1PREUoKHVuc2lnbmVkKSByd19mbGFnICAgICAgICAgIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKLQkJICBBMSk7Ci0JRE1BTE9XICA9ICh1bnNpZ25lZCBjaGFyKSgodW5zaWduZWQgbG9uZylhZGRyZXNzICYgMHhGRik7Ci0JRE1BTUlEICA9ICh1bnNpZ25lZCBjaGFyKSgoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyA+PiAgOCkgJiAweEZGKTsKLQlETUFISUdIID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgbG9uZylhZGRyZXNzID4+IDE2KSAmIDB4RkYpOwotCVdSSVRFQk9USCgodW5zaWduZWQpbnVtX2Jsb2NrcyAmIDB4RkYsCi0JCSAgcndfZmxhZyB8IERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7Ci0JcncgPSByd19mbGFnOwotfQotCi0vKiBTZW5kIHRoZSBmaXJzdCBieXRlIG9mIGFuIGNvbW1hbmQgYmxvY2sgKi8KLQotc3RhdGljIGludAotc2VuZF9maXJzdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciBieXRlKQotewotCXJ3ID0gUkVBRDsKLQlhY3NpX2RlbGF5X2VuZChDT01NQU5EX0RFTEFZKTsKLQkvKgotCSAqIHdha2UgdXAgQUNTSQotCSAqLwotCVdSSVRFTU9ERShETUFfRkRDIHwgRE1BX1dJTkRPVyB8IFJFR19BQ1NJKTsKLQkvKgotCSAqIHdyaXRlIGNvbW1hbmQgYnl0ZQotCSAqLwotCVdSSVRFQk9USCgodGFyZ2V0IDw8IDUpIHwgKGJ5dGUgJiAweDFGKSwgRE1BX0ZEQyB8Ci0JICAgICAgICAgIERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKLQlyZXR1cm4gKCFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VUQ01EKSk7Ci19Ci0KLS8qIFNlbmQgdGhlIHJlc3Qgb2YgYW4gY29tbWFuZCBibG9jayAqLwotCi1zdGF0aWMgaW50Ci1zZW5kXzFfNSAoaW50IGx1biwgdW5zaWduZWQgY2hhciAqY29tbWFuZCwgaW50IGRtYSkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaT0wOyBpPDU7IGkrKykgewotCQlXUklURUJPVEgoKCFpID8gKCgobHVuICYgMHg3KSA8PCA1KSB8IChjb21tYW5kW2ldICYgMHgxRikpCi0JCQkgICAgICA6IGNvbW1hbmRbaV0pLAotCQkJICBydyB8IFJFR19BQ1NJIHwgRE1BX1dJTkRPVyB8Ci0JCQkgICAoKGkgPCA0KSA/IERNQV9GREMKLQkJCQkgICAgOiAoZG1hID8gRE1BX0FDU0kKLQkJCQkJICAgOiBETUFfRkRDKSkgfCBBMSk7Ci0JCWlmIChpIDwgNCAmJiAoaiA9ICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VUQ01EKSkpCi0JCQlyZXR1cm4gKGopOwotCX0KLQlyZXR1cm4gKDApOwotfQotCi0vKiBSZWFkIGEgc3RhdHVzIGJ5dGUgKi8KLQotc3RhdGljIGludAotZ2V0X3N0YXR1cyAodm9pZCkKLXsKLQlXUklURU1PREUoRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKLQlhY3NpX2RlbGF5X3N0YXJ0KCk7Ci0JcmV0dXJuICgoaW50KShEQUNDRVNTICYgMHhGRikpOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyAqLwotCi1zdGF0aWMgaW50Ci1jYWxjX3JlY2VpdmVkICh2b2lkICpzdGFydF9hZGRyZXNzKQotewotCXJldHVybiAoaW50KSgKLQkJKCgodW5zaWduZWQgbG9uZylETUFISUdIIDw8IDE2KSB8ICgodW5zaWduZWQpRE1BTUlEIDw8IDgpIHwgRE1BTE9XKQotCSAgICAgIC0gKHVuc2lnbmVkIGxvbmcpc3RhcnRfYWRkcmVzcyk7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgbWlkbGV2ZWwgcm91dGluZXMgc3RpbGwgd29yayBvbiBwaHlzaWNhbCBhZGRyZXNzZXMgLi4uICovCi0KLS8qIHN0YXJ0KCkgc3RhcnRzIHRoZSBQQU0ncyBETUEgYWRhcHRvciAqLwotCi1zdGF0aWMgdm9pZAotc3RhcnQgKGludCB0YXJnZXQpCi17Ci0Jc2VuZF9maXJzdCh0YXJnZXQsIFNUQVJUKTsKLX0KLQotLyogc3RvcCgpIHN0b3BzIHRoZSBQQU0ncyBETUEgYWRhcHRvciBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzICovCi0KLXN0YXRpYyBpbnQKLXN0b3AgKGludCB0YXJnZXQpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgU1RPUCkpCi0JCWdvdG8gYmFkOwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9Ci0JY21kX2J1ZmZlclszXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAwKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSAwOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotLyogdGVzdHBrdCgpIHJldHVybnMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIHdhaXRpbmcgaW4gdGhlIHF1ZXVlICovCi0KLXN0YXRpYyBpbnQKLXRlc3Rwa3QoaW50IHRhcmdldCkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIE5VTVBLVFMpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSBnZXRfc3RhdHVzKCk7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBpbnF1aXJ5KCkgcmV0dXJucyAwIHdoZW4gUEFNJ3MgRE1BIGZvdW5kLCAtMSB3aGVuIHRpbWVvdXQsIC0yIG90aGVyd2lzZSAqLwotLyogUGxlYXNlIG5vdGU6IFRoZSBidWZmZXIgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5IGJ1dCBtdXN0IGJlIGRlZmluZWQhICAgKi8KLQotc3RhdGljIGludAotaW5xdWlyeSAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyICp2YnVmZmVyID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKWJ1ZmZlcik7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBJTlFVSVJZKSkKLQkJZ290byBiYWQ7Ci0Jc2V0dXBfZG1hKGJ1ZmZlciwgUkVBRCwgMSk7Ci0JdmJ1ZmZlcls4XSA9IHZidWZmZXJbMjddID0gMDsgLyogQXZvaWQgY29uZnVzaW9uIHdpdGggcHJldmlvdXMgcmVhZCBkYXRhICovCi0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JY21kX2J1ZmZlclszXSA9IDQ4OwotCWlmIChzZW5kXzFfNSg1LCBjbWRfYnVmZmVyLCAxKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpIHx8Ci0JICAgIChjYWxjX3JlY2VpdmVkKGJ1ZmZlcikgPCAzMikpCi0JCWdvdG8gYmFkOwotCWRtYV9jYWNoZV9tYWludGVuYW5jZSgodW5zaWduZWQgbG9uZykoYnVmZmVyKzgpLCAyMCwgMCk7Ci0JaWYgKG1lbWNtcChpbnF1aXJlOCwgdmJ1ZmZlcis4LCAyMCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IDA7Ci1iYWQ6Ci0JaWYgKCEhTkVUX0RFQlVHKSB7Ci0JCXZidWZmZXJbOCsyMF09MDsKLQkJcHJpbnRrKCJpbnF1aXJ5IG9mIHRhcmdldCAlZDogJXNcbiIsIHRhcmdldCwgdmJ1ZmZlcis4KTsKLQl9Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKgotICogcmVhZF9od19hZGRyKCkgcmVhZHMgdGhlIHNlY3RvciBjb250YWluaW5nIHRoZSBod2FkZHIgYW5kIHJldHVybnMKLSAqIGEgcG9pbnRlciB0byBpdCAodmlydHVhbCBhZGRyZXNzISkgb3IgMCBpbiBjYXNlIG9mIGFuIGVycm9yCi0gKi8KLQotc3RhdGljIEhBRERSCi0qcmVhZF9od19hZGRyKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKLXsKLQlIQUREUiAqcmV0ID0gMDsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFJFQURTRUNUT1IpKQotCQlnb3RvIGJhZDsKLQlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAxKTsKLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQljbWRfYnVmZmVyWzNdID0gMTsKLQlpZiAoc2VuZF8xXzUoNSwgY21kX2J1ZmZlciwgMSkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSYoKChETUFIV0FERFIgKilidWZmZXIpLT5od2FkZHIpKTsKLQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCA1MTIsIDApOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90Ci1wYW1zbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIHJlY2VpdmVwa3QoKSBsb2FkcyBhIHBhY2tldCB0byBhIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMgbGVuZ3RoICovCi0KLXN0YXRpYyBpbnQKLXJlY2VpdmVwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBSRUFEUEtUKSkKLQkJZ290byBiYWQ7Ci0Jc2V0dXBfZG1hKGJ1ZmZlciwgUkVBRCwgMyk7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JY21kX2J1ZmZlclszXSA9IDM7Ci0JaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IGNhbGNfcmVjZWl2ZWQoYnVmZmVyKTsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIHNlbmRwa3QoKSBzZW5kcyBhIHBhY2tldCBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHplcm8gd2hlbiB0aGUgcGFja2V0IHdhcyBzZW50Ci0gICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5ICovCi0KLXN0YXRpYyBpbnQKLXNlbmRwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBXUklURVBLVCkpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFdSSVRFLCAzKTsKLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbMl0gPSBsZW5ndGggPj4gODsKLQljbWRfYnVmZmVyWzNdID0gbGVuZ3RoICYgMHhGRjsKLQlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMSkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gMDsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgaGlnaGVyIGxldmVsIHJvdXRpbmVzIHdvcmsgb24gdmlydHVhbCBhZGRyZXNzZXMgYW5kIGNvbnZlcnQgdGhlbSB0bwotICogcGh5c2ljYWwgYWRkcmVzc2VzIHdoZW4gcGFzc2VkIHRvIHRoZSBsb3dsZXZlbCByb3V0aW5lcy4gSXQncyB1cCB0byB0aGUgaGlnaGVyIGxldmVsCi0gKiByb3V0aW5lcyB0byBjb3B5IGRhdGEgZnJvbSBBbHRlcm5hdGUgUkFNIHRvIFNUIFJBTSBpZiBuZWNjZXNhcnkhCi0gKi8KLQotLyogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KLSAqLwotCi1zdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBwYW1zbmV0X3Byb2JlIChpbnQgdW5pdCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCBpOwotCUhBRERSICpod2FkZHI7Ci0JaW50IGVycjsKLQotCXVuc2lnbmVkIGNoYXIgc3RhdGlvbl9hZGRyWzZdOwotCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0JLyogYXZvaWQgIlByb2JpbmcgZm9yLi4uIiBwcmludGVkIDQgdGltZXMgLSB0aGUgZHJpdmVyIGlzIHN1cHBvcnRpbmcgb25seSBvbmUgYWRhcHRlciBub3chICovCi0Jc3RhdGljIGludCBub19tb3JlX2ZvdW5kOwotCi0JaWYgKG5vX21vcmVfZm91bmQpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCW5vX21vcmVfZm91bmQgPSAxOwotCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKHVuaXQgPj0gMCkgewotCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7Ci0JCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7Ci0JfQotCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKLQotCXByaW50aygiUHJvYmluZyBmb3IgUEFNJ3MgTmV0L0dLIEFkYXB0ZXIuLi5cbiIpOwotCi0JLyogQWxsb2NhdGUgdGhlIERNQSBidWZmZXIgaGVyZSBzaW5jZSB3ZSBuZWVkIGl0IGZvciBwcm9iaW5nISAqLwotCi0JbmljX3BhY2tldCA9IChzdHJ1Y3QgbmljX3BrdF9zICopYWNzaV9idWZmZXI7Ci0JcGh5c19uaWNfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilwaHlzX2Fjc2lfYnVmZmVyOwotCWlmIChwYW1zbmV0X2RlYnVnID4gMCkgewotCQlwcmludGsoIm5pY19wYWNrZXQgYXQgMHglcCwgcGh5cyBhdCAweCVwXG4iLAotCQkJICAgbmljX3BhY2tldCwgcGh5c19uaWNfcGFja2V0ICk7Ci0JfQotCi0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0KLQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKLQkJLyogRG8gdHdvIGlucXVpcmllcyB0byBjb3ZlciBjYXNlcyB3aXRoIHN0cmFuZ2UgZXF1aXBtZW50IG9uIHByZXZpb3VzIElEICovCi0JCS8qIGJsb2NraW5nIHRoZSBBQ1NJIGJ1cyAobGlrZSB0aGUgU0xNQzgwNCBsYXNlciBwcmludGVyIGNvbnRyb2xsZXIuLi4gICAqLwotCQlpbnF1aXJ5KGksIHBoeXNfbmljX3BhY2tldCk7Ci0JCWlmICghaW5xdWlyeShpLCBwaHlzX25pY19wYWNrZXQpKSB7Ci0JCQlsYW5jZV90YXJnZXQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoISFORVRfREVCVUcpCi0JCXByaW50aygiSUQ6ICVkXG4iLGkpOwotCi0JaWYgKGxhbmNlX3RhcmdldCA+PSAwKSB7Ci0JCWlmICghKGh3YWRkciA9IHJlYWRfaHdfYWRkcihsYW5jZV90YXJnZXQsIHBoeXNfbmljX3BhY2tldCkpKQotCQkJbGFuY2VfdGFyZ2V0ID0gLTE7Ci0JCWVsc2UKLQkJCW1lbWNweSAoc3RhdGlvbl9hZGRyLCBod2FkZHIsIEVUSF9BTEVOKTsKLQl9Ci0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCi0JaWYgKGxhbmNlX3RhcmdldCA8IDApIHsKLQkJcHJpbnRrKCJObyBQQU0ncyBOZXQvR0sgZm91bmQuXG4iKTsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQotCi0JaWYgKHBhbXNuZXRfZGVidWcgPiAwICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCi0JCXByaW50ayh2ZXJzaW9uKTsKLQotCXByaW50aygiJXM6ICVzIGZvdW5kIG9uIHRhcmdldCAlMDFkLCBldGgtYWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAotCQlkZXYtPm5hbWUsICJQQU0ncyBOZXQvR0siLCBsYW5jZV90YXJnZXQsCi0JCXN0YXRpb25fYWRkclswXSwgc3RhdGlvbl9hZGRyWzFdLCBzdGF0aW9uX2FkZHJbMl0sCi0JCXN0YXRpb25fYWRkclszXSwgc3RhdGlvbl9hZGRyWzRdLCBzdGF0aW9uX2FkZHJbNV0pOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4JCT0gcGFtc25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBwYW1zbmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gcGFtc25ldF9zZW5kX3BhY2tldDsKLQlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOwotCi0JLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYwotCSAqIHZhbHVlcy4gVGhpcyBzaG91bGQgYmUgaW4gYSBjb21tb24gZmlsZSBpbnN0ZWFkIG9mIHBlci1kcml2ZXIuCi0JICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotI2lmIDAKLQkJZGV2LT5icm9hZGNhc3RbaV0gPSAweGZmOwotI2VuZGlmCi0JCWRldi0+ZGV2X2FkZHJbaV0gID0gc3RhdGlvbl9hZGRyW2ldOwotCX0KLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIGRldjsKLQotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCi0gICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCi0KLSAgIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KLSAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0Ci0gICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgotICovCi1zdGF0aWMgaW50Ci1wYW1zbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAocGFtc25ldF9kZWJ1ZyA+IDApCi0JCXByaW50aygicGFtc25ldF9vcGVuXG4iKTsKLQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLgotCSAqLwotCWlmICghaWZfdXApCi0JCXN0YXJ0KGxhbmNlX3RhcmdldCk7Ci0JaWZfdXAgPSAxOwotCWxwLT5vcGVuX3RpbWUgPSAwOwkvKmppZmZpZXMqLwotCWxwLT5wb2xsX3RpbWUgPSBNQVhfUE9MTF9USU1FOwotCi0JZGV2LT50YnVzeSA9IDA7Ci0JZGV2LT5pbnRlcnJ1cHQgPSAwOwotCWRldi0+c3RhcnQgPSAxOwotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlwYW1zbmV0X3RpbWVyLmRhdGEgPSAobG9uZylkZXY7Ci0JcGFtc25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7Ci0JYWRkX3RpbWVyKCZwYW1zbmV0X3RpbWVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcGFtc25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAgVGhpcyBjb3VsZCBiZXR0ZXIgYmUKLQkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgZGV2LT50YnVzeSksIGJ1dCBzZXRfYml0KCkgd29ya3MgYXMgd2VsbC4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQl9Ci0JZWxzZSB7Ci0JCWludCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKLQkJdW5zaWduZWQgbG9uZyBidWYgPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKTsKLQkJaW50IHN0YXQ7Ci0KLQkJc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCQlESVNBQkxFX0lSUSgpOwotCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYoICFTVFJBTV9BRERSKGJ1ZitsZW5ndGgtMSkgKSB7Ci0JCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAotCQkJCQkJICBsZW5ndGgpOwotCQkJYnVmID0gKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0OwotCQl9Ci0KLQkJZG1hX2NhY2hlX21haW50ZW5hbmNlKGJ1ZiwgbGVuZ3RoLCAxKTsKLQotCQlzdGF0ID0gc2VuZHBrdChsYW5jZV90YXJnZXQsICh1bnNpZ25lZCBjaGFyICopYnVmLCBsZW5ndGgpOwotCQlFTkFCTEVfSVJRKCk7Ci0JCXN0ZG1hX3JlbGVhc2UoKTsKLQotCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJZGV2LT50YnVzeQkgPSAwOwotCQlscC0+c3RhdHMudHhfcGFja2V0cysrOwotCQlscC0+c3RhdHMudHhfYnl0ZXMrPWxlbmd0aDsKLQl9Ci0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgotICovCi1zdGF0aWMgdm9pZAotcGFtc25ldF9wb2xsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBib2d1c2NvdW50OwotCWludCBwa3RfbGVuOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiArK3JvbWFuOiBUYWtlIGNhcmUgYXQgbG9ja2luZyB0aGUgU1QtRE1BLi4uIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggaW50cwotCSAqIG9mZiwgc2luY2Ugb3RoZXJ3aXNlIGFuIGludCBjb3VsZCBzbGlwIGluIGJldHdlZW4gdGhlIHF1ZXN0aW9uIGFuZCB0aGUKLQkgKiBsb2NraW5nIGl0c2VsZiwgYW5kIHRoZW4gd2UnZCBnbyB0byBzbGVlcC4uLiBBbmQgbG9ja2luZyBpdHNlbGYgaXMKLQkgKiBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgZmxvcHB5X2NoYW5nZSB0aW1lciBmcm9tIHdvcmtpbmcgd2l0aCBTVC1ETUEKLQkgKiByZWdpc3RlcnMuICovCi0JaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWJvZ3VzY291bnQgPSB0ZXN0cGt0KGxhbmNlX3RhcmdldCk7Ci0JaWYoIGxwLT5wb2xsX3RpbWUgPCBNQVhfUE9MTF9USU1FICkgbHAtPnBvbGxfdGltZSsrOwotCi0Jd2hpbGUoYm9ndXNjb3VudC0tKSB7Ci0JCXBrdF9sZW4gPSByZWNlaXZlcGt0KGxhbmNlX3RhcmdldCwgcGh5c19uaWNfcGFja2V0KTsKLQotCQlpZiggcGt0X2xlbiA8IDYwICkgYnJlYWs7Ci0KLQkJLyogR29vZCBwYWNrZXQuLi4gKi8KLQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCBwa3RfbGVuLCAwKTsKLQotCQlscC0+cG9sbF90aW1lID0gcGFtc25ldF9taW5fcG9sbF90aW1lOyAgICAvKiBmYXN0IHBvbGwgKi8KLQkJaWYoIHBrdF9sZW4gPj0gNjAgJiYgcGt0X2xlbiA8PSAyMDQ4ICkgewotCQkJaWYgKHBrdF9sZW4gPiAxNTE0KQotCQkJCXBrdF9sZW4gPSAxNTE0OwotCi0JCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4KLQkJCSAqLwotCQkJc2tiID0gYWxsb2Nfc2tiKHBrdF9sZW4sIEdGUF9BVE9NSUMpOwotCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCi0JCQkJCWRldi0+bmFtZSk7Ci0JCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNrYi0+bGVuID0gcGt0X2xlbjsKLQkJCXNrYi0+ZGV2ID0gZGV2OwotCi0JCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLgotCQkJICovCi0JCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCXBrdF9sZW4pOwotCQkJbmV0aWZfcngoc2tiKTsKLQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOwotCQl9Ci0JfQotCi0JLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCi0JICAgaGFzIGRvbmUgYSBtYXJrX2JoKElORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KLQkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4KLQkgKi8KLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuOwotfQotCi0vKiBwYW1zbmV0X3RpY2s6IGNhbGxlZCBieSBwYW1zbmV0X3RpbWVyLiBSZWFkcyBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIsCi0gKiBwYXNzZXMgdGhlbSB0byB0aGUgaGlnaGVyIGxheWVycyBhbmQgcmVzdGFydHMgdGhlIHRpbWVyLgotICovCi1zdGF0aWMgdm9pZAotcGFtc25ldF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYoIHBhbXNuZXRfZGVidWcgPiAwICYmIChscC0+b3Blbl90aW1lKysgJiA3KSA9PSA4ICkKLQkJcHJpbnRrKCJwYW1zbmV0X3RpY2s6ICVsZFxuIiwgbHAtPm9wZW5fdGltZSk7Ci0KLQlwYW1zbmV0X3BvbGxfcngoZGV2KTsKLQotCXBhbXNuZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOwotCWFkZF90aW1lcigmcGFtc25ldF90aW1lcik7Ci19Ci0KLS8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gcGFtc25ldF9vcGVuKCkuCi0gKi8KLXN0YXRpYyBpbnQKLXBhbXNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAocGFtc25ldF9kZWJ1ZyA+IDApCi0JCXByaW50aygicGFtc25ldF9jbG9zZSwgb3Blbl90aW1lPSVsZFxuIiwgbHAtPm9wZW5fdGltZSk7Ci0JZGVsX3RpbWVyKCZwYW1zbmV0X3RpbWVyKTsKLQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCWlmIChpZl91cCkKLQkJc3RvcChsYW5jZV90YXJnZXQpOwotCWlmX3VwID0gMDsKLQotCWxwLT5vcGVuX3RpbWUgPSAwOwotCi0JZGV2LT50YnVzeSA9IDE7Ci0JZGV2LT5zdGFydCA9IDA7Ci0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiAwOwotfQotCi0vKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KLSAgIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZscC0+c3RhdHM7Ci19Ci0KLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBhbV9kZXY7Ci0KLWludCBpbml0X21vZHVsZSh2b2lkKQotewotCXBhbV9kZXYgPSBwYW1zbmV0X3Byb2JlKC0xKTsKLQlpZiAoSVNfRVJSKHBhbV9kZXYpKQotCQlyZXR1cm4gUFRSX0VSUihwYW1fZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXVucmVnaXN0ZXJfbmV0ZGV2KHBhbV9kZXYpOwotCWZyZWVfbmV0ZGV2KHBhbV9kZXYpOwotfQotCi0jZW5kaWYgLyogTU9EVUxFICovCi0KLS8qIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZQotCS1iIG02OGstbGludXhhb3V0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLURNT0RVTEUgLUkuLi8uLi9uZXQvaW5ldCAtYyBhdGFyaV9wYW1zbmV0LmMiCi0gKiAgdmVyc2lvbi1jb250cm9sOiB0Ci0gKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjRmY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQotI2lmbmRlZiBfQVRBUklfU0xNX0gKLSNkZWZpbmUgX0FUQVJJX1NMTV9ICi0KLS8qIEF0YXJpIFNMTSBsYXNlciBwcmludGVyIHNwZWNpZmljIGlvY3RscyAqLwotCi0jZGVmaW5lCVNMTUlPR1NUQVQJMHhhMTAwCi0jZGVmaW5lCVNMTUlPR1BTSVpFCTB4YTEwMQotI2RlZmluZQlTTE1JT0dNRkVFRAkweGExMDIKLQotI2RlZmluZQlTTE1JT1JFU0VUCTB4YTE0MAotCi0jZGVmaW5lCVNMTUlPU1BTSVpFCTB4YTE4MQotI2RlZmluZQlTTE1JT1NNRkVFRAkweGExODIKLQotLyogU3RhdHVzIHJldHVybmluZyBzdHJ1Y3R1cmUgKFNMTUlPR1NUQVQpICovCi1zdHJ1Y3QgU0xNX3N0YXR1cyB7Ci0JaW50CQlzdGF0OwkJLyogbnVtZXJpYyBzdGF0dXMgY29kZSAqLwotCWNoYXIJc3RyWzQwXTsJLyogc3RhdHVzIHN0cmluZyAqLwotfTsKLQotLyogUGFwZXIgc2l6ZSBzdHJ1Y3R1cmUgKFNMTUlPW0dTXVBTSVpFKSAqLwotc3RydWN0IFNMTV9wYXBlcl9zaXplIHsKLQlpbnQJCXdpZHRoOwotCWludAkJaGVpZ2h0OwotfTsKLQotI2VuZGlmIC8qIF9BVEFSSV9TTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZWE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9BVEFSSV9BQ1NJX0gKLSNkZWZpbmUgX0FTTV9BVEFSSV9BQ1NJX0gKLQotLyogRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IGRyaXZlcnMvYmxvY2svYWNzaS5jICovCi0KLXZvaWQgYWNzaV9kZWxheV9zdGFydCggdm9pZCApOwotdm9pZCBhY3NpX2RlbGF5X2VuZCggbG9uZyB1c2VjICk7Ci1pbnQgYWNzaV93YWl0X2Zvcl9JUlEoIHVuc2lnbmVkIHRpbWVvdXQgKTsKLWludCBhY3NpX3dhaXRfZm9yX25vSVJRKCB1bnNpZ25lZCB0aW1lb3V0ICk7Ci1pbnQgYWNzaWNtZF9ub2RtYSggY29uc3QgY2hhciAqY21kLCBpbnQgZW5hYmxlKTsKLWludCBhY3NpX2dldHN0YXR1cyggdm9pZCApOwotaW50IGFjc2lfZXh0c3RhdHVzKCBjaGFyICpidWZmZXIsIGludCBjbnQgKTsKLXZvaWQgYWNzaV9lbmRfZXh0c3RhdHVzKCB2b2lkICk7Ci1pbnQgYWNzaV9leHRjbWQoIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNudCApOwotCi0vKiBUaGUgQUNTSSBidWZmZXIgaXMgZ3VhcmFudHVlZWQgdG8gcmVzaWRlIGluIFNULVJBTSBhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXIKLSAqIGRyaXZlcnMgdGhhdCB3b3JrIG9uIHRoZSBBQ1NJIGJ1cywgdG9vLiBJdCdzIGRhdGEgYXJlIHZhbGlkIG9ubHkgYXMgbG9uZyBhcwotICogdGhlIFNULURNQSBpcyBsb2NrZWQuICovCi1leHRlcm4gY2hhciAqYWNzaV9idWZmZXI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2Fjc2lfYnVmZmVyOwotCi0vKiBVdGlsaXR5IG1hY3JvcyAqLwotCi0vKiBTZW5kIG9uZSBkYXRhIGJ5dGUgb3ZlciB0aGUgYnVzIGFuZCBzZXQgbW9kZSBmb3IgbmV4dCBvcGVyYXRpb24KLSAqIHdpdGggb25lIG1vdmUubCAtLSBBdGFyaSByZWNvbW1lbmRzIHRoaXMuLi4KLSAqLwotCi0jZGVmaW5lIERNQV9MT05HX1dSSVRFKGRhdGEsbW9kZSkJCQkJCQkJXAotICAgIGRvIHsJCQkJCQkJCQkJCQkJXAotCQkqKCh1bnNpZ25lZCBsb25nICopJmRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQpID0JXAotCQkJKChkYXRhKTw8MTYpIHwgKG1vZGUpOwkJCQkJCQlcCi0JfSB3aGlsZSgwKQotCi0jZGVmaW5lIEVOQUJMRV9JUlEoKQlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0FDU0kgKQotI2RlZmluZSBESVNBQkxFX0lSUSgpCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfTUZQX0FDU0kgKQotCi0jZW5kaWYgLyogX0FTTV9BVEFSSV9BQ1NJX0ggKi8K