LyoKICogTW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcCBpdCBjb21wYXRpYmxlIGJvdGggd2l0aCBuZXcgYW5kIG9sZCB2aWRlb3RleHQgSU9DVExzIGJ5CiAqIE1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+CiAqCiAqCUNsZWFuZWQgdXAgdG8gdXNlIGV4aXN0aW5nIHZpZGVvZGV2IGludGVyZmFjZSBhbmQgYWxsb3cgdGhlIGlkZWEKICoJb2YgbXVsdGlwbGUgdGVsZXRleHQgZGVjb2RlcnMgb24gdGhlIHZpZGVvNGxpbnV4IGlmYWNlLiBDaGFuZ2VkIGkyYwogKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KICoJeW91IGNhbiBhZGQgYXJiaXRhcnkgbXVsdGlwbGUgdGVsZXRleHQgZGV2aWNlcyB0byBMaW51eCB2aWRlbzRsaW51eAogKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICoKICoJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KICoKICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQogKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCiAqCiAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICoKICoJRGVyaXZlZCBGcm9tCiAqCiAqIHZ0eC5jOgogKiBUaGlzIGlzIGEgbG9hZGFibGUgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZm9yIHZpZGVvdGV4dC1pbnRlcmZhY2VzCiAqIChha2EgdGVsZXRleHQpLiBQbGVhc2UgY2hlY2sgdGhlIE1ha2VmaWxlL1JFQURNRSBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZAogKiBpbnRlcmZhY2VzLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KICoKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCiAqIFVTQS4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvdGV4dC5oPgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CgpNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEdlbmcgPGxpbnV4QE1pY2hhZWxHZW5nLmRlPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNTI0OSBUZWxldGV4dCBkZWNvZGVyIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgojZGVmaW5lIFZUWF9WRVJfTUFKIDEKI2RlZmluZSBWVFhfVkVSX01JTiA4CgoKI2RlZmluZSBOVU1fREFVUyA0CiNkZWZpbmUgTlVNX0JVRlMgOAoKc3RhdGljIGNvbnN0IGludCBkaXNwX21vZGVzWzhdWzNdID0KewoJeyAweDQ2LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYgKi8KCXsgMHg0NiwgMHhjYywgMHhjYyB9LAkvKiBESVNQTk9STSAqLwoJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUyAqLwoJeyAweDQ2LCAweGNjLCAweDQ2IH0sCS8qIERJU1BJTlMgKi8KCXsgMHg0NCwgMHgwMywgMHgwMyB9LAkvKiBESVNQT0ZGLCBpbnRlcmxhY2VkICovCgl7IDB4NDQsIDB4Y2MsIDB4Y2MgfSwJLyogRElTUE5PUk0sIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHgwZiwgMHgwZiB9LAkvKiBESVNQVFJBTlMsIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHhjYywgMHg0NiB9CS8qIERJU1BJTlMsIGludGVybGFjZWQgKi8KfTsKCgoKI2RlZmluZSBQQUdFX1dBSVQgICAgbXNlY3NfdG9famlmZmllcygzMDApCS8qIFRpbWUgYmV0d2VlbiByZXF1ZXN0aW5nIHBhZ2UgYW5kICovCgkJCQkJCS8qIGNoZWNraW5nIHN0YXR1cyBiaXRzICovCiNkZWZpbmUgUEdCVUZfRVhQSVJFIG1zZWNzX3RvX2ppZmZpZXMoMTUwMDApCS8qIFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cmFuc21pdHRpbmcgKi8KCQkJCQkJLyogcGFnZSByZWdhcmRsZXNzIG9mIGluZm9iaXRzICovCnR5cGVkZWYgc3RydWN0IHsKCXU4IHBnYnVmW1ZUWF9WSVJUVUFMU0laRV07CQkvKiBQYWdlLWJ1ZmZlciAqLwoJdTggbGFzdHN0YXRbMTBdOwkJCS8qIExhc3QgdmFsdWUgb2YgaW5mb2JpdHMgZm9yIERBVSAqLwoJdTggc3JlZ3NbN107CQkJCS8qIFBhZ2UtcmVxdWVzdCByZWdpc3RlcnMgKi8KCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwkJCS8qIFRpbWUgd2hlbiBwYWdlIHdpbGwgYmUgZXhwaXJlZCAqLwoJdW5zaWduZWQgY2xyZm91bmQgOiAxOwkJCS8qIFZUWElPQ0NMUkZPVU5EIGhhcyBiZWVuIGNhbGxlZCAqLwoJdW5zaWduZWQgc3RvcHBlZCA6IDE7CQkJLyogVlRYSU9DU1RPUERBVSBoYXMgYmVlbiBjYWxsZWQgKi8KfSB2ZGF1X3Q7CgpzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UKewoJdmRhdV90IHZkYXVbTlVNX0RBVVNdOwkJCS8qIERhdGEgZm9yIHZpcnR1YWwgREFVcyAodGhlIDUyNDkgb25seSBoYXMgb25lICovCgkJCQkJCS8qIHJlYWwgREFVLCBzbyB3ZSBoYXZlIHRvIHNpbXVsYXRlIHNvbWUgbW9yZSkgKi8KCWludCB2dHhfdXNlX2NvdW50OwoJaW50IGlzX3NlYXJjaGluZ1tOVU1fREFVU107CglpbnQgZGlzcF9tb2RlOwoJaW50IHZpcnR1YWxfbW9kZTsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Cgl1bnNpZ25lZCBsb25nIGluX3VzZTsKCXN0cnVjdCBtdXRleCBsb2NrOwp9OwoKCiNkZWZpbmUgQ0NUV1IgMzQJCS8qIEmyQyB3cml0ZS9yZWFkLWFkZHJlc3Mgb2YgdnR4LWNoaXAgKi8KI2RlZmluZSBDQ1RSRCAzNQojZGVmaW5lIE5PQUNLX1JFUEVBVCAxMAkJLyogUmV0cnkgYWNjZXNzIHRoaXMgbWFueSB0aW1lcyBvbiBmYWlsdXJlICovCiNkZWZpbmUgQ0xFQVJfREVMQVkgICBtc2Vjc190b19qaWZmaWVzKDUwKQkvKiBUaW1lIHJlcXVpcmVkIHRvIGNsZWFyIGEgcGFnZSAqLwojZGVmaW5lIFJFQURZX1RJTUVPVVQgbXNlY3NfdG9famlmZmllcygzMCkJLyogVGltZSB0byB3YWl0IGZvciByZWFkeSBzaWduYWwgb2YgSTJDLWJ1cyBpbnRlcmZhY2UgKi8KI2RlZmluZSBJTklUX0RFTEFZIDUwMAkJLyogVGltZSBpbiB1c2VjIHRvIHdhaXQgYXQgaW5pdGlhbGl6YXRpb24gb2YgQ0VBIGludGVyZmFjZSAqLwojZGVmaW5lIFNUQVJUX0RFTEFZIDEwCQkvKiBUaW1lIGluIHVzZWMgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgd3JpdGUtY3ljbGUgKENFQSkgKi8KCiNkZWZpbmUgVlRYX0RFVl9NSU5PUiAwCgpzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGU7CS8qIERlY2xhcmVkIG5lYXIgYm90dG9tICovCgovKgogKglXYWl0IHRoZSBnaXZlbiBudW1iZXIgb2YgamlmZmllcyAoMTBtcykuIFRoaXMgY2FsbHMgdGhlIHNjaGVkdWxlciwgc28gdGhlIGFjdHVhbAogKglkZWxheSBtYXkgYmUgbG9uZ2VyLgogKi8KCnN0YXRpYyB2b2lkIGpkZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQp7CglzaWdzZXRfdCBvbGRibG9ja2VkID0gY3VycmVudC0+YmxvY2tlZDsKCglzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwoJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cgltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGRlbGF5KSk7CgoJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CgljdXJyZW50LT5ibG9ja2VkID0gb2xkYmxvY2tlZDsKCXJlY2FsY19zaWdwZW5kaW5nKCk7CglzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwp9CgoKLyoKICoJSTJDIGludGVyZmFjZXMKICovCgpzdGF0aWMgaW50IGkyY19zZW5kYnVmKHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkKewoJY2hhciBidWZbNjRdOwoKCWJ1ZlswXSA9IHJlZzsKCW1lbWNweShidWYrMSwgZGF0YSwgY291bnQpOwoKCWlmIChpMmNfbWFzdGVyX3NlbmQodC0+Y2xpZW50LCBidWYsIGNvdW50ICsgMSkgPT0gY291bnQgKyAxKQoJCXJldHVybiAwOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IGkyY19zZW5kZGF0YShzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQsIC4uLikKewoJdW5zaWduZWQgY2hhciBidWZbNjRdOwoJaW50IHY7CglpbnQgY3QgPSAwOwoJdmFfbGlzdCBhcmdwOwoJdmFfc3RhcnQoYXJncCx0KTsKCgl3aGlsZSAoKHYgPSB2YV9hcmcoYXJncCwgaW50KSkgIT0gLTEpCgkJYnVmW2N0KytdID0gdjsKCgl2YV9lbmQoYXJncCk7CglyZXR1cm4gaTJjX3NlbmRidWYodCwgYnVmWzBdLCBjdC0xLCBidWYrMSk7Cn0KCi8qIEdldCBjb3VudCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBJwrJDLWRldmljZSBhdCBhZGRyZXNzIGFkciwgc3RvcmUgdGhlbSBpbiBidWYuIFN0YXJ0ICYgc3RvcAogKiBoYW5kc2hha2luZyBpcyBkb25lIGJ5IHRoaXMgcm91dGluZSwgYWNrIHdpbGwgYmUgc2VudCBhZnRlciB0aGUgbGFzdCBieXRlIHRvIGluaGliaXQgZnVydGhlcgogKiBzZW5kaW5nIG9mIGRhdGEuIElmIHVhY2Nlc3MgaXMgJ3RydWUnLCBkYXRhIGlzIHdyaXR0ZW4gdG8gdXNlci1zcGFjZSB3aXRoIHB1dF91c2VyLgogKiBSZXR1cm5zIC0xIGlmIEnCskMtZGV2aWNlIGRpZG4ndCBzZW5kIGFja25vd2xlZGdlLCAwIG90aGVyd2lzZQogKi8KCnN0YXRpYyBpbnQgaTJjX2dldGRhdGEoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCBpbnQgY291bnQsIHU4ICpidWYpCnsKCWlmKGkyY19tYXN0ZXJfcmVjdih0LT5jbGllbnQsIGJ1ZiwgY291bnQpIT1jb3VudCkKCQlyZXR1cm4gLTE7CglyZXR1cm4gMDsKfQoKCi8qCiAqCVN0YW5kYXJkIGNoYXJhY3Rlci1kZXZpY2UtZHJpdmVyIGZ1bmN0aW9ucwogKi8KCnN0YXRpYyBpbnQgZG9fc2FhNTI0OV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKewoJc3RhdGljIGludCB2aXJ0dWFsX21vZGUgPSBmYWxzZTsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVlRYSU9DR0VUSU5GTzoKCXsKCQl2dHhfaW5mb190ICppbmZvID0gYXJnOwoJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBWVFhfVkVSX01BSjsKCQlpbmZvLT52ZXJzaW9uX21pbm9yID0gVlRYX1ZFUl9NSU47CgkJaW5mby0+bnVtcGFnZXMgPSBOVU1fREFVUzsKCQkvKmluZm8tPmNjdF90eXBlID0gQ0NUX1RZUEU7Ki8KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ0NMUlBBR0U6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYsICcgJywgc2l6ZW9mKHQtPnZkYXVbMF0ucGdidWYpKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ0NMUkZPVU5EOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DUEFHRVJFUToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19QQUdFKSkKCQkJcmVxLT5wYWdlID0gMDsKCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX0hPVVIpKQoJCQlyZXEtPmhvdXIgPSAwOwoJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKCQkJcmVxLT5taW51dGUgPSAwOwoJCWlmIChyZXEtPnBhZ2UgPCAwIHx8IHJlcS0+cGFnZSA+IDB4OGZmKSAvKiA3RkYgPz8gKi8KCQkJcmV0dXJuIC1FSU5WQUw7CgkJcmVxLT5wYWdlICY9IDB4N2ZmOwoJCWlmIChyZXEtPmhvdXIgPCAwIHx8IHJlcS0+aG91ciA+IDB4M2YgfHwgcmVxLT5taW51dGUgPCAwIHx8IHJlcS0+bWludXRlID4gMHg3ZiB8fAoJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1swXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfSFVORCA/IDB4MTAgOiAwKSB8IChyZXEtPnBhZ2UgLyAweDEwMCk7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1syXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVU5JVCA/IDB4MTAgOiAwKSB8IChyZXEtPnBhZ2UgJiAweGYpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbM10gPSAocmVxLT5wYWdlbWFzayAmIEhSX1RFTiA/IDB4MTAgOiAwKSB8IChyZXEtPmhvdXIgLyAweDEwKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s1XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1RFTiA/IDB4MTAgOiAwKSB8IChyZXEtPm1pbnV0ZSAvIDB4MTApOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNl0gPSAocmVxLT5wYWdlbWFzayAmIE1JTl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBmYWxzZTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DR0VUU1RBVDoKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJdTggaW5mb2JpdHNbMTBdOwoJCXZ0eF9wYWdlaW5mb190IGluZm87CgkJaW50IGE7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlpZiAoIXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCkgewoJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDIsIDAsIC0xKSB8fAoJCQkJaTJjX3NlbmRidWYodCwgMywgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzKSB8fAoJCQkJaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDI1LCAwLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAtMSkgfHwKCQkJCWkyY19zZW5kZGF0YSh0LCAyLCAwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdIHwgOCwgLTEpIHx8CgkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsIC0xKSkKCQkJCXJldHVybiAtRUlPOwoJCQlqZGVsYXkoUEFHRV9XQUlUKTsKCQkJaWYgKGkyY19nZXRkYXRhKHQsIDEwLCBpbmZvYml0cykpCgkJCQlyZXR1cm4gLUVJTzsKCgkJCWlmICghKGluZm9iaXRzWzhdICYgMHgxMCkgJiYgIShpbmZvYml0c1s3XSAmIDB4ZjApICYmCS8qIGNoZWNrIEZPVU5ELWJpdCAqLwoJCQkJKG1lbWNtcChpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSkgfHwKCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUpKSkKCQkJewkJLyogY2hlY2sgaWYgbmV3IHBhZ2UgYXJyaXZlZCAqLwoJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCAwLCAtMSkgfHwKCQkJCQlpMmNfZ2V0ZGF0YSh0LCBWVFhfUEFHRVNJWkUsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYpKQoJCQkJCXJldHVybiAtRUlPOwoJCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5leHBpcmUgPSBqaWZmaWVzICsgUEdCVUZfRVhQSVJFOwoJCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUsICcgJywgVlRYX1ZJUlRVQUxTSVpFIC0gVlRYX1BBR0VTSVpFKTsKCQkJCWlmICh0LT52aXJ0dWFsX21vZGUpIHsKCQkJCQkvKiBQYWNrZXQgWC8yNCAqLwoJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMCwgMCwgLTEpIHx8CgkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMjAgKiA0MCkpCgkJCQkJCXJldHVybiAtRUlPOwoJCQkJCS8qIFBhY2tldCBYLzI3LzAgKi8KCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjEsIDAsIC0xKSB8fAoJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDE2ICogNDApKQoJCQkJCQlyZXR1cm4gLUVJTzsKCQkJCQkvKiBQYWNrZXQgOC8zMC8wLi4uOC8zMC8xNQoJCQkJCSAqIEZJWE1FOiBBRkFJSywgdGhlIDUyNDkgZG9lcyBoYW1taW5nLWRlY29kaW5nIGZvciBzb21lIGJ5dGVzIGluIHBhY2tldCA4LzMwLAoJCQkJCSAqICAgICAgICBzbyB3ZSBzaG91bGQgdW5kbyB0aGlzIGhlcmUuCgkJCQkJICovCgkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIyLCAwLCAtMSkgfHwKCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMyAqIDQwKSkKCQkJCQkJcmV0dXJuIC1FSU87CgkJCQl9CgkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gZmFsc2U7CgkJCQltZW1jcHkodC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgaW5mb2JpdHMsIHNpemVvZihpbmZvYml0cykpOwoJCQl9IGVsc2UgewoJCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKCQkJfQoJCX0gZWxzZSB7CgkJCW1lbWNweShpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSk7CgkJfQoKCQlpbmZvLnBhZ2VudW0gPSAoKGluZm9iaXRzWzhdIDw8IDgpICYgMHg3MDApIHwgKChpbmZvYml0c1sxXSA8PCA0KSAmIDB4ZjApIHwgKGluZm9iaXRzWzBdICYgMHgwZik7CgkJaWYgKGluZm8ucGFnZW51bSA8IDB4MTAwKQoJCQlpbmZvLnBhZ2VudW0gKz0gMHg4MDA7CgkJaW5mby5ob3VyID0gKChpbmZvYml0c1s1XSA8PCA0KSAmIDB4MzApIHwgKGluZm9iaXRzWzRdICYgMHgwZik7CgkJaW5mby5taW51dGUgPSAoKGluZm9iaXRzWzNdIDw8IDQpICYgMHg3MCkgfCAoaW5mb2JpdHNbMl0gJiAweDBmKTsKCQlpbmZvLmNoYXJzZXQgPSAoKGluZm9iaXRzWzddID4+IDEpICYgNyk7CgkJaW5mby5kZWxldGUgPSAhIShpbmZvYml0c1szXSAmIDgpOwoJCWluZm8uaGVhZGxpbmUgPSAhIShpbmZvYml0c1s1XSAmIDQpOwoJCWluZm8uc3VidGl0bGUgPSAhIShpbmZvYml0c1s1XSAmIDgpOwoJCWluZm8uc3VwcF9oZWFkZXIgPSAhIShpbmZvYml0c1s2XSAmIDEpOwoJCWluZm8udXBkYXRlID0gISEoaW5mb2JpdHNbNl0gJiAyKTsKCQlpbmZvLmludGVyX3NlcSA9ICEhKGluZm9iaXRzWzZdICYgNCk7CgkJaW5mby5kaXNfZGlzcCA9ICEhKGluZm9iaXRzWzZdICYgOCk7CgkJaW5mby5zZXJpYWwgPSAhIShpbmZvYml0c1s3XSAmIDEpOwoJCWluZm8ubm90Zm91bmQgPSAhIShpbmZvYml0c1s4XSAmIDB4MTApOwoJCWluZm8ucGJsZiA9ICEhKGluZm9iaXRzWzldICYgMHgyMCk7CgkJaW5mby5oYW1taW5nID0gMDsKCQlmb3IgKGEgPSAwOyBhIDw9IDc7IGErKykgewoJCQlpZiAoaW5mb2JpdHNbYV0gJiAweGYwKSB7CgkJCQlpbmZvLmhhbW1pbmcgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKHQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQpCgkJCWluZm8ubm90Zm91bmQgPSAxOwoJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIsICZpbmZvLCBzaXplb2YodnR4X3BhZ2VpbmZvX3QpKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKCFpbmZvLmhhbW1pbmcgJiYgIWluZm8ubm90Zm91bmQpCgkJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IGZhbHNlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DR0VUUEFHRToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgkJaW50IHN0YXJ0LCBlbmQ7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTIHx8IHJlcS0+c3RhcnQgPCAwIHx8CgkJCXJlcS0+c3RhcnQgPiByZXEtPmVuZCB8fCByZXEtPmVuZCA+PSAodmlydHVhbF9tb2RlID8gVlRYX1ZJUlRVQUxTSVpFIDogVlRYX1BBR0VTSVpFKSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJnQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWZbcmVxLT5zdGFydF0sIHJlcS0+ZW5kIC0gcmVxLT5zdGFydCArIDEpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCgkJIC8qCgkJICAqCUFsd2F5cyByZWFkIHRoZSB0aW1lIGRpcmVjdGx5IGZyb20gU0FBNTI0OQoJCSAgKi8KCgkJaWYgKHJlcS0+c3RhcnQgPD0gMzkgJiYgcmVxLT5lbmQgPj0gMzIpIHsKCQkJaW50IGxlbjsKCQkJY2hhciBidWZbMTZdOwoJCQlzdGFydCA9IG1heChyZXEtPnN0YXJ0LCAzMik7CgkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzkpOwoJCQlsZW4gPSBlbmQgLSBzdGFydCArIDE7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAoJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIgKyBzdGFydCAtIHJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQkvKiBJbnNlcnQgdGhlIGN1cnJlbnQgaGVhZGVyIGlmIERBVSBpcyBzdGlsbCBzZWFyY2hpbmcgZm9yIGEgcGFnZSAqLwoJCWlmIChyZXEtPnN0YXJ0IDw9IDMxICYmIHJlcS0+ZW5kID49IDcgJiYgdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdKSB7CgkJCWNoYXIgYnVmWzMyXTsKCQkJaW50IGxlbjsKCgkJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIDcpOwoJCQllbmQgPSBtaW4ocmVxLT5lbmQsIDMxKTsKCQkJbGVuID0gZW5kIC0gc3RhcnQgKyAxOwoJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIHN0YXJ0LCAtMSkgfHwKCQkJCWkyY19nZXRkYXRhKHQsIGxlbiwgYnVmKSkKCQkJCXJldHVybiAtRUlPOwoJCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyICsgc3RhcnQgLSByZXEtPnN0YXJ0LCBidWYsIGxlbikpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NTVE9QREFVOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gZmFsc2U7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NQVVRQQUdFOgoJY2FzZSBWVFhJT0NTRVRESVNQOgoJY2FzZSBWVFhJT0NQVVRTVEFUOgoJCXJldHVybiAwOwoKCWNhc2UgVlRYSU9DQ0xSQ0FDSEU6Cgl7CgkJaWYgKGkyY19zZW5kZGF0YSh0LCAwLCBOVU1fREFVUywgMCwgOCwgLTEpIHx8IGkyY19zZW5kZGF0YSh0LCAxMSwKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKCQkJLTEpKQoJCQlyZXR1cm4gLUVJTzsKCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDMsIDB4MjAsIC0xKSkKCQkJcmV0dXJuIC1FSU87CgkJamRlbGF5KDEwICogQ0xFQVJfREVMQVkpOwkJCS8qIEkgaGF2ZSBubyBpZGVhIGhvdyBsb25nIHdlIGhhdmUgdG8gd2FpdCBoZXJlICovCgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NTRVRWSVJUOgoJewoJCS8qIFRoZSBTQUE1MjQ5IGhhcyB2aXJ0dWFsLXJvdyByZWNlcHRpb24gdHVybmVkIG9uIGFsd2F5cyAqLwoJCXQtPnZpcnR1YWxfbW9kZSA9IChpbnQpKGxvbmcpYXJnOwoJCXJldHVybiAwOwoJfQoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCi8qCiAqIFRyYW5zbGF0ZXMgb2xkIHZ0eCBJT0NUTHMgdG8gbmV3IG9uZXMKICoKICogVGhpcyBrZWVwcyBuZXcga2VybmVsIHZlcnNpb25zIGNvbXBhdGlibGUgd2l0aCBvbGQgdXNlcnNwYWNlIHByb2dyYW1zLgogKi8Kc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdnR4X2ZpeF9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQpCnsKCXN3aXRjaCAoY21kKSB7CgljYXNlIFZUWElPQ0dFVElORk9fT0xEOgoJCWNtZCA9IFZUWElPQ0dFVElORk87CgkJYnJlYWs7CgljYXNlIFZUWElPQ0NMUlBBR0VfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUlBBR0U7CgkJYnJlYWs7CgljYXNlIFZUWElPQ0NMUkZPVU5EX09MRDoKCQljbWQgPSBWVFhJT0NDTFJGT1VORDsKCQlicmVhazsKCWNhc2UgVlRYSU9DUEFHRVJFUV9PTEQ6CgkJY21kID0gVlRYSU9DUEFHRVJFUTsKCQlicmVhazsKCWNhc2UgVlRYSU9DR0VUU1RBVF9PTEQ6CgkJY21kID0gVlRYSU9DR0VUU1RBVDsKCQlicmVhazsKCWNhc2UgVlRYSU9DR0VUUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DR0VUUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DU1RPUERBVV9PTEQ6CgkJY21kID0gVlRYSU9DU1RPUERBVTsKCQlicmVhazsKCWNhc2UgVlRYSU9DUFVUUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DUFVUUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DU0VURElTUF9PTEQ6CgkJY21kID0gVlRYSU9DU0VURElTUDsKCQlicmVhazsKCWNhc2UgVlRYSU9DUFVUU1RBVF9PTEQ6CgkJY21kID0gVlRYSU9DUFVUU1RBVDsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSQ0FDSEVfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUkNBQ0hFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTRVRWSVJUX09MRDoKCQljbWQgPSBWVFhJT0NTRVRWSVJUOwoJCWJyZWFrOwoJfQoJcmV0dXJuIGNtZDsKfQoKLyoKICoJSGFuZGxlIHRoZSBsb2NraW5nCiAqLwoKc3RhdGljIGludCBzYWE1MjQ5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAoJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CglpbnQgZXJyOwoKCWNtZCA9IHZ0eF9maXhfY29tbWFuZChjbWQpOwoJbXV0ZXhfbG9jaygmdC0+bG9jayk7CgllcnIgPSB2aWRlb191c2VyY29weShpbm9kZSxmaWxlLGNtZCxhcmcsZG9fc2FhNTI0OV9pb2N0bCk7CgltdXRleF91bmxvY2soJnQtPmxvY2spOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBzYWE1MjQ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CglpbnQgcGdidWY7CgoJaWYgKHQtPmNsaWVudCA9PSBOVUxMKQoJCXJldHVybiAtRU5PREVWOwoKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ0LT5pbl91c2UpKQoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGkyY19zZW5kZGF0YSh0LCAwLCAwLCAtMSkgfHwgLyogU2VsZWN0IFIxMSAqLwoJCS8qIFR1cm4gb2ZmIHBhcml0eSBjaGVja3MgKHdlIGRvIHRoaXMgb3Vyc2VsdmVzKSAqLwoJCWkyY19zZW5kZGF0YSh0LCAxLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMF0sIDAsIC0xKSB8fAoJCS8qIERpc3BsYXkgVFYtcGljdHVyZSwgbm8gdmlydHVhbCByb3dzICovCgkJaTJjX3NlbmRkYXRhKHQsIDQsIE5VTV9EQVVTLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMV0sIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVsyXSwgNywgLTEpKQoJCS8qIFNldCBkaXNwbGF5IHRvIHBhZ2UgNCAqLwoJewoJCWNsZWFyX2JpdCgwLCAmdC0+aW5fdXNlKTsKCQlyZXR1cm4gLUVJTzsKCX0KCglmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgewoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ubGFzdHN0YXQsIDAsIHNpemVvZih0LT52ZGF1WzBdLmxhc3RzdGF0KSk7CgkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJdC0+dmRhdVtwZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IGZhbHNlOwoJfQoJdC0+dmlydHVhbF9tb2RlID0gZmFsc2U7CglyZXR1cm4gMDsKfQoKCgpzdGF0aWMgaW50IHNhYTUyNDlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCglpMmNfc2VuZGRhdGEodCwgMSwgMHgyMCwgLTEpOwkJLyogVHVybiBvZmYgQ0NUICovCglpMmNfc2VuZGRhdGEodCwgNSwgMywgMywgLTEpOwkJLyogVHVybiBvZmYgVFYtZGlzcGxheSAqLwoJY2xlYXJfYml0KDAsICZ0LT5pbl91c2UpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNhYV9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gc2FhNTI0OV9vcGVuLAoJLnJlbGVhc2UgICAgICAgCT0gc2FhNTI0OV9yZWxlYXNlLAoJLmlvY3RsICAgICAgICAgID0gc2FhNTI0OV9pb2N0bCwKI2lmZGVmIENPTkZJR19DT01QQVQKCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiNlbmRpZgoJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAp9OwoKc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlID0KewoJLm5hbWUJCT0gInNhYTUyNDkiLAoJLmZvcHMgICAgICAgICAgID0gJnNhYV9mb3BzLAoJLnJlbGVhc2UgCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCn07CgovKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDIyID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CgpJMkNfQ0xJRU5UX0lOU01PRDsKCnN0YXRpYyBpbnQgc2FhNTI0OV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAoJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCnsKCWludCBwZ2J1ZjsKCWludCBlcnI7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZDsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdDsKCgl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAoJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvVGV4dCB2ZXJzaW9uICVkLiVkXG4iLAoJCQlWVFhfVkVSX01BSiwgVlRYX1ZFUl9NSU4pOwoJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CglpZiAodCA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoJbXV0ZXhfaW5pdCgmdC0+bG9jayk7CgoJLyogTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZSAqLwoJdmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CglpZiAodmQgPT0gTlVMTCkgewoJCWtmcmVlKGNsaWVudCk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB2ZCk7CgltZW1jcHkodmQsICZzYWFfdGVtcGxhdGUsIHNpemVvZigqdmQpKTsKCglmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgewoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ubGFzdHN0YXQsIDAsIHNpemVvZih0LT52ZGF1WzBdLmxhc3RzdGF0KSk7CgkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJdC0+dmRhdVtwZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IGZhbHNlOwoJfQoJdmlkZW9fc2V0X2RydmRhdGEodmQsIHQpOwoKCS8qIFJlZ2lzdGVyIGl0ICovCgllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmQsIFZGTF9UWVBFX1ZUWCwgLTEpOwoJaWYgKGVyciA8IDApIHsKCQlrZnJlZSh0KTsKCQlrZnJlZSh2ZCk7CgkJcmV0dXJuIGVycjsKCX0KCXQtPmNsaWVudCA9IGNsaWVudDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNhYTUyNDlfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CgoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmQpOwoJa2ZyZWUodmlkZW9fZ2V0X2RydmRhdGEodmQpKTsKCWtmcmVlKHZkKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2FhNTI0OV9pZFtdID0gewoJeyAic2FhNTI0OSIsIDAgfSwKCXsgfQp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2FhNTI0OV9pZCk7CgpzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CgkubmFtZSA9ICJzYWE1MjQ5IiwKCS5kcml2ZXJpZCA9IEkyQ19EUklWRVJJRF9TQUE1MjQ5LAoJLnByb2JlID0gc2FhNTI0OV9wcm9iZSwKCS5yZW1vdmUgPSBzYWE1MjQ5X3JlbW92ZSwKCS5pZF90YWJsZSA9IHNhYTUyNDlfaWQsCn07Cg==