Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgImJ1c3lib3guaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkJLyogZm9yIF9JTyAqLwojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkJLyogZm9yIFBBR0VfU0laRSBhbmQgUEFHRV9TSElGVCAqLwoJCQkJLyogd2UgYWxzbyBnZXQgUEFHRV9TSVpFIHZpYSBnZXRwYWdlc2l6ZSgpICovCgojaWZuZGVmIF9JTwovKiBwcmUtMS4zLjQ1ICovCiNkZWZpbmUgQkxLR0VUU0laRSAweDEyNjAKI2Vsc2UKLyogc2FtZSBvbiBpMzg2LCBtNjhrLCBhcm07IGRpZmZlcmVudCBvbiBhbHBoYSwgbWlwcywgc3BhcmMsIHBwYyAqLwojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCiNlbmRpZgoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIGxvbmcgUEFHRVMgPSAwOwpzdGF0aWMgaW50IGNoZWNrID0gMDsKc3RhdGljIGludCBiYWRwYWdlcyA9IDA7CnN0YXRpYyBpbnQgdmVyc2lvbiA9IC0xOwoKI2RlZmluZSBNQUtFX1ZFUlNJT04ocCxxLHIpCSg2NTUzNioocCkgKyAyNTYqKHEpICsgKHIpKQoKc3RhdGljIGludCBsaW51eF92ZXJzaW9uX2NvZGUodm9pZCkKewoJc3RydWN0IHV0c25hbWUgbXlfdXRzbmFtZTsKCWludCBwLCBxLCByOwoKCWlmICh1bmFtZSgmbXlfdXRzbmFtZSkgPT0gMCkgewoJCXAgPSBhdG9pKHN0cnRvayhteV91dHNuYW1lLnJlbGVhc2UsICIuIikpOwoJCXEgPSBhdG9pKHN0cnRvayhOVUxMLCAiLiIpKTsKCQlyID0gYXRvaShzdHJ0b2soTlVMTCwgIi4iKSk7CgkJcmV0dXJuIE1BS0VfVkVSU0lPTihwLCBxLCByKTsKCX0KCXJldHVybiAwOwp9CgovKgogKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5pb24gc3dhcF9oZWFkZXIgdXNlcyB0aGUgY29uc3RhbnQgUEFHRV9TSVpFLgogKiBVbmZvcnR1bmF0ZWx5LCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhpcyBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBtb2RlbCwKICogYW5kIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHJ1biB0aW1lIC0tIHdlIHVzZSBnZXRwYWdlc2l6ZSgpLgogKi8KCnN0YXRpYyBpbnQgcGFnZXNpemU7CnN0YXRpYyBpbnQgKnNpZ25hdHVyZV9wYWdlOwoKc3RydWN0IHN3YXBfaGVhZGVyX3YxIHsKCWNoYXIgYm9vdGJpdHNbMTAyNF07CQkvKiBTcGFjZSBmb3IgZGlza2xhYmVsIGV0Yy4gKi8KCXVuc2lnbmVkIGludCB2ZXJzaW9uOwoJdW5zaWduZWQgaW50IGxhc3RfcGFnZTsKCXVuc2lnbmVkIGludCBucl9iYWRwYWdlczsKCXVuc2lnbmVkIGludCBwYWRkaW5nWzEyNV07Cgl1bnNpZ25lZCBpbnQgYmFkcGFnZXNbMV07Cn0gKnA7CgpzdGF0aWMgdm9pZCBpbml0X3NpZ25hdHVyZV9wYWdlKCkKewoJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwoKI2lmZGVmIFBBR0VfU0laRQoJaWYgKHBhZ2VzaXplICE9IFBBR0VfU0laRSkKCQllcnJvck1zZygiQXNzdW1pbmcgcGFnZXMgb2Ygc2l6ZSAlZFxuIiwgcGFnZXNpemUpOwojZW5kaWYKCXNpZ25hdHVyZV9wYWdlID0gKGludCAqKSB4bWFsbG9jKHBhZ2VzaXplKTsKCW1lbXNldChzaWduYXR1cmVfcGFnZSwgMCwgcGFnZXNpemUpOwoJcCA9IChzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgKikgc2lnbmF0dXJlX3BhZ2U7Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3NpZ25hdHVyZShjaGFyICpzaWcpCnsKCWNoYXIgKnNwID0gKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgoJc3RybmNweShzcCArIHBhZ2VzaXplIC0gMTAsIHNpZywgMTApOwp9CgojZGVmaW5lIFYwX01BWF9QQUdFUwkoOCAqIChwYWdlc2l6ZSAtIDEwKSkKLyogQmVmb3JlIDIuMi4wcHJlOSAqLwojZGVmaW5lIFYxX09MRF9NQVhfUEFHRVMJKCgweDdmZmZmZmZmIC8gcGFnZXNpemUpIC0gMSkKLyogU2luY2UgMi4yLjBwcmU5OgogICBlcnJvciBpZiBuciBvZiBwYWdlcyA+PSBTV1BfT0ZGU0VUKFNXUF9FTlRSWSgwLH4wVUwpKQogICB3aXRoIHZhcmlhdGlvbnMgb24KCSNkZWZpbmUgU1dQX0VOVFJZKHR5cGUsb2Zmc2V0KSAoKCh0eXBlKSA8PCAxKSB8ICgob2Zmc2V0KSA8PCA4KSkKCSNkZWZpbmUgU1dQX09GRlNFVChlbnRyeSkgKChlbnRyeSkgPj4gOCkKICAgb24gdGhlIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcy4gQmVsb3cgdGhlIHJlc3VsdCAtIHl1ay4KCiAgIE1hY2hpbmUJcGFnZXNpemUJU1dQX0VOVFJZCVNXUF9PRkZTRVQJYm91bmQrMQlvbGRib3VuZCsyCiAgIGkzODYJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIG1pcHMJCTJeMTIJCW88PDE1CQllPj4xNQkJMTw8MTcJMTw8MTkKICAgYWxwaGEJMl4xMwkJbzw8NDAJCWU+PjQwCQkxPDwyNAkxPDwxOAogICBtNjhrCQkyXjEyCQlvPDwxMgkJZT4+MTIJCTE8PDIwCTE8PDE5CiAgIHNwYXJjCTJeezEyLDEzfQkobyYweDNmZmZmKTw8OQkoZT4+OSkmMHgzZmZmZgkxPDwxOAkxPDx7MTksMTh9CiAgIHNwYXJjNjQJMl4xMwkJbzw8MTMJCWU+PjEzCQkxPDw1MQkxPDwxOAogICBwcGMJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIGFybW8JCTJeezEzLDE0LDE1fQlvPDw4CQllPj44CQkxPDwyNAkxPDx7MTgsMTcsMTZ9CiAgIGFybXYJCTJeMTIJCW88PDkJCWU+PjkJCTE8PDIzCTE8PDE5CgogICBhc3N1bWluZyB0aGF0IGxvbmdzIGhhdmUgNjQgYml0cyBvbiBhbHBoYSBhbmQgc3BhcmM2NCBhbmQgMzIgYml0cyBlbHNld2hlcmUuCgogICBUaGUgYmFkIHBhcnQgaXMgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhpcyBzaW5jZSB0aGUga2VybmVsIHdpbGwKICAgcmVmdXNlIGEgc3dhcCBzcGFjZSBpZiBpdCBpcyB0b28gbGFyZ2UuCiovCi8qIHBhdGNoIGZyb20gamogLSB3aHkgZG9lcyB0aGlzIGRpZmZlciBmcm9tIHRoZSBhYm92ZT8gKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDI0KSAtIDEpCiNlbGlmIGRlZmluZWQoX19taXBzX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMTcpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX3Y5X18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDMgPDwgMjkpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAocGFnZXNpemUgPT0gODE5MiA/ICgoMyA8PCAyOSkgLSAxKSA6ICgoMSA8PCAxOCkgLSAxKSkKI2Vsc2UKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIFYxX09MRF9NQVhfUEFHRVMKI2VuZGlmCi8qIG1hbiBwYWdlIG5vdyBzYXlzOgpUaGUgbWF4aW11bSB1c2VmdWwgc2l6ZSBvZiBhIHN3YXAgYXJlYSBub3cgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLgpJdCBpcyByb3VnaGx5IDJHQiBvbiBpMzg2LCBQUEMsIG02OGssIEFSTSwgMUdCIG9uIHNwYXJjLCA1MTJNQiBvbiBtaXBzLAoxMjhHQiBvbiBhbHBoYSBhbmQgM1RCIG9uIHNwYXJjNjQuCiovCgojZGVmaW5lIE1BWF9CQURQQUdFUwkoKHBhZ2VzaXplLTEwMjQtMTI4KnNpemVvZihpbnQpLTEwKS9zaXplb2YoaW50KSkKCnN0YXRpYyB2b2lkIGJpdF9zZXQodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciB8IG07Cn0KCnN0YXRpYyBpbnQgYml0X3Rlc3RfYW5kX2NsZWFyKHVuc2lnbmVkIGludCAqYWRkciwgdW5zaWduZWQgaW50IG5yKQp7Cgl1bnNpZ25lZCBpbnQgciwgbTsKCglhZGRyICs9IG5yIC8gKDggKiBzaXplb2YoaW50KSk7CgoJciA9ICphZGRyOwoJbSA9IDEgPDwgKG5yICYgKDggKiBzaXplb2YoaW50KSAtIDEpKTsKCgkqYWRkciA9IHIgJiB+bTsKCXJldHVybiAociAmIG0pICE9IDA7Cn0KCgp2b2lkIGRpZShjb25zdCBjaGFyICpzdHIpCnsKCWVycm9yTXNnKCIlc1xuIiwgc3RyKTsKCWV4aXQoRkFMU0UpOwp9Cgp2b2lkIHBhZ2Vfb2soaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3NldChzaWduYXR1cmVfcGFnZSwgcGFnZSk7Cn0KCnZvaWQgcGFnZV9iYWQoaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKCWVsc2UgewoJCWlmIChiYWRwYWdlcyA9PSBNQVhfQkFEUEFHRVMpCgkJCWRpZSgidG9vIG1hbnkgYmFkIHBhZ2VzIik7CgkJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gcGFnZTsKCX0KCWJhZHBhZ2VzKys7Cn0KCnZvaWQgY2hlY2tfYmxvY2tzKHZvaWQpCnsKCXVuc2lnbmVkIGludCBjdXJyZW50X3BhZ2U7CglpbnQgZG9fc2VlayA9IDE7CgljaGFyICpidWZmZXI7CgoJYnVmZmVyID0geG1hbGxvYyhwYWdlc2l6ZSk7CgljdXJyZW50X3BhZ2UgPSAwOwoJd2hpbGUgKGN1cnJlbnRfcGFnZSA8IFBBR0VTKSB7CgkJaWYgKCFjaGVjaykgewoJCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCWlmIChkb19zZWVrICYmIGxzZWVrKERFViwgY3VycmVudF9wYWdlICogcGFnZXNpemUsIFNFRUtfU0VUKSAhPQoJCQljdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSkKCQkJZGllKCJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiKTsKCQlpZiAoKGRvX3NlZWsgPSAocGFnZXNpemUgIT0gcmVhZChERVYsIGJ1ZmZlciwgcGFnZXNpemUpKSkpIHsKCQkJcGFnZV9iYWQoY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7Cgl9CglpZiAoYmFkcGFnZXMgPT0gMSkKCQlwcmludGYoIm9uZSBiYWQgcGFnZVxuIik7CgllbHNlIGlmIChiYWRwYWdlcyA+IDEpCgkJcHJpbnRmKCIlZCBiYWQgcGFnZXNcbiIsIGJhZHBhZ2VzKTsKfQoKc3RhdGljIGxvbmcgdmFsaWRfb2Zmc2V0KGludCBmZCwgaW50IG9mZnNldCkKewoJY2hhciBjaDsKCglpZiAobHNlZWsoZmQsIG9mZnNldCwgMCkgPCAwKQoJCXJldHVybiAwOwoJaWYgKHJlYWQoZmQsICZjaCwgMSkgPCAxKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgZmluZF9zaXplKGludCBmZCkKewoJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKCglsb3cgPSAwOwoJZm9yIChoaWdoID0gMTsgaGlnaCA+IDAgJiYgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQoJCWxvdyA9IGhpZ2g7Cgl3aGlsZSAobG93IDwgaGlnaCAtIDEpIHsKCQljb25zdCBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCgkJaWYgKHZhbGlkX29mZnNldChmZCwgbWlkKSkKCQkJbG93ID0gbWlkOwoJCWVsc2UKCQkJaGlnaCA9IG1pZDsKCX0KCXJldHVybiAobG93ICsgMSk7Cn0KCi8qIHJldHVybiBzaXplIGluIHBhZ2VzLCB0byBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCnN0YXRpYyBsb25nIGdldF9zaXplKGNvbnN0IGNoYXIgKmZpbGUpCnsKCWludCBmZDsKCWxvbmcgc2l6ZTsKCglmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwoJaWYgKGZkIDwgMCkgewoJCXBlcnJvcihmaWxlKTsKCQlleGl0KDEpOwoJfQoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgewoJCWludCBzZWN0b3JzX3Blcl9wYWdlID0gcGFnZXNpemUgLyA1MTI7CgoJCXNpemUgLz0gc2VjdG9yc19wZXJfcGFnZTsKCX0gZWxzZSB7CgkJc2l6ZSA9IGZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBzaXplOwp9CgppbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CgljaGFyICp0bXA7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJaW50IHN6OwoJaW50IG1heHBhZ2VzOwoJaW50IGdvb2RwYWdlczsKCWludCBvZmZzZXQ7CglpbnQgZm9yY2UgPSAwOwoKCWluaXRfc2lnbmF0dXJlX3BhZ2UoKTsJCS8qIGdldCBwYWdlc2l6ZSAqLwoKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpIHsKCQkJCWludCBibG9ja3NfcGVyX3BhZ2UgPSBwYWdlc2l6ZSAvIDEwMjQ7CgoJCQkJUEFHRVMgPSBzdHJ0b2woYXJndlswXSwgJnRtcCwgMCkgLyBibG9ja3NfcGVyX3BhZ2U7CgkJCQlpZiAoKnRtcCkKCQkJCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJCQl9IGVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UgewoJCQlzd2l0Y2ggKGFyZ3ZbMF1bMV0pIHsKCQkJY2FzZSAnYyc6CgkJCQljaGVjayA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAnZic6CgkJCQlmb3JjZSA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAndic6CgkJCQl2ZXJzaW9uID0gYXRvaShhcmd2WzBdICsgMik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXVzYWdlKG1rc3dhcF91c2FnZSk7CgkJCX0KCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKSB7CgkJZXJyb3JNc2coImVycm9yOiBOb3doZXJlIHRvIHNldCB1cCBzd2FwIG9uP1xuIik7CgkJdXNhZ2UobWtzd2FwX3VzYWdlKTsKCX0KCXN6ID0gZ2V0X3NpemUoZGV2aWNlX25hbWUpOwoJaWYgKCFQQUdFUykgewoJCVBBR0VTID0gc3o7Cgl9IGVsc2UgaWYgKFBBR0VTID4gc3ogJiYgIWZvcmNlKSB7CgkJZXJyb3JNc2coImVycm9yOiBzaXplICVsZCBpcyBsYXJnZXIgdGhhbiBkZXZpY2Ugc2l6ZSAlZFxuIiwKCQkJCVBBR0VTICogKHBhZ2VzaXplIC8gMTAyNCksIHN6ICogKHBhZ2VzaXplIC8gMTAyNCkpOwoJCWV4aXQoRkFMU0UpOwoJfQoKCWlmICh2ZXJzaW9uID09IC0xKSB7CgkJaWYgKFBBR0VTIDw9IFYwX01BWF9QQUdFUykKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAobGludXhfdmVyc2lvbl9jb2RlKCkgPCBNQUtFX1ZFUlNJT04oMiwgMSwgMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAocGFnZXNpemUgPCAyMDQ4KQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQoJaWYgKHZlcnNpb24gIT0gMCAmJiB2ZXJzaW9uICE9IDEpIHsKCQllcnJvck1zZygiZXJyb3I6IHVua25vd24gdmVyc2lvbiAlZFxuIiwgdmVyc2lvbik7CgkJdXNhZ2UobWtzd2FwX3VzYWdlKTsKCX0KCWlmIChQQUdFUyA8IDEwKSB7CgkJZXJyb3JNc2coImVycm9yOiBzd2FwIGFyZWEgbmVlZHMgdG8gYmUgYXQgbGVhc3QgJWxka0JcbiIsCgkJCQkobG9uZykgKDEwICogcGFnZXNpemUgLyAxMDI0KSk7CgkJdXNhZ2UobWtzd2FwX3VzYWdlKTsKCX0KI2lmIDAKCW1heHBhZ2VzID0gKCh2ZXJzaW9uID09IDApID8gVjBfTUFYX1BBR0VTIDogVjFfTUFYX1BBR0VTKTsKI2Vsc2UKCWlmICghdmVyc2lvbikKCQltYXhwYWdlcyA9IFYwX01BWF9QQUdFUzsKCWVsc2UgaWYgKGxpbnV4X3ZlcnNpb25fY29kZSgpID49IE1BS0VfVkVSU0lPTigyLCAyLCAxKSkKCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCWVsc2UgewoJCW1heHBhZ2VzID0gVjFfT0xEX01BWF9QQUdFUzsKCQlpZiAobWF4cGFnZXMgPiBWMV9NQVhfUEFHRVMpCgkJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJfQojZW5kaWYKCWlmIChQQUdFUyA+IG1heHBhZ2VzKSB7CgkJUEFHRVMgPSBtYXhwYWdlczsKCQllcnJvck1zZygid2FybmluZzogdHJ1bmNhdGluZyBzd2FwIGFyZWEgdG8gJWxka0JcbiIsCgkJCQlQQUdFUyAqIHBhZ2VzaXplIC8gMTAyNCk7Cgl9CgoJREVWID0gb3BlbihkZXZpY2VfbmFtZSwgT19SRFdSKTsKCWlmIChERVYgPCAwIHx8IGZzdGF0KERFViwgJnN0YXRidWYpIDwgMCkgewoJCXBlcnJvcihkZXZpY2VfbmFtZSk7CgkJZXhpdChGQUxTRSk7Cgl9CglpZiAoIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKCQljaGVjayA9IDA7CgllbHNlIGlmIChzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzAwIHx8IHN0YXRidWYuc3RfcmRldiA9PSAweDAzNDApCgkJZGllKCJXaWxsIG5vdCB0cnkgdG8gbWFrZSBzd2FwZGV2aWNlIG9uICclcyciKTsKCiNpZmRlZiBfX3NwYXJjX18KCWlmICghZm9yY2UgJiYgdmVyc2lvbiA9PSAwKSB7CgkJLyogRG9uJ3Qgb3ZlcndyaXRlIHBhcnRpdGlvbiB0YWJsZSB1bmxlc3MgZm9yY2VkICovCgkJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgkJdW5zaWduZWQgc2hvcnQgKnEsIHN1bTsKCgkJaWYgKHJlYWQoREVWLCBidWZmZXIsIDUxMikgIT0gNTEyKQoJCQlkaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikgKGJ1ZmZlciArIDUxMCk7CgkJCWZvciAoc3VtID0gMDsgcSA+PSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOykKCQkJCXN1bSBePSAqcS0tOwoJCQlpZiAoIXN1bSkgewoJCQkJZXJyb3JNc2coIkRldmljZSAnJXMnIGNvbnRhaW5zIGEgdmFsaWQgU3VuIGRpc2tsYWJlbC5cbiIKIlRoaXMgcHJvYmFibHkgbWVhbnMgY3JlYXRpbmcgdjAgc3dhcCB3b3VsZCBkZXN0cm95IHlvdXIgcGFydGl0aW9uIHRhYmxlXG4iCiJObyBzd2FwIGNyZWF0ZWQuIElmIHlvdSByZWFsbHkgd2FudCB0byBjcmVhdGUgc3dhcCB2MCBvbiB0aGF0IGRldmljZSwgdXNlXG4iCiJ0aGUgLWYgb3B0aW9uIHRvIGZvcmNlIGl0LlxuIiwgZGV2aWNlX25hbWUpOwoJCQkJZXhpdChGQUxTRSk7CgkJCX0KCQl9Cgl9CiNlbmRpZgoKCWlmICh2ZXJzaW9uID09IDAgfHwgY2hlY2spCgkJY2hlY2tfYmxvY2tzKCk7CglpZiAodmVyc2lvbiA9PSAwICYmICFiaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIDApKQoJCWRpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJaWYgKHZlcnNpb24gPT0gMSkgewoJCXAtPnZlcnNpb24gPSB2ZXJzaW9uOwoJCXAtPmxhc3RfcGFnZSA9IFBBR0VTIC0gMTsKCQlwLT5ucl9iYWRwYWdlcyA9IGJhZHBhZ2VzOwoJfQoKCWdvb2RwYWdlcyA9IFBBR0VTIC0gYmFkcGFnZXMgLSAxOwoJaWYgKGdvb2RwYWdlcyA8PSAwKQoJCWRpZSgiVW5hYmxlIHRvIHNldCB1cCBzd2FwLXNwYWNlOiB1bnJlYWRhYmxlIik7CglwcmludGYoIlNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gJWQsIHNpemUgPSAlbGQgYnl0ZXNcbiIsCgkJICAgdmVyc2lvbiwgKGxvbmcpIChnb29kcGFnZXMgKiBwYWdlc2l6ZSkpOwoJd3JpdGVfc2lnbmF0dXJlKCh2ZXJzaW9uID09IDApID8gIlNXQVAtU1BBQ0UiIDogIlNXQVBTUEFDRTIiKTsKCglvZmZzZXQgPSAoKHZlcnNpb24gPT0gMCkgPyAwIDogMTAyNCk7CglpZiAobHNlZWsoREVWLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpCgkJZGllKCJ1bmFibGUgdG8gcmV3aW5kIHN3YXAtZGV2aWNlIik7CglpZiAod3JpdGUoREVWLCAoY2hhciAqKSBzaWduYXR1cmVfcGFnZSArIG9mZnNldCwgcGFnZXNpemUgLSBvZmZzZXQpCgkJIT0gcGFnZXNpemUgLSBvZmZzZXQpCgkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc2lnbmF0dXJlIHBhZ2UiKTsKCgkvKgoJICogQSBzdWJzZXF1ZW50IHN3YXBvbigpIHdpbGwgZmFpbCBpZiB0aGUgc2lnbmF0dXJlCgkgKiBpcyBub3QgYWN0dWFsbHkgb24gZGlzay4gKFRoaXMgaXMgYSBrZXJuZWwgYnVnLikKCSAqLwoJaWYgKGZzeW5jKERFVikpCgkJZGllKCJmc3luYyBmYWlsZWQiKTsKCXJldHVybihUUlVFKTsKfQo=