Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkJLyogZm9yIF9JTyAqLwojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkJLyogZm9yIFBBR0VfU0laRSBhbmQgUEFHRV9TSElGVCAqLwoJCQkJLyogd2UgYWxzbyBnZXQgUEFHRV9TSVpFIHZpYSBnZXRwYWdlc2l6ZSgpICovCiNpbmNsdWRlICJidXN5Ym94LmgiCgojaWZuZGVmIF9JTwovKiBwcmUtMS4zLjQ1ICovCnN0YXRpYyBjb25zdCBpbnQgQkxLR0VUU0laRSA9IDB4MTI2MDsKI2Vsc2UKLyogc2FtZSBvbiBpMzg2LCBtNjhrLCBhcm07IGRpZmZlcmVudCBvbiBhbHBoYSwgbWlwcywgc3BhcmMsIHBwYyAqLwojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCiNlbmRpZgoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIGxvbmcgUEFHRVMgPSAwOwpzdGF0aWMgaW50IGNoZWNrID0gMDsKc3RhdGljIGludCBiYWRwYWdlcyA9IDA7CnN0YXRpYyBpbnQgdmVyc2lvbiA9IC0xOwoKI2RlZmluZSBNQUtFX1ZFUlNJT04ocCxxLHIpCSg2NTUzNioocCkgKyAyNTYqKHEpICsgKHIpKQoKLyoKICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHVuaW9uIHN3YXBfaGVhZGVyIHVzZXMgdGhlIGNvbnN0YW50IFBBR0VfU0laRS4KICogVW5mb3J0dW5hdGVseSwgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoaXMgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgbW9kZWwsCiAqIGFuZCBjYW4gb25seSBiZSBmb3VuZCBhdCBydW4gdGltZSAtLSB3ZSB1c2UgZ2V0cGFnZXNpemUoKS4KICovCgpzdGF0aWMgaW50IHBhZ2VzaXplOwpzdGF0aWMgaW50ICpzaWduYXR1cmVfcGFnZTsKCnN0YXRpYyBzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgewoJY2hhciBib290Yml0c1sxMDI0XTsJCS8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLwoJdW5zaWduZWQgaW50IHZlcnNpb247Cgl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlOwoJdW5zaWduZWQgaW50IG5yX2JhZHBhZ2VzOwoJdW5zaWduZWQgaW50IHBhZGRpbmdbMTI1XTsKCXVuc2lnbmVkIGludCBiYWRwYWdlc1sxXTsKfSAqcDsKCnN0YXRpYyB2b2lkIGluaXRfc2lnbmF0dXJlX3BhZ2UoKQp7CglwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CgojaWZkZWYgUEFHRV9TSVpFCglpZiAocGFnZXNpemUgIT0gUEFHRV9TSVpFKQoJCWVycm9yX21zZygiQXNzdW1pbmcgcGFnZXMgb2Ygc2l6ZSAlZCIsIHBhZ2VzaXplKTsKI2VuZGlmCglzaWduYXR1cmVfcGFnZSA9IChpbnQgKikgeG1hbGxvYyhwYWdlc2l6ZSk7CgltZW1zZXQoc2lnbmF0dXJlX3BhZ2UsIDAsIHBhZ2VzaXplKTsKCXAgPSAoc3RydWN0IHN3YXBfaGVhZGVyX3YxICopIHNpZ25hdHVyZV9wYWdlOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV9zaWduYXR1cmUoY2hhciAqc2lnKQp7CgljaGFyICpzcCA9IChjaGFyICopIHNpZ25hdHVyZV9wYWdlOwoKCXN0cm5jcHkoc3AgKyBwYWdlc2l6ZSAtIDEwLCBzaWcsIDEwKTsKfQoKI2RlZmluZSBWMF9NQVhfUEFHRVMJKDggKiAocGFnZXNpemUgLSAxMCkpCi8qIEJlZm9yZSAyLjIuMHByZTkgKi8KI2RlZmluZSBWMV9PTERfTUFYX1BBR0VTCSgoMHg3ZmZmZmZmZiAvIHBhZ2VzaXplKSAtIDEpCi8qIFNpbmNlIDIuMi4wcHJlOToKICAgZXJyb3IgaWYgbnIgb2YgcGFnZXMgPj0gU1dQX09GRlNFVChTV1BfRU5UUlkoMCx+MFVMKSkKICAgd2l0aCB2YXJpYXRpb25zIG9uCgkjZGVmaW5lIFNXUF9FTlRSWSh0eXBlLG9mZnNldCkgKCgodHlwZSkgPDwgMSkgfCAoKG9mZnNldCkgPDwgOCkpCgkjZGVmaW5lIFNXUF9PRkZTRVQoZW50cnkpICgoZW50cnkpID4+IDgpCiAgIG9uIHRoZSB2YXJpb3VzIGFyY2hpdGVjdHVyZXMuIEJlbG93IHRoZSByZXN1bHQgLSB5dWsuCgogICBNYWNoaW5lCXBhZ2VzaXplCVNXUF9FTlRSWQlTV1BfT0ZGU0VUCWJvdW5kKzEJb2xkYm91bmQrMgogICBpMzg2CQkyXjEyCQlvPDw4CQllPj44CQkxPDwyNAkxPDwxOQogICBtaXBzCQkyXjEyCQlvPDwxNQkJZT4+MTUJCTE8PDE3CTE8PDE5CiAgIGFscGhhCTJeMTMJCW88PDQwCQllPj40MAkJMTw8MjQJMTw8MTgKICAgbTY4awkJMl4xMgkJbzw8MTIJCWU+PjEyCQkxPDwyMAkxPDwxOQogICBzcGFyYwkyXnsxMiwxM30JKG8mMHgzZmZmZik8PDkJKGU+PjkpJjB4M2ZmZmYJMTw8MTgJMTw8ezE5LDE4fQogICBzcGFyYzY0CTJeMTMJCW88PDEzCQllPj4xMwkJMTw8NTEJMTw8MTgKICAgcHBjCQkyXjEyCQlvPDw4CQllPj44CQkxPDwyNAkxPDwxOQogICBhcm1vCQkyXnsxMywxNCwxNX0Jbzw8OAkJZT4+OAkJMTw8MjQJMTw8ezE4LDE3LDE2fQogICBhcm12CQkyXjEyCQlvPDw5CQllPj45CQkxPDwyMwkxPDwxOQoKICAgYXNzdW1pbmcgdGhhdCBsb25ncyBoYXZlIDY0IGJpdHMgb24gYWxwaGEgYW5kIHNwYXJjNjQgYW5kIDMyIGJpdHMgZWxzZXdoZXJlLgoKICAgVGhlIGJhZCBwYXJ0IGlzIHRoYXQgd2UgbmVlZCB0byBrbm93IHRoaXMgc2luY2UgdGhlIGtlcm5lbCB3aWxsCiAgIHJlZnVzZSBhIHN3YXAgc3BhY2UgaWYgaXQgaXMgdG9vIGxhcmdlLgoqLwovKiBwYXRjaCBmcm9tIGpqIC0gd2h5IGRvZXMgdGhpcyBkaWZmZXIgZnJvbSB0aGUgYWJvdmU/ICovCiNpZiBkZWZpbmVkKF9fYWxwaGFfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAyNCkgLSAxKQojZWxpZiBkZWZpbmVkKF9fbWlwc19fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDE3KSAtIDEpCiNlbGlmIGRlZmluZWQoX19zcGFyY192OV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgzIDw8IDI5KSAtIDEpCiNlbGlmIGRlZmluZWQoX19zcGFyY19fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKHBhZ2VzaXplID09IDgxOTIgPyAoKDMgPDwgMjkpIC0gMSkgOiAoKDEgPDwgMTgpIC0gMSkpCiNlbHNlCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICBWMV9PTERfTUFYX1BBR0VTCiNlbmRpZgovKiBtYW4gcGFnZSBub3cgc2F5czoKVGhlIG1heGltdW0gdXNlZnVsIHNpemUgb2YgYSBzd2FwIGFyZWEgbm93IGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZS4KSXQgaXMgcm91Z2hseSAyR0Igb24gaTM4NiwgUFBDLCBtNjhrLCBBUk0sIDFHQiBvbiBzcGFyYywgNTEyTUIgb24gbWlwcywKMTI4R0Igb24gYWxwaGEgYW5kIDNUQiBvbiBzcGFyYzY0LgoqLwoKI2RlZmluZSBNQVhfQkFEUEFHRVMJKChwYWdlc2l6ZS0xMDI0LTEyOCpzaXplb2YoaW50KS0xMCkvc2l6ZW9mKGludCkpCgpzdGF0aWMgdm9pZCBiaXRfc2V0KHVuc2lnbmVkIGludCAqYWRkciwgdW5zaWduZWQgaW50IG5yKQp7Cgl1bnNpZ25lZCBpbnQgciwgbTsKCglhZGRyICs9IG5yIC8gKDggKiBzaXplb2YoaW50KSk7CgoJciA9ICphZGRyOwoJbSA9IDEgPDwgKG5yICYgKDggKiBzaXplb2YoaW50KSAtIDEpKTsKCgkqYWRkciA9IHIgfCBtOwp9CgpzdGF0aWMgaW50IGJpdF90ZXN0X2FuZF9jbGVhcih1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByICYgfm07CglyZXR1cm4gKHIgJiBtKSAhPSAwOwp9CgoKc3RhdGljIHZvaWQgcGFnZV9vayhpbnQgcGFnZSkKewoJaWYgKHZlcnNpb24gPT0gMCkKCQliaXRfc2V0KHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKfQoKc3RhdGljIHZvaWQgcGFnZV9iYWQoaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKCWVsc2UgewoJCWlmIChiYWRwYWdlcyA9PSBNQVhfQkFEUEFHRVMpCgkJCWVycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBiYWQgcGFnZXMiKTsKCQlwLT5iYWRwYWdlc1tiYWRwYWdlc10gPSBwYWdlOwoJfQoJYmFkcGFnZXMrKzsKfQoKc3RhdGljIHZvaWQgY2hlY2tfYmxvY2tzKHZvaWQpCnsKCXVuc2lnbmVkIGludCBjdXJyZW50X3BhZ2U7CglpbnQgZG9fc2VlayA9IDE7CgljaGFyICpidWZmZXI7CgoJYnVmZmVyID0geG1hbGxvYyhwYWdlc2l6ZSk7CgljdXJyZW50X3BhZ2UgPSAwOwoJd2hpbGUgKGN1cnJlbnRfcGFnZSA8IFBBR0VTKSB7CgkJaWYgKCFjaGVjaykgewoJCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCWlmIChkb19zZWVrICYmIGxzZWVrKERFViwgY3VycmVudF9wYWdlICogcGFnZXNpemUsIFNFRUtfU0VUKSAhPQoJCQljdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSkKCQkJZXJyb3JfbXNnX2FuZF9kaWUoInNlZWsgZmFpbGVkIGluIGNoZWNrX2Jsb2NrcyIpOwoJCWlmICgoZG9fc2VlayA9IChwYWdlc2l6ZSAhPSByZWFkKERFViwgYnVmZmVyLCBwYWdlc2l6ZSkpKSkgewoJCQlwYWdlX2JhZChjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCX0KCWlmIChiYWRwYWdlcyA9PSAxKQoJCXByaW50Zigib25lIGJhZCBwYWdlXG4iKTsKCWVsc2UgaWYgKGJhZHBhZ2VzID4gMSkKCQlwcmludGYoIiVkIGJhZCBwYWdlc1xuIiwgYmFkcGFnZXMpOwp9CgpzdGF0aWMgbG9uZyB2YWxpZF9vZmZzZXQoaW50IGZkLCBpbnQgb2Zmc2V0KQp7CgljaGFyIGNoOwoKCWlmIChsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDApCgkJcmV0dXJuIDA7CglpZiAocmVhZChmZCwgJmNoLCAxKSA8IDEpCgkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBmaW5kX3NpemUoaW50IGZkKQp7Cgl1bnNpZ25lZCBpbnQgaGlnaCwgbG93OwoKCWxvdyA9IDA7Cglmb3IgKGhpZ2ggPSAxOyBoaWdoID4gMCAmJiB2YWxpZF9vZmZzZXQoZmQsIGhpZ2gpOyBoaWdoICo9IDIpCgkJbG93ID0gaGlnaDsKCXdoaWxlIChsb3cgPCBoaWdoIC0gMSkgewoJCWNvbnN0IGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwoKCQlpZiAodmFsaWRfb2Zmc2V0KGZkLCBtaWQpKQoJCQlsb3cgPSBtaWQ7CgkJZWxzZQoJCQloaWdoID0gbWlkOwoJfQoJcmV0dXJuIChsb3cgKyAxKTsKfQoKLyogcmV0dXJuIHNpemUgaW4gcGFnZXMsIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8Kc3RhdGljIGxvbmcgZ2V0X3NpemUoY29uc3QgY2hhciAqZmlsZSkKewoJaW50IGZkOwoJbG9uZyBzaXplOwoKCWlmICgoZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKSkgPCAwKQoJCXBlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBmaWxlKTsKCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJnNpemUpID49IDApIHsKCQlpbnQgc2VjdG9yc19wZXJfcGFnZSA9IHBhZ2VzaXplIC8gNTEyOwoKCQlzaXplIC89IHNlY3RvcnNfcGVyX3BhZ2U7Cgl9IGVsc2UgewoJCXNpemUgPSBmaW5kX3NpemUoZmQpIC8gcGFnZXNpemU7Cgl9CgljbG9zZShmZCk7CglyZXR1cm4gc2l6ZTsKfQoKaW50IG1rc3dhcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciAqdG1wOwoJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCWludCBzejsKCWludCBtYXhwYWdlczsKCWludCBnb29kcGFnZXM7CglpbnQgb2Zmc2V0OwoJaW50IGZvcmNlID0gMDsKCglpbml0X3NpZ25hdHVyZV9wYWdlKCk7CQkvKiBnZXQgcGFnZXNpemUgKi8KCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKSB7CgkJCQlpbnQgYmxvY2tzX3Blcl9wYWdlID0gcGFnZXNpemUgLyAxMDI0OwoKCQkJCVBBR0VTID0gc3RydG9sKGFyZ3ZbMF0sICZ0bXAsIDApIC8gYmxvY2tzX3Blcl9wYWdlOwoJCQkJaWYgKCp0bXApCgkJCQkJc2hvd191c2FnZSgpOwoJCQl9IGVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UgewoJCQlzd2l0Y2ggKGFyZ3ZbMF1bMV0pIHsKCQkJY2FzZSAnYyc6CgkJCQljaGVjayA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAnZic6CgkJCQlmb3JjZSA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAndic6CgkJCQl2ZXJzaW9uID0gYXRvaShhcmd2WzBdICsgMik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXNob3dfdXNhZ2UoKTsKCQkJfQoJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpIHsKCQllcnJvcl9tc2coImVycm9yOiBOb3doZXJlIHRvIHNldCB1cCBzd2FwIG9uPyIpOwoJCXNob3dfdXNhZ2UoKTsKCX0KCXN6ID0gZ2V0X3NpemUoZGV2aWNlX25hbWUpOwoJaWYgKCFQQUdFUykgewoJCVBBR0VTID0gc3o7Cgl9IGVsc2UgaWYgKFBBR0VTID4gc3ogJiYgIWZvcmNlKSB7CgkJZXJyb3JfbXNnKCJlcnJvcjogc2l6ZSAlbGQgaXMgbGFyZ2VyIHRoYW4gZGV2aWNlIHNpemUgJWQiLAoJCQkJUEFHRVMgKiAocGFnZXNpemUgLyAxMDI0KSwgc3ogKiAocGFnZXNpemUgLyAxMDI0KSk7CgkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCX0KCglpZiAodmVyc2lvbiA9PSAtMSkgewoJCWlmIChQQUdFUyA8PSBWMF9NQVhfUEFHRVMpCgkJCXZlcnNpb24gPSAwOwoJCWVsc2UgaWYgKGdldF9rZXJuZWxfcmV2aXNpb24oKSA8IE1BS0VfVkVSU0lPTigyLCAxLCAxMTcpKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChwYWdlc2l6ZSA8IDIwNDgpCgkJCXZlcnNpb24gPSAwOwoJCWVsc2UKCQkJdmVyc2lvbiA9IDE7Cgl9CglpZiAodmVyc2lvbiAhPSAwICYmIHZlcnNpb24gIT0gMSkgewoJCWVycm9yX21zZygiZXJyb3I6IHVua25vd24gdmVyc2lvbiAlZCIsIHZlcnNpb24pOwoJCXNob3dfdXNhZ2UoKTsKCX0KCWlmIChQQUdFUyA8IDEwKSB7CgkJZXJyb3JfbXNnKCJlcnJvcjogc3dhcCBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICVsZGtCIiwKCQkJCShsb25nKSAoMTAgKiBwYWdlc2l6ZSAvIDEwMjQpKTsKCQlzaG93X3VzYWdlKCk7Cgl9CiNpZiAwCgltYXhwYWdlcyA9ICgodmVyc2lvbiA9PSAwKSA/IFYwX01BWF9QQUdFUyA6IFYxX01BWF9QQUdFUyk7CiNlbHNlCglpZiAoIXZlcnNpb24pCgkJbWF4cGFnZXMgPSBWMF9NQVhfUEFHRVM7CgllbHNlIGlmIChnZXRfa2VybmVsX3JldmlzaW9uKCkgPj0gTUFLRV9WRVJTSU9OKDIsIDIsIDEpKQoJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJZWxzZSB7CgkJbWF4cGFnZXMgPSBWMV9PTERfTUFYX1BBR0VTOwoJCWlmIChtYXhwYWdlcyA+IFYxX01BWF9QQUdFUykKCQkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7Cgl9CiNlbmRpZgoJaWYgKFBBR0VTID4gbWF4cGFnZXMpIHsKCQlQQUdFUyA9IG1heHBhZ2VzOwoJCWVycm9yX21zZygid2FybmluZzogdHJ1bmNhdGluZyBzd2FwIGFyZWEgdG8gJWxka0IiLAoJCQkJUEFHRVMgKiBwYWdlc2l6ZSAvIDEwMjQpOwoJfQoKCURFViA9IG9wZW4oZGV2aWNlX25hbWUsIE9fUkRXUik7CglpZiAoREVWIDwgMCB8fCBmc3RhdChERVYsICZzdGF0YnVmKSA8IDApCgkJcGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGRldmljZV9uYW1lKTsKCWlmICghU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpKQoJCWNoZWNrID0gMDsKCWVsc2UgaWYgKHN0YXRidWYuc3RfcmRldiA9PSAweDAzMDAgfHwgc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDM0MCkKCQllcnJvcl9tc2dfYW5kX2RpZSgiV2lsbCBub3QgdHJ5IHRvIG1ha2Ugc3dhcGRldmljZSBvbiAnJXMnIiwgZGV2aWNlX25hbWUpOwoKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKCFmb3JjZSAmJiB2ZXJzaW9uID09IDApIHsKCQkvKiBEb24ndCBvdmVyd3JpdGUgcGFydGl0aW9uIHRhYmxlIHVubGVzcyBmb3JjZWQgKi8KCQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCQl1bnNpZ25lZCBzaG9ydCAqcSwgc3VtOwoKCQlpZiAocmVhZChERVYsIGJ1ZmZlciwgNTEyKSAhPSA1MTIpCgkJCWVycm9yX21zZ19hbmRfZGllKCJmYXRhbDogZmlyc3QgcGFnZSB1bnJlYWRhYmxlIik7CgkJaWYgKGJ1ZmZlcls1MDhdID09IDB4REEgJiYgYnVmZmVyWzUwOV0gPT0gMHhCRSkgewoJCQlxID0gKHVuc2lnbmVkIHNob3J0ICopIChidWZmZXIgKyA1MTApOwoJCQlmb3IgKHN1bSA9IDA7IHEgPj0gKHVuc2lnbmVkIHNob3J0ICopIGJ1ZmZlcjspCgkJCQlzdW0gXj0gKnEtLTsKCQkJaWYgKCFzdW0pIHsKCQkJCWVycm9yX21zZygiRGV2aWNlICclcycgY29udGFpbnMgYSB2YWxpZCBTdW4gZGlza2xhYmVsLlxuIgoiVGhpcyBwcm9iYWJseSBtZWFucyBjcmVhdGluZyB2MCBzd2FwIHdvdWxkIGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGVcbiIKIk5vIHN3YXAgY3JlYXRlZC4gSWYgeW91IHJlYWxseSB3YW50IHRvIGNyZWF0ZSBzd2FwIHYwIG9uIHRoYXQgZGV2aWNlLCB1c2VcbiIKInRoZSAtZiBvcHRpb24gdG8gZm9yY2UgaXQuIiwgZGV2aWNlX25hbWUpOwoJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCQkJfQoJCX0KCX0KI2VuZGlmCgoJaWYgKHZlcnNpb24gPT0gMCB8fCBjaGVjaykKCQljaGVja19ibG9ja3MoKTsKCWlmICh2ZXJzaW9uID09IDAgJiYgIWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwgMCkpCgkJZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCWlmICh2ZXJzaW9uID09IDEpIHsKCQlwLT52ZXJzaW9uID0gdmVyc2lvbjsKCQlwLT5sYXN0X3BhZ2UgPSBQQUdFUyAtIDE7CgkJcC0+bnJfYmFkcGFnZXMgPSBiYWRwYWdlczsKCX0KCglnb29kcGFnZXMgPSBQQUdFUyAtIGJhZHBhZ2VzIC0gMTsKCWlmIChnb29kcGFnZXMgPD0gMCkKCQllcnJvcl9tc2dfYW5kX2RpZSgiVW5hYmxlIHRvIHNldCB1cCBzd2FwLXNwYWNlOiB1bnJlYWRhYmxlIik7CglwcmludGYoIlNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gJWQsIHNpemUgPSAlbGQgYnl0ZXNcbiIsCgkJICAgdmVyc2lvbiwgKGxvbmcpIChnb29kcGFnZXMgKiBwYWdlc2l6ZSkpOwoJd3JpdGVfc2lnbmF0dXJlKCh2ZXJzaW9uID09IDApID8gIlNXQVAtU1BBQ0UiIDogIlNXQVBTUEFDRTIiKTsKCglvZmZzZXQgPSAoKHZlcnNpb24gPT0gMCkgPyAwIDogMTAyNCk7CglpZiAobHNlZWsoREVWLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpCgkJZXJyb3JfbXNnX2FuZF9kaWUoInVuYWJsZSB0byByZXdpbmQgc3dhcC1kZXZpY2UiKTsKCWlmICh3cml0ZShERVYsIChjaGFyICopIHNpZ25hdHVyZV9wYWdlICsgb2Zmc2V0LCBwYWdlc2l6ZSAtIG9mZnNldCkKCQkhPSBwYWdlc2l6ZSAtIG9mZnNldCkKCQllcnJvcl9tc2dfYW5kX2RpZSgidW5hYmxlIHRvIHdyaXRlIHNpZ25hdHVyZSBwYWdlIik7CgoJLyoKCSAqIEEgc3Vic2VxdWVudCBzd2Fwb24oKSB3aWxsIGZhaWwgaWYgdGhlIHNpZ25hdHVyZQoJICogaXMgbm90IGFjdHVhbGx5IG9uIGRpc2suIChUaGlzIGlzIGEga2VybmVsIGJ1Zy4pCgkgKi8KCWlmIChmc3luYyhERVYpKQoJCWVycm9yX21zZ19hbmRfZGllKCJmc3luYyBmYWlsZWQiKTsKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K