Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZQogKiAgU3VwcG9ydCwgbWFkZSBzb21lIHN0dWZmIHNtYWxsZXIsIGFuZCBmaXR0ZWQgZm9yIGxpZmUgaW4gYnVzeWJveC4KICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4JCQkvKiBmb3IgX0lPICovCiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KI2luY2x1ZGUgImJ1c3lib3guaCIKCiNpZm5kZWYgX0lPCi8qIHByZS0xLjMuNDUgKi8Kc3RhdGljIGNvbnN0IGludCBCTEtHRVRTSVpFID0gMHgxMjYwOwojZWxzZQovKiBzYW1lIG9uIGkzODYsIG02OGssIGFybTsgZGlmZmVyZW50IG9uIGFscGhhLCBtaXBzLCBzcGFyYywgcHBjICovCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikKI2VuZGlmCgpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWUgPSBOVUxMOwpzdGF0aWMgaW50IERFViA9IC0xOwpzdGF0aWMgbG9uZyBQQUdFUyA9IDA7CnN0YXRpYyBpbnQgY2hlY2sgPSAwOwpzdGF0aWMgaW50IGJhZHBhZ2VzID0gMDsKc3RhdGljIGludCB2ZXJzaW9uID0gLTE7CgojZGVmaW5lIE1BS0VfVkVSU0lPTihwLHEscikJKDY1NTM2KihwKSArIDI1NioocSkgKyAocikpCgovKgogKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5pb24gc3dhcF9oZWFkZXIgdXNlcyB0aGUgY29uc3RhbnQgUEFHRV9TSVpFLgogKiBVbmZvcnR1bmF0ZWx5LCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhpcyBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBtb2RlbCwKICogYW5kIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHJ1biB0aW1lIC0tIHdlIHVzZSBnZXRwYWdlc2l6ZSgpLgogKi8KCnN0YXRpYyBpbnQgcGFnZXNpemU7CnN0YXRpYyBpbnQgKnNpZ25hdHVyZV9wYWdlOwoKc3RhdGljIHN0cnVjdCBzd2FwX2hlYWRlcl92MSB7CgljaGFyIGJvb3RiaXRzWzEwMjRdOwkJLyogU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCgl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKCXVuc2lnbmVkIGludCBsYXN0X3BhZ2U7Cgl1bnNpZ25lZCBpbnQgbnJfYmFkcGFnZXM7Cgl1bnNpZ25lZCBpbnQgcGFkZGluZ1sxMjVdOwoJdW5zaWduZWQgaW50IGJhZHBhZ2VzWzFdOwp9ICpwOwoKc3RhdGljIGlubGluZSB2b2lkIGluaXRfc2lnbmF0dXJlX3BhZ2Uodm9pZCkKewoJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwoKI2lmZGVmIFBBR0VfU0laRQoJaWYgKHBhZ2VzaXplICE9IFBBR0VfU0laRSkKCQliYl9lcnJvcl9tc2coIkFzc3VtaW5nIHBhZ2VzIG9mIHNpemUgJWQiLCBwYWdlc2l6ZSk7CiNlbmRpZgoJc2lnbmF0dXJlX3BhZ2UgPSAoaW50ICopIHhtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLCAwLCBwYWdlc2l6ZSk7CglwID0gKHN0cnVjdCBzd2FwX2hlYWRlcl92MSAqKSBzaWduYXR1cmVfcGFnZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3NpZ25hdHVyZShjaGFyICpzaWcpCnsKCWNoYXIgKnNwID0gKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgoJc3RybmNweShzcCArIHBhZ2VzaXplIC0gMTAsIHNpZywgMTApOwp9CgojZGVmaW5lIFYwX01BWF9QQUdFUwkoOCAqIChwYWdlc2l6ZSAtIDEwKSkKLyogQmVmb3JlIDIuMi4wcHJlOSAqLwojZGVmaW5lIFYxX09MRF9NQVhfUEFHRVMJKCgweDdmZmZmZmZmIC8gcGFnZXNpemUpIC0gMSkKLyogU2luY2UgMi4yLjBwcmU5OgogICBlcnJvciBpZiBuciBvZiBwYWdlcyA+PSBTV1BfT0ZGU0VUKFNXUF9FTlRSWSgwLH4wVUwpKQogICB3aXRoIHZhcmlhdGlvbnMgb24KCSNkZWZpbmUgU1dQX0VOVFJZKHR5cGUsb2Zmc2V0KSAoKCh0eXBlKSA8PCAxKSB8ICgob2Zmc2V0KSA8PCA4KSkKCSNkZWZpbmUgU1dQX09GRlNFVChlbnRyeSkgKChlbnRyeSkgPj4gOCkKICAgb24gdGhlIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcy4gQmVsb3cgdGhlIHJlc3VsdCAtIHl1ay4KCiAgIE1hY2hpbmUJcGFnZXNpemUJU1dQX0VOVFJZCVNXUF9PRkZTRVQJYm91bmQrMQlvbGRib3VuZCsyCiAgIGkzODYJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIG1pcHMJCTJeMTIJCW88PDE1CQllPj4xNQkJMTw8MTcJMTw8MTkKICAgYWxwaGEJMl4xMwkJbzw8NDAJCWU+PjQwCQkxPDwyNAkxPDwxOAogICBtNjhrCQkyXjEyCQlvPDwxMgkJZT4+MTIJCTE8PDIwCTE8PDE5CiAgIHNwYXJjCTJeezEyLDEzfQkobyYweDNmZmZmKTw8OQkoZT4+OSkmMHgzZmZmZgkxPDwxOAkxPDx7MTksMTh9CiAgIHNwYXJjNjQJMl4xMwkJbzw8MTMJCWU+PjEzCQkxPDw1MQkxPDwxOAogICBwcGMJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIGFybW8JCTJeezEzLDE0LDE1fQlvPDw4CQllPj44CQkxPDwyNAkxPDx7MTgsMTcsMTZ9CiAgIGFybXYJCTJeMTIJCW88PDkJCWU+PjkJCTE8PDIzCTE8PDE5CgogICBhc3N1bWluZyB0aGF0IGxvbmdzIGhhdmUgNjQgYml0cyBvbiBhbHBoYSBhbmQgc3BhcmM2NCBhbmQgMzIgYml0cyBlbHNld2hlcmUuCgogICBUaGUgYmFkIHBhcnQgaXMgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhpcyBzaW5jZSB0aGUga2VybmVsIHdpbGwKICAgcmVmdXNlIGEgc3dhcCBzcGFjZSBpZiBpdCBpcyB0b28gbGFyZ2UuCiovCi8qIHBhdGNoIGZyb20gamogLSB3aHkgZG9lcyB0aGlzIGRpZmZlciBmcm9tIHRoZSBhYm92ZT8gKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDI0KSAtIDEpCiNlbGlmIGRlZmluZWQoX19taXBzX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMTcpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX3Y5X18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDMgPDwgMjkpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAocGFnZXNpemUgPT0gODE5MiA/ICgoMyA8PCAyOSkgLSAxKSA6ICgoMSA8PCAxOCkgLSAxKSkKI2Vsc2UKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIFYxX09MRF9NQVhfUEFHRVMKI2VuZGlmCi8qIG1hbiBwYWdlIG5vdyBzYXlzOgpUaGUgbWF4aW11bSB1c2VmdWwgc2l6ZSBvZiBhIHN3YXAgYXJlYSBub3cgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLgpJdCBpcyByb3VnaGx5IDJHQiBvbiBpMzg2LCBQUEMsIG02OGssIEFSTSwgMUdCIG9uIHNwYXJjLCA1MTJNQiBvbiBtaXBzLAoxMjhHQiBvbiBhbHBoYSBhbmQgM1RCIG9uIHNwYXJjNjQuCiovCgojZGVmaW5lIE1BWF9CQURQQUdFUwkoKHBhZ2VzaXplLTEwMjQtMTI4KnNpemVvZihpbnQpLTEwKS9zaXplb2YoaW50KSkKCnN0YXRpYyBpbmxpbmUgdm9pZCBiaXRfc2V0KHVuc2lnbmVkIGludCAqYWRkciwgdW5zaWduZWQgaW50IG5yKQp7Cgl1bnNpZ25lZCBpbnQgciwgbTsKCglhZGRyICs9IG5yIC8gKDggKiBzaXplb2YoaW50KSk7CgoJciA9ICphZGRyOwoJbSA9IDEgPDwgKG5yICYgKDggKiBzaXplb2YoaW50KSAtIDEpKTsKCgkqYWRkciA9IHIgfCBtOwp9CgpzdGF0aWMgaW50IGJpdF90ZXN0X2FuZF9jbGVhcih1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByICYgfm07CglyZXR1cm4gKHIgJiBtKSAhPSAwOwp9CgoKc3RhdGljIHZvaWQgcGFnZV9vayhpbnQgcGFnZSkKewoJaWYgKHZlcnNpb24gPT0gMCkKCQliaXRfc2V0KHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHBhZ2VfYmFkKGludCBwYWdlKQp7CglpZiAodmVyc2lvbiA9PSAwKQoJCWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwgcGFnZSk7CgllbHNlIHsKCQlpZiAoYmFkcGFnZXMgPT0gTUFYX0JBRFBBR0VTKQoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYmFkIHBhZ2VzIik7CgkJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gcGFnZTsKCX0KCWJhZHBhZ2VzKys7Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2Jsb2Nrcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgY3VycmVudF9wYWdlOwoJaW50IGRvX3NlZWsgPSAxOwoJY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IHhtYWxsb2MocGFnZXNpemUpOwoJY3VycmVudF9wYWdlID0gMDsKCXdoaWxlIChjdXJyZW50X3BhZ2UgPCBQQUdFUykgewoJCWlmICghY2hlY2spIHsKCQkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoZG9fc2VlayAmJiBsc2VlayhERVYsIGN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0KCQkJY3VycmVudF9wYWdlICogcGFnZXNpemUpCgkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiKTsKCQlpZiAoKGRvX3NlZWsgPSAocGFnZXNpemUgIT0gcmVhZChERVYsIGJ1ZmZlciwgcGFnZXNpemUpKSkpIHsKCQkJcGFnZV9iYWQoY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7Cgl9CglpZiAoYmFkcGFnZXMgPT0gMSkKCQlwcmludGYoIm9uZSBiYWQgcGFnZVxuIik7CgllbHNlIGlmIChiYWRwYWdlcyA+IDEpCgkJcHJpbnRmKCIlZCBiYWQgcGFnZXNcbiIsIGJhZHBhZ2VzKTsKfQoKc3RhdGljIGxvbmcgdmFsaWRfb2Zmc2V0KGludCBmZCwgaW50IG9mZnNldCkKewoJY2hhciBjaDsKCglpZiAobHNlZWsoZmQsIG9mZnNldCwgMCkgPCAwKQoJCXJldHVybiAwOwoJaWYgKHJlYWQoZmQsICZjaCwgMSkgPCAxKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgZmluZF9zaXplKGludCBmZCkKewoJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKCglsb3cgPSAwOwoJZm9yIChoaWdoID0gMTsgaGlnaCA+IDAgJiYgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQoJCWxvdyA9IGhpZ2g7Cgl3aGlsZSAobG93IDwgaGlnaCAtIDEpIHsKCQljb25zdCBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCgkJaWYgKHZhbGlkX29mZnNldChmZCwgbWlkKSkKCQkJbG93ID0gbWlkOwoJCWVsc2UKCQkJaGlnaCA9IG1pZDsKCX0KCXJldHVybiAobG93ICsgMSk7Cn0KCi8qIHJldHVybiBzaXplIGluIHBhZ2VzLCB0byBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCnN0YXRpYyBsb25nIGdldF9zaXplKGNvbnN0IGNoYXIgKmZpbGUpCnsKCWludCBmZDsKCWxvbmcgc2l6ZTsKCglpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpIDwgMCkKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgZmlsZSk7CglpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSB7CgkJaW50IHNlY3RvcnNfcGVyX3BhZ2UgPSBwYWdlc2l6ZSAvIDUxMjsKCgkJc2l6ZSAvPSBzZWN0b3JzX3Blcl9wYWdlOwoJfSBlbHNlIHsKCQlzaXplID0gZmluZF9zaXplKGZkKSAvIHBhZ2VzaXplOwoJfQoJY2xvc2UoZmQpOwoJcmV0dXJuIHNpemU7Cn0KCmludCBta3N3YXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNoYXIgKnRtcDsKCXN0cnVjdCBzdGF0IHN0YXRidWY7CglpbnQgc3o7CglpbnQgbWF4cGFnZXM7CglpbnQgZ29vZHBhZ2VzOwoJaW50IG9mZnNldDsKCWludCBmb3JjZSA9IDA7CgoJaW5pdF9zaWduYXR1cmVfcGFnZSgpOwkJLyogZ2V0IHBhZ2VzaXplICovCgoJd2hpbGUgKGFyZ2MtLSA+IDEpIHsKCQlhcmd2Kys7CgkJaWYgKGFyZ3ZbMF1bMF0gIT0gJy0nKSB7CgkJCWlmIChkZXZpY2VfbmFtZSkgewoJCQkJaW50IGJsb2Nrc19wZXJfcGFnZSA9IHBhZ2VzaXplIC8gMTAyNDsKCgkJCQlQQUdFUyA9IHN0cnRvbChhcmd2WzBdLCAmdG1wLCAwKSAvIGJsb2Nrc19wZXJfcGFnZTsKCQkJCWlmICgqdG1wKQoJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJfSBlbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlIHsKCQkJc3dpdGNoIChhcmd2WzBdWzFdKSB7CgkJCWNhc2UgJ2MnOgoJCQkJY2hlY2sgPSAxOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2YnOgoJCQkJZm9yY2UgPSAxOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3YnOgoJCQkJdmVyc2lvbiA9IGF0b2koYXJndlswXSArIDIpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQliYl9zaG93X3VzYWdlKCk7CgkJCX0KCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKSB7CgkJYmJfZXJyb3JfbXNnKCJlcnJvcjogTm93aGVyZSB0byBzZXQgdXAgc3dhcCBvbj8iKTsKCQliYl9zaG93X3VzYWdlKCk7Cgl9CglzeiA9IGdldF9zaXplKGRldmljZV9uYW1lKTsKCWlmICghUEFHRVMpIHsKCQlQQUdFUyA9IHN6OwoJfSBlbHNlIGlmIChQQUdFUyA+IHN6ICYmICFmb3JjZSkgewoJCWJiX2Vycm9yX21zZygiZXJyb3I6IHNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGRldmljZSBzaXplICVkIiwKCQkJCVBBR0VTICogKHBhZ2VzaXplIC8gMTAyNCksIHN6ICogKHBhZ2VzaXplIC8gMTAyNCkpOwoJCXJldHVybiBFWElUX0ZBSUxVUkU7Cgl9CgoJaWYgKHZlcnNpb24gPT0gLTEpIHsKCQlpZiAoUEFHRVMgPD0gVjBfTUFYX1BBR0VTKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChnZXRfa2VybmVsX3JldmlzaW9uKCkgPCBNQUtFX1ZFUlNJT04oMiwgMSwgMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAocGFnZXNpemUgPCAyMDQ4KQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQoJaWYgKHZlcnNpb24gIT0gMCAmJiB2ZXJzaW9uICE9IDEpIHsKCQliYl9lcnJvcl9tc2coImVycm9yOiB1bmtub3duIHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKCQliYl9zaG93X3VzYWdlKCk7Cgl9CglpZiAoUEFHRVMgPCAxMCkgewoJCWJiX2Vycm9yX21zZygiZXJyb3I6IHN3YXAgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCAlbGRrQiIsCgkJCQkobG9uZykgKDEwICogcGFnZXNpemUgLyAxMDI0KSk7CgkJYmJfc2hvd191c2FnZSgpOwoJfQojaWYgMAoJbWF4cGFnZXMgPSAoKHZlcnNpb24gPT0gMCkgPyBWMF9NQVhfUEFHRVMgOiBWMV9NQVhfUEFHRVMpOwojZWxzZQoJaWYgKCF2ZXJzaW9uKQoJCW1heHBhZ2VzID0gVjBfTUFYX1BBR0VTOwoJZWxzZSBpZiAoZ2V0X2tlcm5lbF9yZXZpc2lvbigpID49IE1BS0VfVkVSU0lPTigyLCAyLCAxKSkKCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCWVsc2UgewoJCW1heHBhZ2VzID0gVjFfT0xEX01BWF9QQUdFUzsKCQlpZiAobWF4cGFnZXMgPiBWMV9NQVhfUEFHRVMpCgkJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJfQojZW5kaWYKCWlmIChQQUdFUyA+IG1heHBhZ2VzKSB7CgkJUEFHRVMgPSBtYXhwYWdlczsKCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IHRydW5jYXRpbmcgc3dhcCBhcmVhIHRvICVsZGtCIiwKCQkJCVBBR0VTICogcGFnZXNpemUgLyAxMDI0KTsKCX0KCglERVYgPSBvcGVuKGRldmljZV9uYW1lLCBPX1JEV1IpOwoJaWYgKERFViA8IDAgfHwgZnN0YXQoREVWLCAmc3RhdGJ1ZikgPCAwKQoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBkZXZpY2VfbmFtZSk7CglpZiAoIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKCQljaGVjayA9IDA7CgllbHNlIGlmIChzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzAwIHx8IHN0YXRidWYuc3RfcmRldiA9PSAweDAzNDApCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIldpbGwgbm90IHRyeSB0byBtYWtlIHN3YXBkZXZpY2Ugb24gJyVzJyIsIGRldmljZV9uYW1lKTsKCiNpZmRlZiBfX3NwYXJjX18KCWlmICghZm9yY2UgJiYgdmVyc2lvbiA9PSAwKSB7CgkJLyogRG9uJ3Qgb3ZlcndyaXRlIHBhcnRpdGlvbiB0YWJsZSB1bmxlc3MgZm9yY2VkICovCgkJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgkJdW5zaWduZWQgc2hvcnQgKnEsIHN1bTsKCgkJaWYgKHJlYWQoREVWLCBidWZmZXIsIDUxMikgIT0gNTEyKQoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJCWlmIChidWZmZXJbNTA4XSA9PSAweERBICYmIGJ1ZmZlcls1MDldID09IDB4QkUpIHsKCQkJcSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoYnVmZmVyICsgNTEwKTsKCQkJZm9yIChzdW0gPSAwOyBxID49ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7KQoJCQkJc3VtIF49ICpxLS07CgkJCWlmICghc3VtKSB7CgkJCQliYl9lcnJvcl9tc2coIkRldmljZSAnJXMnIGNvbnRhaW5zIGEgdmFsaWQgU3VuIGRpc2tsYWJlbC5cbiIKIlRoaXMgcHJvYmFibHkgbWVhbnMgY3JlYXRpbmcgdjAgc3dhcCB3b3VsZCBkZXN0cm95IHlvdXIgcGFydGl0aW9uIHRhYmxlXG4iCiJObyBzd2FwIGNyZWF0ZWQuIElmIHlvdSByZWFsbHkgd2FudCB0byBjcmVhdGUgc3dhcCB2MCBvbiB0aGF0IGRldmljZSwgdXNlXG4iCiJ0aGUgLWYgb3B0aW9uIHRvIGZvcmNlIGl0LiIsIGRldmljZV9uYW1lKTsKCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CgkJCX0KCQl9Cgl9CiNlbmRpZgoKCWlmICh2ZXJzaW9uID09IDAgfHwgY2hlY2spCgkJY2hlY2tfYmxvY2tzKCk7CglpZiAodmVyc2lvbiA9PSAwICYmICFiaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIDApKQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmYXRhbDogZmlyc3QgcGFnZSB1bnJlYWRhYmxlIik7CglpZiAodmVyc2lvbiA9PSAxKSB7CgkJcC0+dmVyc2lvbiA9IHZlcnNpb247CgkJcC0+bGFzdF9wYWdlID0gUEFHRVMgLSAxOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlVuYWJsZSB0byBzZXQgdXAgc3dhcC1zcGFjZTogdW5yZWFkYWJsZSIpOwoJcHJpbnRmKCJTZXR0aW5nIHVwIHN3YXBzcGFjZSB2ZXJzaW9uICVkLCBzaXplID0gJWxkIGJ5dGVzXG4iLAoJCSAgIHZlcnNpb24sIChsb25nKSAoZ29vZHBhZ2VzICogcGFnZXNpemUpKTsKCXdyaXRlX3NpZ25hdHVyZSgodmVyc2lvbiA9PSAwKSA/ICJTV0FQLVNQQUNFIiA6ICJTV0FQU1BBQ0UyIik7CgoJb2Zmc2V0ID0gKCh2ZXJzaW9uID09IDApID8gMCA6IDEwMjQpOwoJaWYgKGxzZWVrKERFViwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gcmV3aW5kIHN3YXAtZGV2aWNlIik7CglpZiAod3JpdGUoREVWLCAoY2hhciAqKSBzaWduYXR1cmVfcGFnZSArIG9mZnNldCwgcGFnZXNpemUgLSBvZmZzZXQpCgkJIT0gcGFnZXNpemUgLSBvZmZzZXQpCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuYWJsZSB0byB3cml0ZSBzaWduYXR1cmUgcGFnZSIpOwoKCS8qCgkgKiBBIHN1YnNlcXVlbnQgc3dhcG9uKCkgd2lsbCBmYWlsIGlmIHRoZSBzaWduYXR1cmUKCSAqIGlzIG5vdCBhY3R1YWxseSBvbiBkaXNrLiAoVGhpcyBpcyBhIGtlcm5lbCBidWcuKQoJICovCglpZiAoZnN5bmMoREVWKSkKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZnN5bmMgZmFpbGVkIik7CglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==