Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZQogKiAgU3VwcG9ydCwgbWFkZSBzb21lIHN0dWZmIHNtYWxsZXIsIGFuZCBmaXR0ZWQgZm9yIGxpZmUgaW4gYnVzeWJveC4KICoKICovCgojaW5jbHVkZSAiYnVzeWJveC5oIgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4JCQkvKiBmb3IgX0lPICovCiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KCnN0YXRpYyBjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CnN0YXRpYyBpbnQgREVWID0gLTE7CnN0YXRpYyBsb25nIFBBR0VTID0gMDsKc3RhdGljIGludCBjaGVjayA9IDA7CnN0YXRpYyBpbnQgYmFkcGFnZXMgPSAwOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUtTV0FQX1YwCnN0YXRpYyBpbnQgdmVyc2lvbiA9IC0xOwojZWxzZQojZGVmaW5lIHZlcnNpb24gMQovKiBhbmQgbWFrZSBzdXJlIHRoYXQgd2Ugb3B0aW1pemUgYXdheSBhbnl0aGluZyB3aGljaCB3b3VsZCBkZWFsIHdpdGggY2hlY2tpbmcKICogdGhlIGtlcm5lbCByZXZpc2lvbiBhcyB3ZSBoYXZlIHYxIHN1cHBvcnQgb25seSBhbnl3YXkuCiAqLwojdW5kZWYgS0VSTkVMX1ZFUlNJT04KI2RlZmluZSBLRVJORUxfVkVSU0lPTihwLHEscikgMQojZGVmaW5lIGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSAxCiNlbmRpZgoKLyoKICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHVuaW9uIHN3YXBfaGVhZGVyIHVzZXMgdGhlIGNvbnN0YW50IFBBR0VfU0laRS4KICogVW5mb3J0dW5hdGVseSwgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoaXMgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgbW9kZWwsCiAqIGFuZCBjYW4gb25seSBiZSBmb3VuZCBhdCBydW4gdGltZSAtLSB3ZSB1c2UgZ2V0cGFnZXNpemUoKS4KICovCgpzdGF0aWMgaW50IHBhZ2VzaXplOwpzdGF0aWMgdW5zaWduZWQgaW50ICpzaWduYXR1cmVfcGFnZTsKCnN0YXRpYyBzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgewoJY2hhciBib290Yml0c1sxMDI0XTsJCS8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLwoJdW5zaWduZWQgaW50IHN3YXBfdmVyc2lvbjsKCXVuc2lnbmVkIGludCBsYXN0X3BhZ2U7Cgl1bnNpZ25lZCBpbnQgbnJfYmFkcGFnZXM7Cgl1bnNpZ25lZCBpbnQgcGFkZGluZ1sxMjVdOwoJdW5zaWduZWQgaW50IGJhZHBhZ2VzWzFdOwp9ICpwOwoKc3RhdGljIGlubGluZSB2b2lkIGluaXRfc2lnbmF0dXJlX3BhZ2Uodm9pZCkKewoJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwoKI2lmZGVmIFBBR0VfU0laRQoJaWYgKHBhZ2VzaXplICE9IFBBR0VfU0laRSkKCQliYl9lcnJvcl9tc2coIkFzc3VtaW5nIHBhZ2VzIG9mIHNpemUgJWQiLCBwYWdlc2l6ZSk7CiNlbmRpZgoJc2lnbmF0dXJlX3BhZ2UgPSAodW5zaWduZWQgaW50ICopIHhtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLCAwLCBwYWdlc2l6ZSk7CglwID0gKHN0cnVjdCBzd2FwX2hlYWRlcl92MSAqKSBzaWduYXR1cmVfcGFnZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3NpZ25hdHVyZShjaGFyICpzaWcpCnsKCWNoYXIgKnNwID0gKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgoJc3RybmNweShzcCArIHBhZ2VzaXplIC0gMTAsIHNpZywgMTApOwp9CgojZGVmaW5lIFYwX01BWF9QQUdFUwkoOCAqIChwYWdlc2l6ZSAtIDEwKSkKLyogQmVmb3JlIDIuMi4wcHJlOSAqLwojZGVmaW5lIFYxX09MRF9NQVhfUEFHRVMJKCgweDdmZmZmZmZmIC8gcGFnZXNpemUpIC0gMSkKLyogU2luY2UgMi4yLjBwcmU5OgogICBlcnJvciBpZiBuciBvZiBwYWdlcyA+PSBTV1BfT0ZGU0VUKFNXUF9FTlRSWSgwLH4wVUwpKQogICB3aXRoIHZhcmlhdGlvbnMgb24KCSNkZWZpbmUgU1dQX0VOVFJZKHR5cGUsb2Zmc2V0KSAoKCh0eXBlKSA8PCAxKSB8ICgob2Zmc2V0KSA8PCA4KSkKCSNkZWZpbmUgU1dQX09GRlNFVChlbnRyeSkgKChlbnRyeSkgPj4gOCkKICAgb24gdGhlIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcy4gQmVsb3cgdGhlIHJlc3VsdCAtIHl1ay4KCiAgIE1hY2hpbmUJcGFnZXNpemUJU1dQX0VOVFJZCVNXUF9PRkZTRVQJYm91bmQrMQlvbGRib3VuZCsyCiAgIGkzODYJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIG1pcHMJCTJeMTIJCW88PDE1CQllPj4xNQkJMTw8MTcJMTw8MTkKICAgYWxwaGEJMl4xMwkJbzw8NDAJCWU+PjQwCQkxPDwyNAkxPDwxOAogICBtNjhrCQkyXjEyCQlvPDwxMgkJZT4+MTIJCTE8PDIwCTE8PDE5CiAgIHNwYXJjCTJeezEyLDEzfQkobyYweDNmZmZmKTw8OQkoZT4+OSkmMHgzZmZmZgkxPDwxOAkxPDx7MTksMTh9CiAgIHNwYXJjNjQJMl4xMwkJbzw8MTMJCWU+PjEzCQkxPDw1MQkxPDwxOAogICBwcGMJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIGFybW8JCTJeezEzLDE0LDE1fQlvPDw4CQllPj44CQkxPDwyNAkxPDx7MTgsMTcsMTZ9CiAgIGFybXYJCTJeMTIJCW88PDkJCWU+PjkJCTE8PDIzCTE8PDE5CgogICBhc3N1bWluZyB0aGF0IGxvbmdzIGhhdmUgNjQgYml0cyBvbiBhbHBoYSBhbmQgc3BhcmM2NCBhbmQgMzIgYml0cyBlbHNld2hlcmUuCgogICBUaGUgYmFkIHBhcnQgaXMgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhpcyBzaW5jZSB0aGUga2VybmVsIHdpbGwKICAgcmVmdXNlIGEgc3dhcCBzcGFjZSBpZiBpdCBpcyB0b28gbGFyZ2UuCiovCi8qIHBhdGNoIGZyb20gamogLSB3aHkgZG9lcyB0aGlzIGRpZmZlciBmcm9tIHRoZSBhYm92ZT8gKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDI0KSAtIDEpCiNlbGlmIGRlZmluZWQoX19taXBzX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMTcpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX3Y5X18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDMgPDwgMjkpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAocGFnZXNpemUgPT0gODE5MiA/ICgoMyA8PCAyOSkgLSAxKSA6ICgoMSA8PCAxOCkgLSAxKSkKI2Vsc2UKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIFYxX09MRF9NQVhfUEFHRVMKI2VuZGlmCi8qIG1hbiBwYWdlIG5vdyBzYXlzOgpUaGUgbWF4aW11bSB1c2VmdWwgc2l6ZSBvZiBhIHN3YXAgYXJlYSBub3cgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLgpJdCBpcyByb3VnaGx5IDJHQiBvbiBpMzg2LCBQUEMsIG02OGssIEFSTSwgMUdCIG9uIHNwYXJjLCA1MTJNQiBvbiBtaXBzLAoxMjhHQiBvbiBhbHBoYSBhbmQgM1RCIG9uIHNwYXJjNjQuCiovCgojZGVmaW5lIE1BWF9CQURQQUdFUwkoKHBhZ2VzaXplLTEwMjQtMTI4KnNpemVvZihpbnQpLTEwKS9zaXplb2YoaW50KSkKCnN0YXRpYyBpbmxpbmUgdm9pZCBiaXRfc2V0KHVuc2lnbmVkIGludCAqYWRkciwgdW5zaWduZWQgaW50IG5yKQp7Cgl1bnNpZ25lZCBpbnQgciwgbTsKCglhZGRyICs9IG5yIC8gKDggKiBzaXplb2YoaW50KSk7CgoJciA9ICphZGRyOwoJbSA9IDEgPDwgKG5yICYgKDggKiBzaXplb2YoaW50KSAtIDEpKTsKCgkqYWRkciA9IHIgfCBtOwp9CgpzdGF0aWMgaW50IGJpdF90ZXN0X2FuZF9jbGVhcih1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByICYgfm07CglyZXR1cm4gKHIgJiBtKSAhPSAwOwp9CgpzdGF0aWMgdm9pZCBwYWdlX29rKGludCBwYWdlKQp7CglpZiAoRU5BQkxFX0ZFQVRVUkVfTUtTV0FQX1YwKSB7CgkJYml0X3NldChzaWduYXR1cmVfcGFnZSwgcGFnZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2Jsb2Nrcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgY3VycmVudF9wYWdlOwoJaW50IGRvX3NlZWsgPSAxOwoJY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IHhtYWxsb2MocGFnZXNpemUpOwoJY3VycmVudF9wYWdlID0gMDsKCXdoaWxlIChjdXJyZW50X3BhZ2UgPCBQQUdFUykgewoJCWlmICghY2hlY2sgJiYgdmVyc2lvbiA9PSAwKSB7CgkJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKGRvX3NlZWsgJiYgbHNlZWsoREVWLCBjdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSwgU0VFS19TRVQpICE9CgkJCWN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplKQoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VlayBmYWlsZWQgaW4gY2hlY2tfYmxvY2tzIik7CgkJaWYgKChkb19zZWVrID0gKHBhZ2VzaXplICE9IHJlYWQoREVWLCBidWZmZXIsIHBhZ2VzaXplKSkpKSB7CgkJCWN1cnJlbnRfcGFnZSsrOwoJCQlpZiAodmVyc2lvbiA9PSAwKQoJCQkJYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCBjdXJyZW50X3BhZ2UpOwoJCQllbHNlIHsKCQkJCWlmIChiYWRwYWdlcyA9PSBNQVhfQkFEUEFHRVMpCgkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGJhZCBwYWdlcyIpOwoJCQkJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gY3VycmVudF9wYWdlOwoJCQl9CgkJCWJhZHBhZ2VzKys7CgkJCWNvbnRpbnVlOwoJCX0KCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCX0KCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKCQlmcmVlKGJ1ZmZlcik7CglpZiAoYmFkcGFnZXMgPiAwKQoJCXByaW50ZigiJWQgYmFkIHBhZ2Ulc1xuIiwgYmFkcGFnZXMsIChiYWRwYWdlcz09MSk/IiI6InMiKTsKfQoKc3RhdGljIGxvbmcgdmFsaWRfb2Zmc2V0KGludCBmZCwgaW50IG9mZnNldCkKewoJY2hhciBjaDsKCglpZiAobHNlZWsoZmQsIG9mZnNldCwgMCkgPCAwKQoJCXJldHVybiAwOwoJaWYgKHJlYWQoZmQsICZjaCwgMSkgPCAxKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgZmluZF9zaXplKGludCBmZCkKewoJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKCglsb3cgPSAwOwoJZm9yIChoaWdoID0gMTsgaGlnaCA+IDAgJiYgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQoJCWxvdyA9IGhpZ2g7Cgl3aGlsZSAobG93IDwgaGlnaCAtIDEpIHsKCQljb25zdCBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCgkJaWYgKHZhbGlkX29mZnNldChmZCwgbWlkKSkKCQkJbG93ID0gbWlkOwoJCWVsc2UKCQkJaGlnaCA9IG1pZDsKCX0KCXJldHVybiAobG93ICsgMSk7Cn0KCi8qIHJldHVybiBzaXplIGluIHBhZ2VzLCB0byBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCnN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfc2l6ZShjb25zdCBjaGFyICpmaWxlKQp7CglpbnQgZmQ7Cglsb25nIHNpemU7CgoJZmQgPSBiYl94b3BlbjMoZmlsZSwgT19SRE9OTFksIDApOwoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgewoJCXNpemUgLz0gcGFnZXNpemUgLyA1MTI7Cgl9IGVsc2UgewoJCXNpemUgPSBmaW5kX3NpemUoZmQpIC8gcGFnZXNpemU7Cgl9CgljbG9zZShmZCk7CglyZXR1cm4gc2l6ZTsKfQoKaW50IG1rc3dhcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciAqdG1wOwoJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCWludCBzejsKCWludCBtYXhwYWdlczsKCWludCBnb29kcGFnZXM7CiNpZmRlZiBfX3NwYXJjX18KCWludCBmb3JjZSA9IDA7CiNlbmRpZgoKCWluaXRfc2lnbmF0dXJlX3BhZ2UoKTsJCS8qIGdldCBwYWdlc2l6ZSAqLwoKCWJiX29wdF9jb21wbGVtZW50YWxseSA9ICI/IjsgLyogY2FsbCBiYl9zaG93X3VzYWdlIGludGVybmFsbHkgKi8KCXN6ID0gYmJfZ2V0b3B0X3VsZmxhZ3MoYXJnYywgYXJndiwgIitjZnY6IiwgJnRtcCk7CglpZiAoc3ogJiAxKQoJCWNoZWNrID0gMTsKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKHN6ICYgMikKCQlmb3JjZSA9IDE7CiNlbmRpZgojaWYgRU5BQkxFX0ZFQVRVUkVfTUtTV0FQX1YwCglpZiAoc3ogJiA0KSB7CgkJdmVyc2lvbiA9IGJiX3hnZXRsYXJnKHRtcCwgMTAsIDAsIDEpOwoJfSBlbHNlIHsKCQlpZiAoZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiwgMSwgMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZQoJCQl2ZXJzaW9uID0gMTsKCX0KI2VuZGlmCgoJYXJndiArPSBvcHRpbmQ7CglhcmdjIC09IG9wdGluZDsKCglnb29kcGFnZXMgPSBwYWdlc2l6ZSAvIDEwMjQ7IC8qIGNhY2hlIGRpdmlzaW9uICovCgl3aGlsZSAoYXJnYy0tKSB7CgkJaWYgKGRldmljZV9uYW1lKSB7CgkJCVBBR0VTID0gYmJfeGdldGxhcmcoYXJndlswXSwgMCwgMTAsIHN6ICogZ29vZHBhZ2VzKSAvIGdvb2RwYWdlczsKCQkJYXJnYyA9IDA7IC8qIGlnbm9yZSBhbnkgc3VycGx1cyBhcmdzLi4gKi8KCQl9IGVsc2UgewoJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJCXN6ID0gZ2V0X3NpemUoZGV2aWNlX25hbWUpOwoJCQlhcmd2Kys7CgkJfQoJfQoKCWlmICghZGV2aWNlX25hbWUpIHsKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3I6IE5vd2hlcmUgdG8gc2V0IHVwIHN3YXAgb24/Iik7Cgl9CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0KCglpZiAoIXZlcnNpb24pCgkJbWF4cGFnZXMgPSBWMF9NQVhfUEFHRVM7CgllbHNlIGlmIChnZXRfbGludXhfdmVyc2lvbl9jb2RlKCkgPj0gS0VSTkVMX1ZFUlNJT04oMiwyLDEpKQoJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJZWxzZSB7CgkJbWF4cGFnZXMgPSBWMV9PTERfTUFYX1BBR0VTOwoJCWlmIChtYXhwYWdlcyA+IFYxX01BWF9QQUdFUykKCQkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7Cgl9CglpZiAoUEFHRVMgPiBtYXhwYWdlcykgewoJCVBBR0VTID0gbWF4cGFnZXM7CgkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiB0cnVuY2F0aW5nIHN3YXAgYXJlYSB0byAlbGRrQiIsCgkJCQlQQUdFUyAqIGdvb2RwYWdlcyk7Cgl9CgoJREVWID0gYmJfeG9wZW4zKGRldmljZV9uYW1lLCBPX1JEV1IsIDApOwoJaWYgKGZzdGF0KERFViwgJnN0YXRidWYpIDwgMCkKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgZGV2aWNlX25hbWUpOwoJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCgkJY2hlY2sgPSAwOwoJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJXaWxsIG5vdCB0cnkgdG8gbWFrZSBzd2FwZGV2aWNlIG9uICclcyciLCBkZXZpY2VfbmFtZSk7CgojaWZkZWYgX19zcGFyY19fCglpZiAoIWZvcmNlICYmIHZlcnNpb24gPT0gMCkgewoJCS8qIERvbid0IG92ZXJ3cml0ZSBwYXJ0aXRpb24gdGFibGUgdW5sZXNzIGZvcmNlZCAqLwoJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHNpZ25hdHVyZV9wYWdlOwoJCXVuc2lnbmVkIHNob3J0ICpxLCBzdW07CgoJCWlmIChyZWFkKERFViwgYnVmZmVyLCA1MTIpICE9IDUxMikKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikgKGJ1ZmZlciArIDUxMCk7CgkJCWZvciAoc3VtID0gMDsgcSA+PSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOykKCQkJCXN1bSBePSAqcS0tOwoJCQlpZiAoIXN1bSkgewoJCQkJYmJfZXJyb3JfbXNnKCJEZXZpY2UgJyVzJyBjb250YWlucyBhIHZhbGlkIFN1biBkaXNrbGFiZWwuXG4iCiJUaGlzIHByb2JhYmx5IG1lYW5zIGNyZWF0aW5nIHYwIHN3YXAgd291bGQgZGVzdHJveSB5b3VyIHBhcnRpdGlvbiB0YWJsZVxuIgoiTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuIgoidGhlIC1mIG9wdGlvbiB0byBmb3JjZSBpdC4iLCBkZXZpY2VfbmFtZSk7CgkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwoJCQl9CgkJfQoJfQojZW5kaWYKCglpZiAodmVyc2lvbiA9PSAwIHx8IGNoZWNrKQoJCWNoZWNrX2Jsb2NrcygpOwoJaWYgKHZlcnNpb24gPT0gMCAmJiAhYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCAwKSkKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJaWYgKHZlcnNpb24gPT0gMSkgewoJCXAtPnN3YXBfdmVyc2lvbiA9IHZlcnNpb247CgkJcC0+bGFzdF9wYWdlID0gUEFHRVMgLSAxOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlVuYWJsZSB0byBzZXQgdXAgc3dhcC1zcGFjZTogdW5yZWFkYWJsZSIpOwoJcHJpbnRmKCJTZXR0aW5nIHVwIHN3YXBzcGFjZSB2ZXJzaW9uICVkLCBzaXplID0gJWxkIGJ5dGVzXG4iLAoJCSAgIHZlcnNpb24sIChsb25nKSAoZ29vZHBhZ2VzICogcGFnZXNpemUpKTsKCXdyaXRlX3NpZ25hdHVyZSgodmVyc2lvbiA9PSAwKSA/ICJTV0FQLVNQQUNFIiA6ICJTV0FQU1BBQ0UyIik7CgoJc3ogPSAoKHZlcnNpb24gPT0gMCkgPyAwIDogMTAyNCk7IC8qIG9mZnNldCAqLwoJaWYgKGxzZWVrKERFViwgc3osIFNFRUtfU0VUKSAhPSBzeikKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5hYmxlIHRvIHJld2luZCBzd2FwLWRldmljZSIpOwoJZ29vZHBhZ2VzID0gcGFnZXNpemUgLSBzejsgLyogY2FjaGUgc3Vic3RyYWN0aW9uICovCglpZiAod3JpdGUoREVWLCAoY2hhciAqKSBzaWduYXR1cmVfcGFnZSArIHN6LCBnb29kcGFnZXMpCgkJIT0gZ29vZHBhZ2VzKQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gd3JpdGUgc2lnbmF0dXJlIHBhZ2UiKTsKCgkvKgoJICogQSBzdWJzZXF1ZW50IHN3YXBvbigpIHdpbGwgZmFpbCBpZiB0aGUgc2lnbmF0dXJlCgkgKiBpcyBub3QgYWN0dWFsbHkgb24gZGlzay4gKFRoaXMgaXMgYSBrZXJuZWwgYnVnLikKCSAqLwoJaWYgKGZzeW5jKERFVikpCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZzeW5jIGZhaWxlZCIpOwoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CgkJY2xvc2UoREVWKTsKCQlmcmVlKHNpZ25hdHVyZV9wYWdlKTsKCX0KCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K