LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIE1hciAzMSwgMTk5OS4gT3ZlIEvldmVuIDxvdmVrQGFyY3RpY25ldC5ubz4KICogLSBJbXBsZW1lbnRlZCBidWZmZXJzIGFuZCBFbmFibGVDb21tTm90aWZpY2F0aW9uLgogKgogKiBBcHIgMywgMTk5OS4gIExhd3NvbiBXaGl0bmV5IDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KICogLSBGaXhlZCB0aGUgbW9kZW0gY29udHJvbCBwYXJ0IG9mIEVzY2FwZUNvbW1GdW5jdGlvbjE2LgogKgogKiBNYXIgMywgMTk5OS4gT3ZlIEvldmVuIDxvdmVrQGFyY3RpY25ldC5ubz4KICogLSBVc2UgcG9ydCBpbmRpY2VzIGluc3RlYWQgb2YgdW5peGZkcyBmb3Igd2luMTYKICogLSBNb3ZlZCB0aGluZ3MgYXJvdW5kIChzZXBhcmF0ZWQgd2luMTYgYW5kIHdpbjMyIHJvdXRpbmVzKQogKiAtIEFkZGVkIHNvbWUgaGludHMgb24gaG93IHRvIGltcGxlbWVudCBidWZmZXJzIGFuZCBFbmFibGVDb21tTm90aWZpY2F0aW9uLgogKgogKiBNYXkgMjYsIDE5OTcuICBGaXhlcyBhbmQgY29tbWVudHMgYnkgUmljayBSaWNoYXJkc29uIDxyaWNrQGRnaWkuY29tPiBbUkVSXQogKiAtIHB0ci0+ZmQgd2Fzbid0IGdldHRpbmcgY2xlYXJlZCBvbiBjbG9zZS4KICogLSBHZXRDb21tRXZlbnRNYXNrKCkgYW5kIEdldENvbW1FcnJvcigpIGRpZG4ndCBkbyBtdWNoIG9mIGFueXRoaW5nLgogKiAgIElNSE8sIHRoZXkgYXJlIHN0aWxsIHdyb25nLCBidXQgdGhleSBhdCBsZWFzdCBpbXBsZW1lbnQgdGhlIFJYQ0hBUgogKiAgIGV2ZW50IGFuZCByZXR1cm4gSS9PIHF1ZXVlIHNpemVzLCB3aGljaCBtYWtlcyB0aGUgYXBwIEknbSBpbnRlcmVzdGVkCiAqICAgaW4gKGFuYWxvZyBkZXZpY2VzIEVaS0lUIERTUCBkZXZlbG9wbWVudCBzeXN0ZW0pIHdvcmsuCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIEp1bHkgNiwgMTk5OC4gRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFZhbGVudGlqbiBTZXNzaW5rCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2c2Vzc2lua0BpYy51dmEubmw+IFtWXQogKiBPa3RvYmVyIDk4LCBSZWluIEtsYXplcyBbUkhLXQogKiBBIHByb2dyYW0gdGhhdCB3YW50cyB0byBtb25pdG9yIHRoZSBtb2RlbSBzdGF0dXMgbGluZSAoUkxTRC9EQ0QpIG1heQogKiBwb2xsIHRoZSBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgaW4gdGhlIGNvbW1NYXNrIHN0cnVjdHVyZS4gSSB1cGRhdGUgdGhlIGJpdAogKiBpbiBHZXRDb21tRXJyb3IsIHdhaXRpbmcgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIGNvbW11bmljYXRpb24gZXZlbnRzLgogKiAKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGNvbW0pOwoKLyogd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIENPTU1fTVNSX09GRlNFVCAgMzUKI2RlZmluZSBNU1JfQ1RTICAweDEwCiNkZWZpbmUgTVNSX0RTUiAgMHgyMAojZGVmaW5lIE1TUl9SSSAgIDB4NDAKI2RlZmluZSBNU1JfUkxTRCAweDgwCiNkZWZpbmUgTVNSX01BU0sgKE1TUl9DVFN8TVNSX0RTUnxNU1JfUkl8TVNSX1JMU0QpCgojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCiNkZWZpbmUgTUFYX1BPUlRTICAgOQoKc3RydWN0IERvc0RldmljZVN0cnVjdCB7CiAgICBjaGFyICpkZXZpY2VuYW1lOyAgIC8qIC9kZXYvdHR5UzAgKi8KICAgIEhBTkRMRSBoYW5kbGU7CiAgICBpbnQgc3VzcGVuZGVkOwogICAgaW50IHVuZ2V0LHhtaXQ7CiAgICBpbnQgYmF1ZHJhdGU7CiAgICBpbnQgZXZ0Y2hhcjsKICAgIC8qIGV2ZW50cyAqLwogICAgaW50IGNvbW1lcnJvciwgZXZlbnRtYXNrOwogICAgLyogYnVmZmVycyAqLwogICAgY2hhciAqaW5idWYsKm91dGJ1ZjsKICAgIHVuc2lnbmVkIGlidWZfc2l6ZSxpYnVmX2hlYWQsaWJ1Zl90YWlsOwogICAgdW5zaWduZWQgb2J1Zl9zaXplLG9idWZfaGVhZCxvYnVmX3RhaWw7CiAgICAvKiBub3RpZmljYXRpb25zICovCiAgICBIV05EIHduZDsKICAgIGludCBuX3JlYWQsIG5fd3JpdGU7CiAgICBPVkVSTEFQUEVEIHJlYWRfb3YsIHdyaXRlX292OwogICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZXMgKi8KICAgIERDQjE2IGRjYjsKICAgIC8qIHBvaW50ZXIgdG8gdW5rbm93big9PXVuZG9jdW1lbnRlZCkgY29tbSBzdHJ1Y3R1cmUgKi8gCiAgICBMUENWT0lEICp1bmtub3duOwp9OwoKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IExQVFtNQVhfUE9SVFNdOwoKLyogdXBkYXRlIHdpbmRvdydzIHNlbWkgZG9jdW1lbnRlZCBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KLyogc2VlIGtub3dsZWRnZSBiYXNlIFExMDE0MTcgKi8Kc3RhdGljIHZvaWQgQ09NTV9NU1JVcGRhdGUoIEhBTkRMRSBoYW5kbGUsIFVDSEFSICogcE1zciApCnsKICAgIFVDSEFSIHRtcG1zcj0wOwogICAgRFdPUkQgbXN0YXQ9MDsKCiAgICBpZighR2V0Q29tbU1vZGVtU3RhdHVzKGhhbmRsZSwmbXN0YXQpKQogICAgICAgIHJldHVybjsKCiAgICBpZihtc3RhdCAmIE1TX0NUU19PTikgdG1wbXNyIHw9IE1TUl9DVFM7CiAgICBpZihtc3RhdCAmIE1TX0RTUl9PTikgdG1wbXNyIHw9IE1TUl9EU1I7CiAgICBpZihtc3RhdCAmIE1TX1JJTkdfT04pIHRtcG1zciB8PSBNU1JfUkk7CiAgICBpZihtc3RhdCAmIE1TX1JMU0RfT04pIHRtcG1zciB8PSBNU1JfUkxTRDsKICAgICpwTXNyID0gKCpwTXNyICYgfk1TUl9NQVNLKSB8IHRtcG1zcjsKfQoKdm9pZCBDT01NX0luaXQodm9pZCkKewoJaW50IHg7CgljaGFyIG9wdGlvblsxMF0sIHRlbXBbMjU2XSwgKmJ0ZW1wOwoJSEtFWSBoa2V5OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCS8qIGRlZmF1bHQgdmFsdWUgKi8KCQlzdHJjcHkodGVtcCwgIioiKTsKCgkJaWYoIVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxXaW5lXFxXaW5lXFxDb25maWdcXHNlcmlhbHBvcnRzIiwgJmhrZXkpKQoJCXsKCQkgICAgRFdPUkQgdHlwZSwgY291bnQgPSBzaXplb2YodGVtcCk7CgoJCSAgICBSZWdRdWVyeVZhbHVlRXhBKGhrZXksIG9wdGlvbiwgMCwgJnR5cGUsIHRlbXAsICZjb3VudCk7CgkJICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwoJCX0KCgkJaWYgKCFzdHJjbXAodGVtcCwgIioiKSB8fCAqdGVtcCA9PSAnXDAnKSAKCQkJQ09NW3hdLmRldmljZW5hbWUgPSBOVUxMOwoJCWVsc2UgewoJCSAgCWJ0ZW1wID0gc3RyY2hyKHRlbXAsJywnKTsKCQkJaWYgKGJ0ZW1wICE9IE5VTEwpIHsKCQkJICAJKmJ0ZW1wKysgPSAnXDAnOwoJCQkJQ09NW3hdLmJhdWRyYXRlID0gYXRvaShidGVtcCk7CgkJCX0gZWxzZSB7CgkJCQlDT01beF0uYmF1ZHJhdGUgPSAtMTsKCQkJfQoJCQlpZiAoKENPTVt4XS5kZXZpY2VuYW1lID0gbWFsbG9jKHN0cmxlbih0ZW1wKSsxKSkgPT0gTlVMTCkgCgkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCWVsc2UgewoJCQkJQ09NW3hdLmhhbmRsZSA9IDA7CgkJCQlzdHJjcHkoQ09NW3hdLmRldmljZW5hbWUsIHRlbXApOwoJCQl9CgkJCVRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJLyogZGVmYXVsdCB2YWx1ZSAqLwoJCXN0cmNweSh0ZW1wLCAiKiIpOwoKCQlpZighUmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFdpbmVcXFdpbmVcXENvbmZpZ1xccGFyYWxsZWxwb3J0cyIsICZoa2V5KSkKCQl7CgkJICAgIERXT1JEIHR5cGUsIGNvdW50ID0gc2l6ZW9mKHRlbXApOwoKCQkgICAgUmVnUXVlcnlWYWx1ZUV4QShoa2V5LCBvcHRpb24sIDAsICZ0eXBlLCB0ZW1wLCAmY291bnQpOwoJCSAgICBSZWdDbG9zZUtleShoa2V5KTsKCQl9CgoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykKCQkJTFBUW3hdLmRldmljZW5hbWUgPSBOVUxMOwoJCWVsc2UgewoJCQlpZiAoKExQVFt4XS5kZXZpY2VuYW1lID0gbWFsbG9jKHN0cmxlbih0ZW1wKSsxKSkgPT0gTlVMTCkgCgkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCWVsc2UgewoJCQkJTFBUW3hdLmhhbmRsZSA9IDA7CgkJCQlzdHJjcHkoTFBUW3hdLmRldmljZW5hbWUsIHRlbXApOwoJCQl9CgkJCVRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIExQVFt4XS5kZXZpY2VuYW1lKTsKCQl9CgoJfQp9CgoKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKkdldERldmljZVN0cnVjdChpbnQgaW5kZXgpCnsKCWlmICgoaW5kZXgmMHg3Rik8PU1BWF9QT1JUUykgewogICAgICAgICAgICBpZiAoIShpbmRleCZGTEFHX0xQVCkpIHsKCQlpZiAoQ09NW2luZGV4XS5oYW5kbGUpCgkJICAgIHJldHVybiAmQ09NW2luZGV4XTsKCSAgICB9IGVsc2UgewoJCWluZGV4ICY9IDB4N2Y7CgkJaWYgKExQVFtpbmRleF0uaGFuZGxlKQoJCSAgICByZXR1cm4gJkxQVFtpbmRleF07CgkgICAgfQoJfQoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50ICAgIEdldENvbW1Qb3J0X292KExQT1ZFUkxBUFBFRCBvdiwgaW50IHdyaXRlKQp7CglpbnQgeDsKICAgICAgICAKCWZvciAoeD0wOyB4PE1BWF9QT1JUUzsgeCsrKSB7CgkJaWYgKG92ID09ICh3cml0ZT8mQ09NW3hdLndyaXRlX292OiZDT01beF0ucmVhZF9vdikpCgkJCXJldHVybiB4OwoJfQogICAgICAgCglyZXR1cm4gLTE7Cn0gCgpzdGF0aWMgaW50IFZhbGlkQ09NUG9ydChpbnQgeCkKewoJcmV0dXJuKHggPCBNQVhfUE9SVFMgPyAoaW50KSBDT01beF0uZGV2aWNlbmFtZSA6IDApOyAKfQoKc3RhdGljIGludCBWYWxpZExQVFBvcnQoaW50IHgpCnsKCXJldHVybih4IDwgTUFYX1BPUlRTID8gKGludCkgTFBUW3hdLmRldmljZW5hbWUgOiAwKTsgCn0KCnN0YXRpYyBpbnQgV2luRXJyb3Iodm9pZCkKewogICAgICAgIFRSQUNFKCJlcnJubyA9ICVkXG4iLCBlcnJubyk7Cglzd2l0Y2ggKGVycm5vKSB7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIENFX0lPRTsKCQl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX2luYnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8gcHRyLT5pYnVmX3NpemUgOiAwKQogICAgKyBwdHItPmlidWZfaGVhZCAtIHB0ci0+aWJ1Zl90YWlsOwp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9vdXRidWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfc2l6ZSA6IDApCiAgICArIHB0ci0+b2J1Zl9oZWFkIC0gcHRyLT5vYnVmX3RhaWw7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHJlYWQoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKTsKc3RhdGljIHZvaWQgY29tbV93YWl0d3JpdGUoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKTsKCnN0YXRpYyBWT0lEIFdJTkFQSSBDT01NMTZfUmVhZENvbXBsZXRlKERXT1JEIHN0YXR1cywgRFdPUkQgbGVuLCBMUE9WRVJMQVBQRUQgb3YpCnsKCWludCBwcmV2IDsKCVdPUkQgbWFzayA9IDA7CglpbnQgY2lkID0gR2V0Q29tbVBvcnRfb3Yob3YsMCk7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJaWYoY2lkPDApIHsKCQlFUlIoImFzeW5jIHdyaXRlIHdpdGggYmFkIG92ZXJsYXBwZWQgcG9pbnRlclxuIik7CgkJcmV0dXJuOwoJfQoJcHRyID0gJkNPTVtjaWRdOwoKCS8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwoJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewoJCUVSUigiYXN5bmMgcmVhZCBmYWlsZWRcbiIpOwoJCUNPTVtjaWRdLmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCQlyZXR1cm47Cgl9CglUUkFDRSgiYXN5bmMgcmVhZCBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJcHJldiA9IGNvbW1faW5idWYocHRyKTsKCgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgbGVuKSkgewoJCSooV09SRCopKENPTVtjaWRdLnVua25vd24pIHw9IEVWX1JYRkxBRzsKCQltYXNrIHw9IENOX0VWRU5UOwoJfQoJaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhDSEFSKSB7CgkJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgfD0gRVZfUlhDSEFSOwoJCW1hc2sgfD0gQ05fRVZFTlQ7Cgl9CgoJLyogYWR2YW5jZSBidWZmZXIgcG9zaXRpb24gKi8KCXB0ci0+aWJ1Zl9oZWFkICs9IGxlbjsKCWlmIChwdHItPmlidWZfaGVhZCA+PSBwdHItPmlidWZfc2l6ZSkKCQlwdHItPmlidWZfaGVhZCA9IDA7CgoJLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwoJaWYgKHB0ci0+d25kICYmIChwdHItPm5fcmVhZD4wKSAmJiAocHJldjxwdHItPm5fcmVhZCkgJiYKCSAgICAoY29tbV9pbmJ1ZihwdHIpPj1wdHItPm5fcmVhZCkpIHsKCQkvKiBwYXNzZWQgdGhlIHJlY2VpdmUgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwoJCW1hc2sgfD0gQ05fUkVDRUlWRTsKCX0KCgkvKiBzZW5kIG5vdGlmaWNhdGlvbnMsIGlmIGFueSAqLwoJaWYgKHB0ci0+d25kICYmIG1hc2spIHsKCQlUUkFDRSgibm90aWZ5aW5nICUwNHg6IGNpZD0lZCwgbWFzaz0lMDJ4XG4iLCBwdHItPnduZCwgY2lkLCBtYXNrKTsKCQlQb3N0TWVzc2FnZUEocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7Cgl9CgoJLyogb24gcmVhbCB3aW5kb3dzLCB0aGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zLCBzaW5jZSBpdCBpcyByZWN1cnNpdmUgKi8KCS8qIHJlc3RhcnQgdGhlIHJlY2VpdmUgKi8KCWNvbW1fd2FpdHJlYWQocHRyKTsKfQoKc3RhdGljIFZPSUQgV0lOQVBJIENPTU0xNl9Xcml0ZUNvbXBsZXRlKERXT1JEIHN0YXR1cywgRFdPUkQgbGVuLCBMUE9WRVJMQVBQRUQgb3YpCnsKCWludCBwcmV2LCBibGVmdDsKCVdPUkQgbWFzayA9IDA7CglpbnQgY2lkID0gR2V0Q29tbVBvcnRfb3Yob3YsMSk7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJaWYoY2lkPDApIHsKCQlFUlIoImFzeW5jIHdyaXRlIHdpdGggYmFkIG92ZXJsYXBwZWQgcG9pbnRlclxuIik7CgkJcmV0dXJuOwoJfQoJcHRyID0gJkNPTVtjaWRdOwoKCS8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwoJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewoJCUVSUigiYXN5bmMgd3JpdGUgZmFpbGVkXG4iKTsKCQlDT01bY2lkXS5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkJcmV0dXJuOwoJfQoJVFJBQ0UoImFzeW5jIHdyaXRlIGNvbXBsZXRlZCAlbGQgYnl0ZXNcbiIsbGVuKTsKCgkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBwb2ludGVycyAqLwoJcHJldiA9IGNvbW1fb3V0YnVmKCZDT01bY2lkXSk7CglwdHItPm9idWZfdGFpbCArPSBsZW47CglpZiAocHRyLT5vYnVmX3RhaWwgPj0gcHRyLT5vYnVmX3NpemUpCgkJcHRyLT5vYnVmX3RhaWwgPSAwOwoKCS8qIHdyaXRlIGFueSBUcmFuc21pdENvbW1DaGFyIGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+eG1pdD49MCkgewoJCWlmKCFXcml0ZUZpbGUocHRyLT5oYW5kbGUsICYocHRyLT54bWl0KSwgMSwgJmxlbiwgTlVMTCkpCgkJCWxlbiA9IC0xOwoJCWlmIChsZW4gPiAwKSBwdHItPnhtaXQgPSAtMTsKCX0KCgkvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwoJYmxlZnQgPSAoKHB0ci0+b2J1Zl90YWlsIDw9IHB0ci0+b2J1Zl9oZWFkKSA/IAoJCXB0ci0+b2J1Zl9oZWFkIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX3RhaWw7CgoJLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwoJaWYgKHB0ci0+d25kICYmIChwdHItPm5fd3JpdGU+MCkgJiYgKHByZXY+PXB0ci0+bl93cml0ZSkgJiYKCSAgKGNvbW1fb3V0YnVmKHB0cik8cHRyLT5uX3dyaXRlKSkgewoJCS8qIHBhc3NlZCB0aGUgdHJhbnNtaXQgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwoJCW1hc2sgfD0gQ05fVFJBTlNNSVQ7Cgl9CgoJLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KCWlmIChwdHItPnduZCAmJiBtYXNrKSB7CgkJVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CgkJUG9zdE1lc3NhZ2VBKHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwoJfQoKCS8qIHN0YXJ0IGFnYWluIGlmIG5lY2Vzc2FyeSAqLwoJaWYoYmxlZnQpCgkJY29tbV93YWl0d3JpdGUocHRyKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0cmVhZChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKCWludCBibGVmdDsKCglibGVmdCA9ICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyAKCQkocHRyLT5pYnVmX3RhaWwtMSkgOiBwdHItPmlidWZfc2l6ZSkgLSBwdHItPmlidWZfaGVhZDsKCS8qIEZJWE1FOiBnZXQgdGltZW91dHMgd29ya2luZyBwcm9wZXJseSBzbyB3ZSBjYW4gcmVhZCBibGVmdCBieXRlcyAqLwoJUmVhZEZpbGVFeChwdHItPmhhbmRsZSwKCQlwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsCgkJMSwKCQkmcHRyLT5yZWFkX292LAoJCUNPTU0xNl9SZWFkQ29tcGxldGUpOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXR3cml0ZShzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKCWludCBibGVmdDsKCglibGVmdCA9ICgocHRyLT5vYnVmX3RhaWwgPD0gcHRyLT5vYnVmX2hlYWQpID8gCgkJcHRyLT5vYnVmX2hlYWQgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfdGFpbDsKCVdyaXRlRmlsZUV4KHB0ci0+aGFuZGxlLAoJCXB0ci0+b3V0YnVmICsgcHRyLT5vYnVmX3RhaWwsCgkJYmxlZnQsCgkJJnB0ci0+d3JpdGVfb3YsCgkJQ09NTTE2X1dyaXRlQ29tcGxldGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ09NTTE2X0RDQnRvRENCMTYJKEludGVybmFsKQogKi8KSU5UMTYgQ09NTTE2X0RDQnRvRENCMTYoTFBEQ0IgbHBkY2IsIExQRENCMTYgbHBkY2IxNikKewoJaWYobHBkY2ItPkJhdWRSYXRlPDB4MTAwMDApCgkJbHBkY2IxNi0+QmF1ZFJhdGUgPSBscGRjYi0+QmF1ZFJhdGU7CgllbHNlIGlmKGxwZGNiLT5CYXVkUmF0ZT09MTE1MjAwKQoJCQlscGRjYjE2LT5CYXVkUmF0ZSA9IDU3NjAxOwoJZWxzZSB7CgkJV0FSTigiQmF1ZCByYXRlIGNhbid0IGJlIGNvbnZlcnRlZFxuIik7CgkJbHBkY2IxNi0+QmF1ZFJhdGUgPSA1NzYwMTsKCX0KCWxwZGNiMTYtPkJ5dGVTaXplID0gbHBkY2ItPkJ5dGVTaXplOwoJbHBkY2IxNi0+ZlBhcml0eSA9IGxwZGNiLT5mUGFyaXR5OwoJbHBkY2IxNi0+UGFyaXR5ID0gbHBkY2ItPlBhcml0eTsKCWxwZGNiMTYtPlN0b3BCaXRzID0gbHBkY2ItPlN0b3BCaXRzOwoKCWxwZGNiMTYtPlJsc1RpbWVvdXQgPSA1MDsKCWxwZGNiMTYtPkN0c1RpbWVvdXQgPSA1MDsgCglscGRjYjE2LT5Ec3JUaW1lb3V0ID0gNTA7CglscGRjYjE2LT5mTnVsbCA9IDA7CglscGRjYjE2LT5mQ2hFdnQgPSAwOwoJbHBkY2IxNi0+ZkJpbmFyeSA9IDE7CglscGRjYjE2LT5mRHRyRGlzYWJsZSA9IDA7CgoJbHBkY2IxNi0+ZkR0cmZsb3cgPSAobHBkY2ItPmZEdHJDb250cm9sPT1EVFJfQ09OVFJPTF9FTkFCTEUpOwoJbHBkY2IxNi0+ZlJ0c2Zsb3cgPSAobHBkY2ItPmZSdHNDb250cm9sPT1SVFNfQ09OVFJPTF9FTkFCTEUpOwoJbHBkY2IxNi0+Zk91dHhDdHNGbG93ID0gbHBkY2ItPmZPdXR4Q3RzRmxvdzsKCWxwZGNiMTYtPmZPdXR4RHNyRmxvdyA9IGxwZGNiLT5mT3V0eERzckZsb3c7CglscGRjYjE2LT5mRHRyRGlzYWJsZSA9IChscGRjYi0+ZkR0ckNvbnRyb2w9PURUUl9DT05UUk9MX0RJU0FCTEUpOwoKCWxwZGNiMTYtPmZJblggPSBscGRjYi0+ZkluWDsKCglscGRjYjE2LT5mT3V0WCA9IGxwZGNiLT5mT3V0WDsKLyoKCWxwZGNiMTYtPlhvbkNoYXIgPSAKCWxwZGNiMTYtPlhvZmZDaGFyID0gCiAqLwoJbHBkY2IxNi0+WG9uTGltID0gMTA7CglscGRjYjE2LT5Yb2ZmTGltID0gMTA7CgoJcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0IJCShVU0VSLjIxMykKICoKICogQWNjb3JkaW5nIHRvIHRoZSBFQ01BLTIzNCAoMzY4LjMpIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBGQUxTRSBvbiAKICogc3VjY2Vzcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIC0xLiAKICovCklOVDE2IFdJTkFQSSBCdWlsZENvbW1EQ0IxNihMUENTVFIgZGV2aWNlLCBMUERDQjE2IGxwZGNiKQp7CgkvKiAiQ09NMTo5NixuLDgsMSIJKi8KCS8qICAwMTIzNDUJCSovCglpbnQgcG9ydDsKCURDQiBkY2I7CgoJVFJBQ0UoIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CgoJaWYgKHN0cm5jYXNlY21wKGRldmljZSwiQ09NIiwzKSkKCQlyZXR1cm4gLTE7Cglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkgewoJCUVSUigiQlVHICEgQ09NMCBjYW4ndCBleGlzdCFcbiIpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewoJCUZJWE1FKCJpbnZhbGlkIENPTSBwb3J0ICVkP1xuIixwb3J0KTsKCQlyZXR1cm4gLTE7Cgl9CgkJCgltZW1zZXQobHBkY2IsIDAsIHNpemVvZihEQ0IxNikpOyAvKiBpbml0aWFsaXplICovCgoJbHBkY2ItPklkID0gcG9ydDsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YoRENCKTsKCglpZiAoc3RyY2hyKGRldmljZSwnPScpKSAvKiBibG9jayBuZXcgc3R5bGUgKi8KCQlyZXR1cm4gLTE7CgoJaWYoIUJ1aWxkQ29tbURDQkEoZGV2aWNlLCZkY2IpKQoJCXJldHVybiAtMTsKCglyZXR1cm4gQ09NTTE2X0RDQnRvRENCMTYoJmRjYiwgbHBkY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQ7CglIQU5ETEUgaGFuZGxlOwoKICAgIAlUUkFDRSgiJXMsICVkLCAlZFxuIiwgZGV2aWNlLCBjYkluUXVldWUsIGNiT3V0UXVldWUpOwoKCWlmIChzdHJsZW4oZGV2aWNlKSA8IDQpCgkgICByZXR1cm4gSUVfQkFESUQ7CgoJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApCgkJRVJSKCJCVUcgISBDT00wIG9yIExQVDAgZG9uJ3QgZXhpc3QgIVxuIik7CgoJaWYgKCFzdHJuY2FzZWNtcChkZXZpY2UsIkNPTSIsMykpIHsKCQkKICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBkZXZpY2UsIENPTVtwb3J0XS5kZXZpY2VuYW1lKTsKCgkJaWYgKCFWYWxpZENPTVBvcnQocG9ydCkpCgkJCXJldHVybiBJRV9CQURJRDsKCgkJaWYgKENPTVtwb3J0XS5oYW5kbGUpCgkJCXJldHVybiBJRV9PUEVOOwoKCQloYW5kbGUgPSBDcmVhdGVGaWxlQShkZXZpY2UsIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFLAoJCQlGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLCBOVUxMLCBDUkVBVEVfQUxXQVlTLCAwLCAwICk7CgkJaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewoJCQlFUlIoIkNvdWxkbid0IG9wZW4gJXMgISAoJXMpXG4iLCBDT01bcG9ydF0uZGV2aWNlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS51bmtub3duID0gU0VHUFRSX0FMTE9DKDQwKTsKCQkJbWVtc2V0KENPTVtwb3J0XS51bmtub3duLCAwLCA0MCk7CgkJCUNPTVtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJQ09NW3BvcnRdLmV2dGNoYXIgPSAwOyAvKiBGSVhNRTogZGVmYXVsdD8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwoJCQlHZXRDb21tU3RhdGUxNihwb3J0LCZDT01bcG9ydF0uZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihDT01bcG9ydF0uYmF1ZHJhdGU+LTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRENCMTYgZGNiOwoJCQkgICAgbWVtY3B5KCZkY2IsJkNPTVtwb3J0XS5kY2Isc2l6ZW9mIGRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2IuQmF1ZFJhdGU9Q09NW3BvcnRdLmJhdWRyYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBkZWZhdWx0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGFiaXRzLCBwYXJpdHksIHN0b3BiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbW1TdGF0ZTE2KCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkvKiBpbml0IHByaW9yaXR5IGNoYXJhY3RlcnMgKi8KCQkJQ09NW3BvcnRdLnVuZ2V0ID0gLTE7CgkJCUNPTVtwb3J0XS54bWl0ID0gLTE7CgkJCS8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KCQkJQ09NW3BvcnRdLmlidWZfc2l6ZSA9IGNiSW5RdWV1ZTsKCQkJQ09NW3BvcnRdLmlidWZfaGVhZCA9IENPTVtwb3J0XS5pYnVmX3RhaWwgPSAwOwoJCQlDT01bcG9ydF0ub2J1Zl9zaXplID0gY2JPdXRRdWV1ZTsKCQkJQ09NW3BvcnRdLm9idWZfaGVhZCA9IENPTVtwb3J0XS5vYnVmX3RhaWwgPSAwOwoKCQkJQ09NW3BvcnRdLmluYnVmID0gbWFsbG9jKGNiSW5RdWV1ZSk7CgkJCWlmIChDT01bcG9ydF0uaW5idWYpIHsKCQkJICBDT01bcG9ydF0ub3V0YnVmID0gbWFsbG9jKGNiT3V0UXVldWUpOwoJCQkgIGlmICghQ09NW3BvcnRdLm91dGJ1ZikKCQkJICAgIGZyZWUoQ09NW3BvcnRdLmluYnVmKTsKCQkJfSBlbHNlIENPTVtwb3J0XS5vdXRidWYgPSBOVUxMOwoJCQlpZiAoIUNPTVtwb3J0XS5vdXRidWYpIHsKCQkJICAvKiBub3QgZW5vdWdoIG1lbW9yeSAqLwoJCQkgIFNldENvbW1TdGF0ZTE2KCZDT01bcG9ydF0uZGNiKTsKCQkJICBDbG9zZUhhbmRsZShDT01bcG9ydF0uaGFuZGxlKTsKCQkJICBFUlIoIm91dCBvZiBtZW1vcnlcbiIpOwoJCQkgIHJldHVybiBJRV9NRU1PUlk7CgkJCX0KCgkJCVplcm9NZW1vcnkoJkNPTVtwb3J0XS5yZWFkX292LHNpemVvZiAoT1ZFUkxBUFBFRCkpOwoJCQlaZXJvTWVtb3J5KCZDT01bcG9ydF0ud3JpdGVfb3Ysc2l6ZW9mIChPVkVSTEFQUEVEKSk7CgkJCUNPTVtwb3J0XS5yZWFkX292LmhFdmVudCA9IENyZWF0ZUV2ZW50QShOVUxMLDAsMCxOVUxMKTsKCQkJQ09NW3BvcnRdLndyaXRlX292LmhFdmVudCA9IENyZWF0ZUV2ZW50QShOVUxMLDAsMCxOVUxMKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fd2FpdHJlYWQoICZDT01bcG9ydF0gKTsKCgkJCXJldHVybiBwb3J0OwoJCX0KCX0gCgllbHNlIAoJaWYgKCFzdHJuY2FzZWNtcChkZXZpY2UsIkxQVCIsMykpIHsKCQoJCWlmICghVmFsaWRMUFRQb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChMUFRbcG9ydF0uaGFuZGxlKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJaGFuZGxlID0gQ3JlYXRlRmlsZUEoZGV2aWNlLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwKCQkJRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgQ1JFQVRFX0FMV0FZUywgMCwgMCApOwoJCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCUxQVFtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUxQVFtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlMUFRbcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJcmV0dXJuIHBvcnR8RkxBR19MUFQ7CgkJfQoJfQoJcmV0dXJuIElFX0JBRElEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xvc2VDb21tCQkoVVNFUi4yMDcpCiAqLwpJTlQxNiBXSU5BUEkgQ2xvc2VDb21tMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoIShjaWQmRkxBR19MUFQpKSB7CgkJLyogQ09NIHBvcnQgKi8KCQlTRUdQVFJfRlJFRShDT01bY2lkXS51bmtub3duKTsgLyogW0xXXSAqLwoKCQlDbG9zZUhhbmRsZShDT01bY2lkXS5yZWFkX292LmhFdmVudCk7CgkJQ2xvc2VIYW5kbGUoQ09NW2NpZF0ud3JpdGVfb3YuaEV2ZW50KTsKCgkJLyogZnJlZSBidWZmZXJzICovCgkJZnJlZShwdHItPm91dGJ1Zik7CgkJZnJlZShwdHItPmluYnVmKTsKCgkJLyogcmVzZXQgbW9kZW0gbGluZXMgKi8KCQlTZXRDb21tU3RhdGUxNigmQ09NW2NpZF0uZGNiKTsKCX0KCglpZiAoIUNsb3NlSGFuZGxlKHB0ci0+aGFuZGxlKSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkvKiBGSVhNRTogc2hvdWxkIHdlIGNsZWFyIHB0ci0+aGFuZGxlIGhlcmU/ICovCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcHRyLT5oYW5kbGUgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUJyZWFrCQkoVVNFUi4yMTApCiAqLwpJTlQxNiBXSU5BUEkgU2V0Q29tbUJyZWFrMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcHRyLT5zdXNwZW5kZWQgPSAxOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkoVVNFUi4yMTEpCiAqLwpJTlQxNiBXSU5BUEkgQ2xlYXJDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICghKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCXB0ci0+c3VzcGVuZGVkID0gMDsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRXNjYXBlQ29tbUZ1bmN0aW9uCShVU0VSLjIxNCkKICovCkxPTkcgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbjE2KFVJTlQxNiBjaWQsVUlOVDE2IG5GdW5jdGlvbikKewoJc3RydWN0ICBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCWludAltYXg7CgogICAgCVRSQUNFKCJjaWQ9JWQsIGZ1bmN0aW9uPSVkXG4iLCBjaWQsIG5GdW5jdGlvbik7CgoJc3dpdGNoKG5GdW5jdGlvbikgewoJY2FzZSBHRVRNQVhDT006CgkgICAgICAgIFRSQUNFKCJHRVRNQVhDT01cbiIpOyAKCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshQ09NW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJOwoJCXJldHVybiBtYXg7CgoJY2FzZSBHRVRNQVhMUFQ6CgkJVFJBQ0UoIkdFVE1BWExQVFxuIik7IAoJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFMUFRbbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQk7CgkJcmV0dXJuIEZMQUdfTFBUICsgbWF4OwoKCWNhc2UgR0VUQkFTRUlSUToKCQlUUkFDRSgiR0VUQkFTRUlSUVxuIik7IAoJCS8qIEZJWE1FOiB1c2UgdGFibGVzICovCgkJLyoganVzdCBmYWtlIHNvbWV0aGluZyBmb3Igbm93ICovCgkJaWYgKGNpZCAmIEZMQUdfTFBUKSB7CgkJCS8qIExQVDE6IGlycSA3LCBMUFQyOiBpcnEgNSAqLwoJCQlyZXR1cm4gKGNpZCAmIDB4N2YpID8gNSA6IDc7CgkJfSBlbHNlIHsKCQkJLyogQ09NMTogaXJxIDQsIENPTTI6IGlycSAzLAoJCQkgICBDT00zOiBpcnEgNCwgQ09NNDogaXJxIDMgKi8KCQkJcmV0dXJuIDQgLSAoY2lkICYgMSk7CgkJfQoJfQoKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCWNhc2UgUkVTRVRERVY6CgljYXNlIENMUkRUUjoKCWNhc2UgQ0xSUlRTOgoJY2FzZSBTRVREVFI6CgljYXNlIFNFVFJUUzoKCWNhc2UgU0VUWE9GRjoKCWNhc2UgU0VUWE9OOgoJCWlmKEVzY2FwZUNvbW1GdW5jdGlvbihwdHItPmhhbmRsZSxuRnVuY3Rpb24pKQoJCQlyZXR1cm4gMDsKCQllbHNlIHsKCQkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCWNhc2UgQ0xSQlJFQUs6CgljYXNlIFNFVEJSRUFLOgoJZGVmYXVsdDoKCQlXQVJOKCIoY2lkPSVkLG5GdW5jdGlvbj0lZCk6IFVua25vd24gZnVuY3Rpb25cbiIsIAoJCQljaWQsIG5GdW5jdGlvbik7Cgl9CglyZXR1cm4gLTE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglGbHVzaENvbW0JKFVTRVIuMjE1KQogKi8KSU5UMTYgV0lOQVBJIEZsdXNoQ29tbTE2KElOVDE2IGNpZCxJTlQxNiBmblF1ZXVlKQp7CglEV09SRCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgljYXNlIDA6CgkJcXVldWUgPSBQVVJHRV9UWEFCT1JUOwoJCXB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJYnJlYWs7CgljYXNlIDE6CgkJcXVldWUgPSBQVVJHRV9SWEFCT1JUOwoJCXB0ci0+aWJ1Zl9oZWFkID0gcHRyLT5pYnVmX3RhaWw7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVdBUk4oIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwgCgkJICAgICAgICAgICAgY2lkLCBmblF1ZXVlKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCFQdXJnZUNvbW0ocHRyLT5oYW5kbGUscXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfSAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwoKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQogICAgICAgIGlmIChjaWQmRkxBR19MUFQpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiBDRV9NT0RFOwogICAgICAgIH0KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKilDT01bY2lkXS51bmtub3duICsgQ09NTV9NU1JfT0ZGU0VUOwoJQ09NTV9NU1JVcGRhdGUoIHB0ci0+aGFuZGxlLCBzdG9sICk7CgoJaWYgKGxwU3RhdCkgewoJCUhBTkRMRSByd19ldmVudHNbMl07CgoJCWxwU3RhdC0+c3RhdHVzID0gMDsKCgkJcndfZXZlbnRzWzBdID0gQ09NW2NpZF0ucmVhZF9vdi5oRXZlbnQ7CgkJcndfZXZlbnRzWzFdID0gQ09NW2NpZF0ud3JpdGVfb3YuaEV2ZW50OwoKCQlXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoMiwmcndfZXZlbnRzWzBdLEZBTFNFLDEsVFJVRSk7CgoJCWxwU3RhdC0+Y2JPdXRRdWUgPSBjb21tX291dGJ1ZihwdHIpOwoJCWxwU3RhdC0+Y2JJblF1ZSA9IGNvbW1faW5idWYocHRyKTsKCiAgICAJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBzdGF0ICVkIGluICVkIG91dCAlZCwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCBscFN0YXQtPnN0YXR1cywgbHBTdGF0LT5jYkluUXVlLCAKCQkJICAgICBscFN0YXQtPmNiT3V0UXVlLCAqc3RvbCk7Cgl9CgllbHNlCgkJVFJBQ0UoImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCBOVUxMIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgKnN0b2wpOwoKCS8qIFJldHVybiBhbnkgZXJyb3JzIGFuZCBjbGVhciBpdCAqLwoJdGVtcGVycm9yID0gcHRyLT5jb21tZXJyb3I7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4odGVtcGVycm9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1FdmVudE1hc2sJKFVTRVIuMjA4KQogKi8KU0VHUFRSIFdJTkFQSSBTZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmdUV2dE1hc2spCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAoU0VHUFRSKU5VTEw7Cgl9CgoJcHRyLT5ldmVudG1hc2sgPSBmdUV2dE1hc2s7CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiAgICAgICAgfQogICAgICAgIC8qIGl0J3MgYSBDT00gcG9ydCA/IC0+IG1vZGlmeSBmbGFncyAqLwogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCglUUkFDRSgiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwoJcmV0dXJuIFNFR1BUUl9HRVQoQ09NW2NpZF0udW5rbm93bik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOSkKICovClVJTlQxNiBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZm5FdnRDbGVhcikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJV09SRCBldmVudHM7CgogICAgCVRSQUNFKCJjaWQgJWQsIG1hc2sgJWRcbiIsIGNpZCwgZm5FdnRDbGVhcik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAwOwoJfQoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJZXZlbnRzID0gKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJiBmbkV2dENsZWFyOwoJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJj0gfmZuRXZ0Q2xlYXI7CglyZXR1cm4gZXZlbnRzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlCShVU0VSLjIwMSkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tU3RhdGUxNihMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglEQ0IgZGNiOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGxwZGNiLT5JZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QobHBkY2ItPklkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsbHBkY2ItPklkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtc2V0KCZkY2IsMCxzaXplb2YgZGNiKTsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YgZGNiOwoJaWYobHBkY2ItPkJhdWRSYXRlPT01NzYwMSkKCQlkY2IuQmF1ZFJhdGUgPSAxMTUyMDA7CiAgICAgICAgZWxzZQoJCWRjYi5CYXVkUmF0ZSA9IGxwZGNiLT5CYXVkUmF0ZTsKCQogICAgICAgIGRjYi5CeXRlU2l6ZT1scGRjYi0+Qnl0ZVNpemU7CiAgICAgICAgZGNiLlN0b3BCaXRzPWxwZGNiLT5TdG9wQml0czsKCglkY2IuZlBhcml0eT1scGRjYi0+ZlBhcml0eTsKCWRjYi5QYXJpdHk9bHBkY2ItPlBhcml0eTsKCglkY2IuZk91dHhDdHNGbG93ID0gbHBkY2ItPmZPdXR4Q3RzRmxvdzsKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdykKCQlkY2IuZlJ0c0NvbnRyb2wgPSBUUlVFOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpIAoJCWRjYi5mRHRyQ29udHJvbCA9IFRSVUU7CgoJcHRyLT5ldnRjaGFyID0gbHBkY2ItPkV2dENoYXI7CgoJZGNiLmZJblggPSBscGRjYi0+ZkluWDsKCWRjYi5mT3V0WCA9IGxwZGNiLT5mT3V0WDsKICAgICAgICAKCWlmICghU2V0Q29tbVN0YXRlKHB0ci0+aGFuZGxlLCZkY2IpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1TdGF0ZQkoVVNFUi4yMDIpCiAqLwpJTlQxNiBXSU5BUEkgR2V0Q29tbVN0YXRlMTYoSU5UMTYgY2lkLCBMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglEQ0IgZGNiOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGNpZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoIUdldENvbW1TdGF0ZShwdHItPmhhbmRsZSwmZGNiKSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoKCWxwZGNiLT5JZCA9IGNpZDsKCglDT01NMTZfRENCdG9EQ0IxNigmZGNiLGxwZGNiKTsKCglscGRjYi0+RXZ0Q2hhciA9IHB0ci0+ZXZ0Y2hhcjsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIGRhdGEgJWQgXG4iLCBjaWQsIGNoVHJhbnNtaXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnhtaXQgPj0gMCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1RYRlVMTDsKCSAgcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgewoJICAvKiB0cmFuc21pdCBxdWV1ZSBlbXB0eSwgdHJ5IHRvIHRyYW5zbWl0IGRpcmVjdGx5ICovCgkgIERXT1JEIGxlbjsKCSAgaWYoIVdyaXRlRmlsZShwdHItPmhhbmRsZSwgJmNoVHJhbnNtaXQsIDEsICZsZW4sIE5VTEwpKSB7CgkgICAgLyogZGlkbid0IHdvcmssIHF1ZXVlIGl0ICovCgkgICAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgICBjb21tX3dhaXR3cml0ZShwdHIpOwoJICB9Cgl9IGVsc2UgewoJICAvKiBkYXRhIGluIHF1ZXVlLCBsZXQgdGhpcyBjaGFyIGJlIHRyYW5zbWl0dGVkIG5leHQgKi8KCSAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVuZ2V0Q29tbUNoYXIJKFVTRVIuMjEyKQogKi8KSU5UMTYgV0lOQVBJIFVuZ2V0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFVuZ2V0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQgKGNoYXIgJWQpXG4iLCBjaWQsIGNoVW5nZXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJLyogcmVhZCB1bmdldCBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkJKmxwdkJ1ZisrID0gcHRyLT51bmdldDsKCQlwdHItPnVuZ2V0ID0gLTE7CgoJCWxlbmd0aCA9IDE7Cgl9IGVsc2UKCSAJbGVuZ3RoID0gMDsKCgkvKiByZWFkIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KCXdoaWxlIChsZW5ndGggPCBjYlJlYWQpIHsKCSAgc3RhdHVzID0gKChwdHItPmlidWZfaGVhZCA8IHB0ci0+aWJ1Zl90YWlsKSA/CgkJICAgIHB0ci0+aWJ1Zl9zaXplIDogcHRyLT5pYnVmX2hlYWQpIC0gcHRyLT5pYnVmX3RhaWw7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYlJlYWQgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiUmVhZCAtIGxlbmd0aDsKCgkgIG1lbWNweShscHZCdWYsIHB0ci0+aW5idWYgKyBwdHItPmlidWZfdGFpbCwgc3RhdHVzKTsKCSAgcHRyLT5pYnVmX3RhaWwgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5pYnVmX3RhaWwgPj0gcHRyLT5pYnVmX3NpemUpCgkgICAgcHRyLT5pYnVmX3RhaWwgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJfQoKCVRSQUNFKCIlLipzXG4iLCBsZW5ndGgsIG9yZ0J1Zik7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoJCglUUkFDRSgiJS4qc1xuIiwgY2JXcml0ZSwgbHB2QnVmICk7CgoJbGVuZ3RoID0gMDsKCXdoaWxlIChsZW5ndGggPCBjYldyaXRlKSB7CgkgIGlmICgocHRyLT5vYnVmX2hlYWQgPT0gcHRyLT5vYnVmX3RhaWwpICYmIChwdHItPnhtaXQgPCAwKSkgewoJICAgIC8qIG5vIGRhdGEgcXVldWVkLCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgKi8KCSAgICBpZighV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCBscHZCdWYsIGNiV3JpdGUgLSBsZW5ndGgsIChMUERXT1JEKSZzdGF0dXMsIE5VTEwpKQoJICAgICAgc3RhdHVzID0gLTE7CgkgICAgaWYgKHN0YXR1cyA+IDApIHsKCSAgICAgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgICAgICBsZW5ndGggKz0gc3RhdHVzOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICB9CgkgIC8qIGNhbid0IHdyaXRlIGRpcmVjdGx5LCBwdXQgaW50byB0cmFuc21pdCBidWZmZXIgKi8KCSAgc3RhdHVzID0gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/CgkJICAgIChwdHItPm9idWZfdGFpbC0xKSA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl9oZWFkOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JXcml0ZSAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JXcml0ZSAtIGxlbmd0aDsKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfaGVhZCwgc3RhdHVzKTsKCSAgcHRyLT5vYnVmX2hlYWQgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5vYnVmX2hlYWQgPj0gcHRyLT5vYnVmX3NpemUpCgkgICAgcHRyLT5vYnVmX2hlYWQgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsJCglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24gICAoVVNFUi4yNDUpCiAqLwpCT09MMTYgV0lOQVBJIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24xNiggSU5UMTYgY2lkLCBIV05EMTYgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjYldyaXRlTm90aWZ5LCBJTlQxNiBjYk91dFF1ZXVlICkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCIoJWQsICV4LCAlZCwgJWQpXG4iLCBjaWQsIGh3bmQsIGNiV3JpdGVOb3RpZnksIGNiT3V0UXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IFdJTl9IYW5kbGUzMiggaHduZCApOwoJcHRyLT5uX3JlYWQgPSBjYldyaXRlTm90aWZ5OwoJcHRyLT5uX3dyaXRlID0gY2JPdXRRdWV1ZTsKCXJldHVybiBUUlVFOwp9Cgo=