LyoKICogTW9kaWZpZWQgaW4gb3JkZXIgdG8ga2VlcCBpdCBjb21wYXRpYmxlIGJvdGggd2l0aCBuZXcgYW5kIG9sZCB2aWRlb3RleHQgSU9DVExzIGJ5CiAqIE1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+CiAqCiAqCUNsZWFuZWQgdXAgdG8gdXNlIGV4aXN0aW5nIHZpZGVvZGV2IGludGVyZmFjZSBhbmQgYWxsb3cgdGhlIGlkZWEKICoJb2YgbXVsdGlwbGUgdGVsZXRleHQgZGVjb2RlcnMgb24gdGhlIHZpZGVvNGxpbnV4IGlmYWNlLiBDaGFuZ2VkIGkyYwogKgl0byBjb3ZlciBhZGRyZXNzaW5nIGNsYXNoZXMgb24gZGV2aWNlIGJ1c3Nlcy4gSXQncyBhbHNvIHJlYnVpbHQgc28KICoJeW91IGNhbiBhZGQgYXJiaXRhcnkgbXVsdGlwbGUgdGVsZXRleHQgZGV2aWNlcyB0byBMaW51eCB2aWRlbzRsaW51eAogKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICoKICoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICoKICoJVGhlIG9yaWdpbmFsIGRyaXZlciB3YXMgaGVhdmlseSBtb2RpZmllZCB0byBtYXRjaCB0aGUgaTJjIGludGVyZmFjZQogKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCiAqCiAqCUNvcHlyaWdodCAoYykgMTk5OCBSaWNoYXJkIEd1ZW50aGVyIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICoKICoJRGVyaXZlZCBGcm9tCiAqCiAqIHZ0eC5jOgogKiBUaGlzIGlzIGEgbG9hZGFibGUgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZm9yIHZpZGVvdGV4dC1pbnRlcmZhY2VzCiAqIChha2EgdGVsZXRleHQpLiBQbGVhc2UgY2hlY2sgdGhlIE1ha2VmaWxlL1JFQURNRSBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZAogKiBpbnRlcmZhY2VzLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KICoKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCiAqIFVTQS4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi5oPgoKTU9EVUxFX0FVVEhPUigiTWljaGFlbCBHZW5nIDxsaW51eEBNaWNoYWVsR2VuZy5kZT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTUyNDkgVGVsZXRleHQgZGVjb2RlciBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKCiNkZWZpbmUgVlRYX1ZFUl9NQUogMQojZGVmaW5lIFZUWF9WRVJfTUlOIDgKCgojZGVmaW5lIE5VTV9EQVVTIDQKI2RlZmluZSBOVU1fQlVGUyA4CgpzdGF0aWMgY29uc3QgaW50IGRpc3BfbW9kZXNbOF1bM10gPQp7Cgl7IDB4NDYsIDB4MDMsIDB4MDMgfSwJLyogRElTUE9GRiAqLwoJeyAweDQ2LCAweGNjLCAweGNjIH0sCS8qIERJU1BOT1JNICovCgl7IDB4NDQsIDB4MGYsIDB4MGYgfSwJLyogRElTUFRSQU5TICovCgl7IDB4NDYsIDB4Y2MsIDB4NDYgfSwJLyogRElTUElOUyAqLwoJeyAweDQ0LCAweDAzLCAweDAzIH0sCS8qIERJU1BPRkYsIGludGVybGFjZWQgKi8KCXsgMHg0NCwgMHhjYywgMHhjYyB9LAkvKiBESVNQTk9STSwgaW50ZXJsYWNlZCAqLwoJeyAweDQ0LCAweDBmLCAweDBmIH0sCS8qIERJU1BUUkFOUywgaW50ZXJsYWNlZCAqLwoJeyAweDQ0LCAweGNjLCAweDQ2IH0JLyogRElTUElOUywgaW50ZXJsYWNlZCAqLwp9OwoKCgojZGVmaW5lIFBBR0VfV0FJVCAgICBtc2Vjc190b19qaWZmaWVzKDMwMCkJLyogVGltZSBiZXR3ZWVuIHJlcXVlc3RpbmcgcGFnZSBhbmQgKi8KCQkJCQkJLyogY2hlY2tpbmcgc3RhdHVzIGJpdHMgKi8KI2RlZmluZSBQR0JVRl9FWFBJUkUgbXNlY3NfdG9famlmZmllcygxNTAwMCkJLyogVGltZSB0byB3YWl0IGJlZm9yZSByZXRyYW5zbWl0dGluZyAqLwoJCQkJCQkvKiBwYWdlIHJlZ2FyZGxlc3Mgb2YgaW5mb2JpdHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJdTggcGdidWZbVlRYX1ZJUlRVQUxTSVpFXTsJCS8qIFBhZ2UtYnVmZmVyICovCgl1OCBsYXN0c3RhdFsxMF07CQkJLyogTGFzdCB2YWx1ZSBvZiBpbmZvYml0cyBmb3IgREFVICovCgl1OCBzcmVnc1s3XTsJCQkJLyogUGFnZS1yZXF1ZXN0IHJlZ2lzdGVycyAqLwoJdW5zaWduZWQgbG9uZyBleHBpcmU7CQkJLyogVGltZSB3aGVuIHBhZ2Ugd2lsbCBiZSBleHBpcmVkICovCgl1bnNpZ25lZCBjbHJmb3VuZCA6IDE7CQkJLyogVlRYSU9DQ0xSRk9VTkQgaGFzIGJlZW4gY2FsbGVkICovCgl1bnNpZ25lZCBzdG9wcGVkIDogMTsJCQkvKiBWVFhJT0NTVE9QREFVIGhhcyBiZWVuIGNhbGxlZCAqLwp9IHZkYXVfdDsKCnN0cnVjdCBzYWE1MjQ5X2RldmljZQp7CglzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CglzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OwoJdmRhdV90IHZkYXVbTlVNX0RBVVNdOwkJCS8qIERhdGEgZm9yIHZpcnR1YWwgREFVcyAodGhlIDUyNDkgb25seSBoYXMgb25lICovCgkJCQkJCS8qIHJlYWwgREFVLCBzbyB3ZSBoYXZlIHRvIHNpbXVsYXRlIHNvbWUgbW9yZSkgKi8KCWludCB2dHhfdXNlX2NvdW50OwoJaW50IGlzX3NlYXJjaGluZ1tOVU1fREFVU107CglpbnQgZGlzcF9tb2RlOwoJaW50IHZpcnR1YWxfbW9kZTsKCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwoJc3RydWN0IG11dGV4IGxvY2s7Cn07CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdG9fZGV2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCnsKCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzYWE1MjQ5X2RldmljZSwgc2QpOwp9CgoKI2RlZmluZSBDQ1RXUiAzNAkJLyogSbJDIHdyaXRlL3JlYWQtYWRkcmVzcyBvZiB2dHgtY2hpcCAqLwojZGVmaW5lIENDVFJEIDM1CiNkZWZpbmUgTk9BQ0tfUkVQRUFUIDEwCQkvKiBSZXRyeSBhY2Nlc3MgdGhpcyBtYW55IHRpbWVzIG9uIGZhaWx1cmUgKi8KI2RlZmluZSBDTEVBUl9ERUxBWSAgIG1zZWNzX3RvX2ppZmZpZXMoNTApCS8qIFRpbWUgcmVxdWlyZWQgdG8gY2xlYXIgYSBwYWdlICovCiNkZWZpbmUgUkVBRFlfVElNRU9VVCBtc2Vjc190b19qaWZmaWVzKDMwKQkvKiBUaW1lIHRvIHdhaXQgZm9yIHJlYWR5IHNpZ25hbCBvZiBJMkMtYnVzIGludGVyZmFjZSAqLwojZGVmaW5lIElOSVRfREVMQVkgNTAwCQkvKiBUaW1lIGluIHVzZWMgdG8gd2FpdCBhdCBpbml0aWFsaXphdGlvbiBvZiBDRUEgaW50ZXJmYWNlICovCiNkZWZpbmUgU1RBUlRfREVMQVkgMTAJCS8qIFRpbWUgaW4gdXNlYyB0byB3YWl0IGJlZm9yZSBzdGFydGluZyB3cml0ZS1jeWNsZSAoQ0VBKSAqLwoKI2RlZmluZSBWVFhfREVWX01JTk9SIDAKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZTsJLyogRGVjbGFyZWQgbmVhciBib3R0b20gKi8KCi8qCiAqCVdhaXQgdGhlIGdpdmVuIG51bWJlciBvZiBqaWZmaWVzICgxMG1zKS4gVGhpcyBjYWxscyB0aGUgc2NoZWR1bGVyLCBzbyB0aGUgYWN0dWFsCiAqCWRlbGF5IG1heSBiZSBsb25nZXIuCiAqLwoKc3RhdGljIHZvaWQgamRlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCnsKCXNpZ3NldF90IG9sZGJsb2NrZWQgPSBjdXJyZW50LT5ibG9ja2VkOwoKCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwoJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CglyZWNhbGNfc2lncGVuZGluZygpOwoJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoZGVsYXkpKTsKCglzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRibG9ja2VkOwoJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cn0KCgovKgogKglJMkMgaW50ZXJmYWNlcwogKi8KCnN0YXRpYyBpbnQgaTJjX3NlbmRidWYoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCBpbnQgcmVnLCBpbnQgY291bnQsIHU4ICpkYXRhKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmdC0+c2QpOwoJY2hhciBidWZbNjRdOwoKCWJ1ZlswXSA9IHJlZzsKCW1lbWNweShidWYrMSwgZGF0YSwgY291bnQpOwoKCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIGNvdW50ICsgMSkgPT0gY291bnQgKyAxKQoJCXJldHVybiAwOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IGkyY19zZW5kZGF0YShzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQsIC4uLikKewoJdW5zaWduZWQgY2hhciBidWZbNjRdOwoJaW50IHY7CglpbnQgY3QgPSAwOwoJdmFfbGlzdCBhcmdwOwoJdmFfc3RhcnQoYXJncCx0KTsKCgl3aGlsZSAoKHYgPSB2YV9hcmcoYXJncCwgaW50KSkgIT0gLTEpCgkJYnVmW2N0KytdID0gdjsKCgl2YV9lbmQoYXJncCk7CglyZXR1cm4gaTJjX3NlbmRidWYodCwgYnVmWzBdLCBjdC0xLCBidWYrMSk7Cn0KCi8qIEdldCBjb3VudCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBJwrJDLWRldmljZSBhdCBhZGRyZXNzIGFkciwgc3RvcmUgdGhlbSBpbiBidWYuIFN0YXJ0ICYgc3RvcAogKiBoYW5kc2hha2luZyBpcyBkb25lIGJ5IHRoaXMgcm91dGluZSwgYWNrIHdpbGwgYmUgc2VudCBhZnRlciB0aGUgbGFzdCBieXRlIHRvIGluaGliaXQgZnVydGhlcgogKiBzZW5kaW5nIG9mIGRhdGEuIElmIHVhY2Nlc3MgaXMgJ3RydWUnLCBkYXRhIGlzIHdyaXR0ZW4gdG8gdXNlci1zcGFjZSB3aXRoIHB1dF91c2VyLgogKiBSZXR1cm5zIC0xIGlmIEnCskMtZGV2aWNlIGRpZG4ndCBzZW5kIGFja25vd2xlZGdlLCAwIG90aGVyd2lzZQogKi8KCnN0YXRpYyBpbnQgaTJjX2dldGRhdGEoc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0LCBpbnQgY291bnQsIHU4ICpidWYpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZ0LT5zZCk7CgoJaWYgKGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgY291bnQpICE9IGNvdW50KQoJCXJldHVybiAtMTsKCXJldHVybiAwOwp9CgoKLyoKICoJU3RhbmRhcmQgY2hhcmFjdGVyLWRldmljZS1kcml2ZXIgZnVuY3Rpb25zCiAqLwoKc3RhdGljIGxvbmcgZG9fc2FhNTI0OV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQp7CglzdGF0aWMgaW50IHZpcnR1YWxfbW9kZSA9IGZhbHNlOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBWVFhJT0NHRVRJTkZPOgoJewoJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CgkJaW5mby0+dmVyc2lvbl9tYWpvciA9IFZUWF9WRVJfTUFKOwoJCWluZm8tPnZlcnNpb25fbWlub3IgPSBWVFhfVkVSX01JTjsKCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOwoJCS8qaW5mby0+Y2N0X3R5cGUgPSBDQ1RfVFlQRTsqLwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DQ0xSUEFHRToKCXsKCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CgoJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXJldHVybiAwOwoJfQoKCWNhc2UgVlRYSU9DQ0xSRk9VTkQ6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NQQUdFUkVROgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX1BBR0UpKQoJCQlyZXEtPnBhZ2UgPSAwOwoJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfSE9VUikpCgkJCXJlcS0+aG91ciA9IDA7CgkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19NSU5VVEUpKQoJCQlyZXEtPm1pbnV0ZSA9IDA7CgkJaWYgKHJlcS0+cGFnZSA8IDAgfHwgcmVxLT5wYWdlID4gMHg4ZmYpIC8qIDdGRiA/PyAqLwoJCQlyZXR1cm4gLUVJTlZBTDsKCQlyZXEtPnBhZ2UgJj0gMHg3ZmY7CgkJaWYgKHJlcS0+aG91ciA8IDAgfHwgcmVxLT5ob3VyID4gMHgzZiB8fCByZXEtPm1pbnV0ZSA8IDAgfHwgcmVxLT5taW51dGUgPiAweDdmIHx8CgkJCXJlcS0+cGFnZW1hc2sgPCAwIHx8IHJlcS0+cGFnZW1hc2sgPj0gUEdNQVNLX01BWCB8fCByZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19IVU5EID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAvIDB4MTAwKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzFdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19URU4gPyAweDEwIDogMCkgfCAoKHJlcS0+cGFnZSAvIDB4MTApICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzJdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAmIDB4Zik7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1szXSA9IChyZXEtPnBhZ2VtYXNrICYgSFJfVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAvIDB4MTApOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNF0gPSAocmVxLT5wYWdlbWFzayAmIEhSX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5ob3VyICYgMHhmKTsKCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzVdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlIC8gMHgxMCk7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s2XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgJiAweGYpOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3RvcHBlZCA9IGZhbHNlOwoJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwoJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IHRydWU7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NHRVRTVEFUOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQl1OCBpbmZvYml0c1sxMF07CgkJdnR4X3BhZ2VpbmZvX3QgaW5mbzsKCQlpbnQgYTsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCgkJCXJldHVybiAtRUlOVkFMOwoJCWlmICghdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkKSB7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgMiwgMCwgLTEpIHx8CgkJCQlpMmNfc2VuZGJ1Zih0LCAzLCBzaXplb2YodC0+dmRhdVswXS5zcmVncyksIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3MpIHx8CgkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsIC0xKSB8fAoJCQkJaTJjX3NlbmRkYXRhKHQsIDIsIDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMF0gfCA4LCAtMSkgfHwKCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgLTEpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWpkZWxheShQQUdFX1dBSVQpOwoJCQlpZiAoaTJjX2dldGRhdGEodCwgMTAsIGluZm9iaXRzKSkKCQkJCXJldHVybiAtRUlPOwoKCQkJaWYgKCEoaW5mb2JpdHNbOF0gJiAweDEwKSAmJiAhKGluZm9iaXRzWzddICYgMHhmMCkgJiYJLyogY2hlY2sgRk9VTkQtYml0ICovCgkJCQkobWVtY21wKGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKSB8fAoJCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSkpKQoJCQl7CQkvKiBjaGVjayBpZiBuZXcgcGFnZSBhcnJpdmVkICovCgkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIDAsIC0xKSB8fAoJCQkJCWkyY19nZXRkYXRhKHQsIFZUWF9QQUdFU0laRSwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZikpCgkJCQkJcmV0dXJuIC1FSU87CgkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSA9IGppZmZpZXMgKyBQR0JVRl9FWFBJUkU7CgkJCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSwgJyAnLCBWVFhfVklSVFVBTFNJWkUgLSBWVFhfUEFHRVNJWkUpOwoJCQkJaWYgKHQtPnZpcnR1YWxfbW9kZSkgewoJCQkJCS8qIFBhY2tldCBYLzI0ICovCgkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIwLCAwLCAtMSkgfHwKCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMCAqIDQwKSkKCQkJCQkJcmV0dXJuIC1FSU87CgkJCQkJLyogUGFja2V0IFgvMjcvMCAqLwoJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMSwgMCwgLTEpIHx8CgkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMTYgKiA0MCkpCgkJCQkJCXJldHVybiAtRUlPOwoJCQkJCS8qIFBhY2tldCA4LzMwLzAuLi44LzMwLzE1CgkJCQkJICogRklYTUU6IEFGQUlLLCB0aGUgNTI0OSBkb2VzIGhhbW1pbmctZGVjb2RpbmcgZm9yIHNvbWUgYnl0ZXMgaW4gcGFja2V0IDgvMzAsCgkJCQkJICogICAgICAgIHNvIHdlIHNob3VsZCB1bmRvIHRoaXMgaGVyZS4KCQkJCQkgKi8KCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjIsIDAsIC0xKSB8fAoJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDIzICogNDApKQoJCQkJCQlyZXR1cm4gLUVJTzsKCQkJCX0KCQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSBmYWxzZTsKCQkJCW1lbWNweSh0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBpbmZvYml0cywgc2l6ZW9mKGluZm9iaXRzKSk7CgkJCX0gZWxzZSB7CgkJCQltZW1jcHkoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpOwoJCQl9CgkJfSBlbHNlIHsKCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKCQl9CgoJCWluZm8ucGFnZW51bSA9ICgoaW5mb2JpdHNbOF0gPDwgOCkgJiAweDcwMCkgfCAoKGluZm9iaXRzWzFdIDw8IDQpICYgMHhmMCkgfCAoaW5mb2JpdHNbMF0gJiAweDBmKTsKCQlpZiAoaW5mby5wYWdlbnVtIDwgMHgxMDApCgkJCWluZm8ucGFnZW51bSArPSAweDgwMDsKCQlpbmZvLmhvdXIgPSAoKGluZm9iaXRzWzVdIDw8IDQpICYgMHgzMCkgfCAoaW5mb2JpdHNbNF0gJiAweDBmKTsKCQlpbmZvLm1pbnV0ZSA9ICgoaW5mb2JpdHNbM10gPDwgNCkgJiAweDcwKSB8IChpbmZvYml0c1syXSAmIDB4MGYpOwoJCWluZm8uY2hhcnNldCA9ICgoaW5mb2JpdHNbN10gPj4gMSkgJiA3KTsKCQlpbmZvLmRlbGV0ZSA9ICEhKGluZm9iaXRzWzNdICYgOCk7CgkJaW5mby5oZWFkbGluZSA9ICEhKGluZm9iaXRzWzVdICYgNCk7CgkJaW5mby5zdWJ0aXRsZSA9ICEhKGluZm9iaXRzWzVdICYgOCk7CgkJaW5mby5zdXBwX2hlYWRlciA9ICEhKGluZm9iaXRzWzZdICYgMSk7CgkJaW5mby51cGRhdGUgPSAhIShpbmZvYml0c1s2XSAmIDIpOwoJCWluZm8uaW50ZXJfc2VxID0gISEoaW5mb2JpdHNbNl0gJiA0KTsKCQlpbmZvLmRpc19kaXNwID0gISEoaW5mb2JpdHNbNl0gJiA4KTsKCQlpbmZvLnNlcmlhbCA9ICEhKGluZm9iaXRzWzddICYgMSk7CgkJaW5mby5ub3Rmb3VuZCA9ICEhKGluZm9iaXRzWzhdICYgMHgxMCk7CgkJaW5mby5wYmxmID0gISEoaW5mb2JpdHNbOV0gJiAweDIwKTsKCQlpbmZvLmhhbW1pbmcgPSAwOwoJCWZvciAoYSA9IDA7IGEgPD0gNzsgYSsrKSB7CgkJCWlmIChpbmZvYml0c1thXSAmIDB4ZjApIHsKCQkJCWluZm8uaGFtbWluZyA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZiAodC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCkKCQkJaW5mby5ub3Rmb3VuZCA9IDE7CgkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJmluZm8sIHNpemVvZih2dHhfcGFnZWluZm9fdCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAoIWluZm8uaGFtbWluZyAmJiAhaW5mby5ub3Rmb3VuZCkKCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gZmFsc2U7CgkJcmV0dXJuIDA7Cgl9CgoJY2FzZSBWVFhJT0NHRVRQQUdFOgoJewoJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKCQlpbnQgc3RhcnQsIGVuZDsKCgkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMgfHwgcmVxLT5zdGFydCA8IDAgfHwKCQkJcmVxLT5zdGFydCA+IHJlcS0+ZW5kIHx8IHJlcS0+ZW5kID49ICh2aXJ0dWFsX21vZGUgPyBWVFhfVklSVFVBTFNJWkUgOiBWVFhfUEFHRVNJWkUpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyLCAmdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZltyZXEtPnN0YXJ0XSwgcmVxLT5lbmQgLSByZXEtPnN0YXJ0ICsgMSkpCgkJCXJldHVybiAtRUZBVUxUOwoKCQkgLyoKCQkgICoJQWx3YXlzIHJlYWQgdGhlIHRpbWUgZGlyZWN0bHkgZnJvbSBTQUE1MjQ5CgkJICAqLwoKCQlpZiAocmVxLT5zdGFydCA8PSAzOSAmJiByZXEtPmVuZCA+PSAzMikgewoJCQlpbnQgbGVuOwoJCQljaGFyIGJ1ZlsxNl07CgkJCXN0YXJ0ID0gbWF4KHJlcS0+c3RhcnQsIDMyKTsKCQkJZW5kID0gbWluKHJlcS0+ZW5kLCAzOSk7CgkJCWxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCBzdGFydCwgLTEpIHx8CgkJCQlpMmNfZ2V0ZGF0YSh0LCBsZW4sIGJ1ZikpCgkJCQlyZXR1cm4gLUVJTzsKCQkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciArIHN0YXJ0IC0gcmVxLT5zdGFydCwgYnVmLCBsZW4pKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJfQoJCS8qIEluc2VydCB0aGUgY3VycmVudCBoZWFkZXIgaWYgREFVIGlzIHN0aWxsIHNlYXJjaGluZyBmb3IgYSBwYWdlICovCgkJaWYgKHJlcS0+c3RhcnQgPD0gMzEgJiYgcmVxLT5lbmQgPj0gNyAmJiB0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0pIHsKCQkJY2hhciBidWZbMzJdOwoJCQlpbnQgbGVuOwoKCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgNyk7CgkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzEpOwoJCQlsZW4gPSBlbmQgLSBzdGFydCArIDE7CgkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAoJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQoJCQkJcmV0dXJuIC1FSU87CgkJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIgKyBzdGFydCAtIHJlcS0+c3RhcnQsIGJ1ZiwgbGVuKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1NUT1BEQVU6Cgl7CgkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwoKCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKCQkJcmV0dXJuIC1FSU5WQUw7CgkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zdG9wcGVkID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBmYWxzZTsKCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1BVVFBBR0U6CgljYXNlIFZUWElPQ1NFVERJU1A6CgljYXNlIFZUWElPQ1BVVFNUQVQ6CgkJcmV0dXJuIDA7CgoJY2FzZSBWVFhJT0NDTFJDQUNIRToKCXsKCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDAsIE5VTV9EQVVTLCAwLCA4LCAtMSkgfHwgaTJjX3NlbmRkYXRhKHQsIDExLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAoJCQktMSkpCgkJCXJldHVybiAtRUlPOwoJCWlmIChpMmNfc2VuZGRhdGEodCwgMywgMHgyMCwgLTEpKQoJCQlyZXR1cm4gLUVJTzsKCQlqZGVsYXkoMTAgKiBDTEVBUl9ERUxBWSk7CQkJLyogSSBoYXZlIG5vIGlkZWEgaG93IGxvbmcgd2UgaGF2ZSB0byB3YWl0IGhlcmUgKi8KCQlyZXR1cm4gMDsKCX0KCgljYXNlIFZUWElPQ1NFVFZJUlQ6Cgl7CgkJLyogVGhlIFNBQTUyNDkgaGFzIHZpcnR1YWwtcm93IHJlY2VwdGlvbiB0dXJuZWQgb24gYWx3YXlzICovCgkJdC0+dmlydHVhbF9tb2RlID0gKGludCkobG9uZylhcmc7CgkJcmV0dXJuIDA7Cgl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKLyoKICogVHJhbnNsYXRlcyBvbGQgdnR4IElPQ1RMcyB0byBuZXcgb25lcwogKgogKiBUaGlzIGtlZXBzIG5ldyBrZXJuZWwgdmVyc2lvbnMgY29tcGF0aWJsZSB3aXRoIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMuCiAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2dHhfZml4X2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCkKewoJc3dpdGNoIChjbWQpIHsKCWNhc2UgVlRYSU9DR0VUSU5GT19PTEQ6CgkJY21kID0gVlRYSU9DR0VUSU5GTzsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSUEFHRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSUEFHRTsKCQlicmVhazsKCWNhc2UgVlRYSU9DQ0xSRk9VTkRfT0xEOgoJCWNtZCA9IFZUWElPQ0NMUkZPVU5EOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQQUdFUkVRX09MRDoKCQljbWQgPSBWVFhJT0NQQUdFUkVROwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NHRVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NHRVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NHRVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTVE9QREFVX09MRDoKCQljbWQgPSBWVFhJT0NTVE9QREFVOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRQQUdFX09MRDoKCQljbWQgPSBWVFhJT0NQVVRQQUdFOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NTRVRESVNQX09MRDoKCQljbWQgPSBWVFhJT0NTRVRESVNQOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NQVVRTVEFUX09MRDoKCQljbWQgPSBWVFhJT0NQVVRTVEFUOwoJCWJyZWFrOwoJY2FzZSBWVFhJT0NDTFJDQUNIRV9PTEQ6CgkJY21kID0gVlRYSU9DQ0xSQ0FDSEU7CgkJYnJlYWs7CgljYXNlIFZUWElPQ1NFVFZJUlRfT0xEOgoJCWNtZCA9IFZUWElPQ1NFVFZJUlQ7CgkJYnJlYWs7Cgl9CglyZXR1cm4gY21kOwp9CgovKgogKglIYW5kbGUgdGhlIGxvY2tpbmcKICovCgpzdGF0aWMgbG9uZyBzYWE1MjQ5X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAoJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Cglsb25nIGVycjsKCgljbWQgPSB2dHhfZml4X2NvbW1hbmQoY21kKTsKCW11dGV4X2xvY2soJnQtPmxvY2spOwoJZXJyID0gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIGRvX3NhYTUyNDlfaW9jdGwpOwoJbXV0ZXhfdW5sb2NrKCZ0LT5sb2NrKTsKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgc2FhNTI0OV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwoJaW50IHBnYnVmOwoKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ0LT5pbl91c2UpKQoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGkyY19zZW5kZGF0YSh0LCAwLCAwLCAtMSkgfHwgLyogU2VsZWN0IFIxMSAqLwoJCS8qIFR1cm4gb2ZmIHBhcml0eSBjaGVja3MgKHdlIGRvIHRoaXMgb3Vyc2VsdmVzKSAqLwoJCWkyY19zZW5kZGF0YSh0LCAxLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMF0sIDAsIC0xKSB8fAoJCS8qIERpc3BsYXkgVFYtcGljdHVyZSwgbm8gdmlydHVhbCByb3dzICovCgkJaTJjX3NlbmRkYXRhKHQsIDQsIE5VTV9EQVVTLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMV0sIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVsyXSwgNywgLTEpKQoJCS8qIFNldCBkaXNwbGF5IHRvIHBhZ2UgNCAqLwoJewoJCWNsZWFyX2JpdCgwLCAmdC0+aW5fdXNlKTsKCQlyZXR1cm4gLUVJTzsKCX0KCglmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgewoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKCQltZW1zZXQodC0+dmRhdVtwZ2J1Zl0ubGFzdHN0YXQsIDAsIHNpemVvZih0LT52ZGF1WzBdLmxhc3RzdGF0KSk7CgkJdC0+dmRhdVtwZ2J1Zl0uZXhwaXJlID0gMDsKCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7CgkJdC0+dmRhdVtwZ2J1Zl0uc3RvcHBlZCA9IHRydWU7CgkJdC0+aXNfc2VhcmNoaW5nW3BnYnVmXSA9IGZhbHNlOwoJfQoJdC0+dmlydHVhbF9tb2RlID0gZmFsc2U7CglyZXR1cm4gMDsKfQoKCgpzdGF0aWMgaW50IHNhYTUyNDlfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKCglpMmNfc2VuZGRhdGEodCwgMSwgMHgyMCwgLTEpOwkJLyogVHVybiBvZmYgQ0NUICovCglpMmNfc2VuZGRhdGEodCwgNSwgMywgMywgLTEpOwkJLyogVHVybiBvZmYgVFYtZGlzcGxheSAqLwoJY2xlYXJfYml0KDAsICZ0LT5pbl91c2UpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgc2FhX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkub3BlbgkJPSBzYWE1MjQ5X29wZW4sCgkucmVsZWFzZSAgICAgICAJPSBzYWE1MjQ5X3JlbGVhc2UsCgkuaW9jdGwgICAgICAgICAgPSBzYWE1MjQ5X2lvY3RsLAp9OwoKc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlID0KewoJLm5hbWUJCT0gInNhYTUyNDkiLAoJLmZvcHMgICAgICAgICAgID0gJnNhYV9mb3BzLAoJLnJlbGVhc2UgCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCn07CgpzdGF0aWMgaW50IHNhYTUyNDlfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CgoJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwgVjRMMl9JREVOVF9TQUE1MjQ5LCAwKTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBzYWE1MjQ5X2NvcmVfb3BzID0gewoJLmdfY2hpcF9pZGVudCA9IHNhYTUyNDlfZ19jaGlwX2lkZW50LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgc2FhNTI0OV9vcHMgPSB7CgkuY29yZSA9ICZzYWE1MjQ5X2NvcmVfb3BzLAp9OwoKc3RhdGljIGludCBzYWE1MjQ5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCgkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKewoJaW50IHBnYnVmOwoJaW50IGVycjsKCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdDsKCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CgoJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwKCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7Cgl2NGxfaW5mbyhjbGllbnQsICJWaWRlb1RleHQgdmVyc2lvbiAlZC4lZFxuIiwKCQkJVlRYX1ZFUl9NQUosIFZUWF9WRVJfTUlOKTsKCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOwoJaWYgKHQgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT01FTTsKCXNkID0gJnQtPnNkOwoJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJnNhYTUyNDlfb3BzKTsKCW11dGV4X2luaXQoJnQtPmxvY2spOwoKCS8qIE5vdyBjcmVhdGUgYSB2aWRlbzRsaW51eCBkZXZpY2UgKi8KCXQtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKCWlmICh0LT52ZGV2ID09IE5VTEwpIHsKCQlrZnJlZSh0KTsKCQlrZnJlZShjbGllbnQpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbWVtY3B5KHQtPnZkZXYsICZzYWFfdGVtcGxhdGUsIHNpemVvZigqdC0+dmRldikpOwoKCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKSB7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CgkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnNyZWdzLCAwLCBzaXplb2YodC0+dmRhdVswXS5zcmVncykpOwoJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5sYXN0c3RhdCwgMCwgc2l6ZW9mKHQtPnZkYXVbMF0ubGFzdHN0YXQpKTsKCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOwoJCXQtPnZkYXVbcGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKCQl0LT52ZGF1W3BnYnVmXS5zdG9wcGVkID0gdHJ1ZTsKCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7Cgl9Cgl2aWRlb19zZXRfZHJ2ZGF0YSh0LT52ZGV2LCB0KTsKCgkvKiBSZWdpc3RlciBpdCAqLwoJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHQtPnZkZXYsIFZGTF9UWVBFX1ZUWCwgLTEpOwoJaWYgKGVyciA8IDApIHsKCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh0LT52ZGV2KTsKCQlrZnJlZSh0KTsKCQlyZXR1cm4gZXJyOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2FhNTI0OV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0ID0gdG9fZGV2KHNkKTsKCgl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh0LT52ZGV2KTsKCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKCWtmcmVlKHQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzYWE1MjQ5X2lkW10gPSB7Cgl7ICJzYWE1MjQ5IiwgMCB9LAoJeyB9Cn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzYWE1MjQ5X2lkKTsKCnN0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKCS5uYW1lID0gInNhYTUyNDkiLAoJLnByb2JlID0gc2FhNTI0OV9wcm9iZSwKCS5yZW1vdmUgPSBzYWE1MjQ5X3JlbW92ZSwKCS5pZF90YWJsZSA9IHNhYTUyNDlfaWQsCn07Cg==