IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RSSU5HU19ICiMgaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAiY29tbS5oIgojaWZkZWYgSEFWRV9TWVNfTU9ERU1fSAojIGluY2x1ZGUgPHN5cy9tb2RlbS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NUUlRJT19ICiMgaW5jbHVkZSA8c3lzL3N0cnRpby5oPgojZW5kaWYKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKCiNpbmNsdWRlICJzZXJ2ZXIuaCIKI2luY2x1ZGUgInByb2Nlc3MuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJzZXJ2aWNlcy5oIgojaW5jbHVkZSAiZmlsZS5oIgoKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChjb21tKTsKCiNpZm5kZWYgVElPQ0lOUQojZGVmaW5lCVRJT0NJTlEgRklPTlJFQUQKI2VuZGlmCiNkZWZpbmUgQ09NTV9NU1JfT0ZGU0VUICAzNSAgICAgICAvKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107Ci8qIHBvaW50ZXJzIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIApMUENWT0lEICp1bmtub3duW01BWF9QT1JUU107Ci8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBtX3N0YXRbTUFYX1BPUlRTXTsKCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCXN0cnVjdCBzdGF0IHN0OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNlcmlhbHBvcnRzIiwgb3B0aW9uLCAiKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZQoJCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZSAKCQkJCWlmICgoTFBUW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCQllbHNlIHsKCQkJCQlMUFRbeF0uZmQgPSAwOwoJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQl9CiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGZkKQp7CglpZiAoKGZkJjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoZmQmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtmZF0uZmQpCgkJICAgIHJldHVybiAmQ09NW2ZkXTsKCSAgICB9IGVsc2UgewoJCWZkICY9IDB4N2Y7CgkJaWYgKExQVFtmZF0uZmQpCgkJICAgIHJldHVybiAmTFBUW2ZkXTsKCSAgICB9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBpbnQgICAgR2V0Q29tbVBvcnRfZmQoaW50IGZkKQp7CiAgICAgICAgaW50IHg7CiAgICAgICAgCiAgICAgICAgZm9yICh4PTA7IHg8TUFYX1BPUlRTOyB4KyspIHsKICAgICAgICAgICAgIGlmIChDT01beF0uZmQgPT0gZmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICB9CiAgICAgICAKICAgICAgIHJldHVybiAtMTsKfSAKCnN0YXRpYyBpbnQgVmFsaWRDT01Qb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIENPTVt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgpzdGF0aWMgaW50IFZhbGlkTFBUUG9ydChpbnQgeCkKewoJcmV0dXJuKHggPCBNQVhfUE9SVFMgPyAoaW50KSBMUFRbeF0uZGV2aWNlbmFtZSA6IDApOyAKfQoKc3RhdGljIGludCBXaW5FcnJvcih2b2lkKQp7CiAgICAgICAgVFJBQ0UoImVycm5vID0gJWRcbiIsIGVycm5vKTsKCXN3aXRjaCAoZXJybm8pIHsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gQ0VfSU9FOwoJCX0KfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1faW5idWYoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgcmV0dXJuICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyBwdHItPmlidWZfc2l6ZSA6IDApCiAgICArIHB0ci0+aWJ1Zl9oZWFkIC0gcHRyLT5pYnVmX3RhaWw7Cn0KCnN0YXRpYyB1bnNpZ25lZCBjb21tX291dGJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/IHB0ci0+b2J1Zl9zaXplIDogMCkKICAgICsgcHRyLT5vYnVmX2hlYWQgLSBwdHItPm9idWZfdGFpbDsKfQoKc3RhdGljIGludCBDT01NX1doYWNrTW9kZW0oaW50IGZkLCB1bnNpZ25lZCBpbnQgYW5keSwgdW5zaWduZWQgaW50IG9ycmllKQp7CiAgICB1bnNpZ25lZCBpbnQgbXN0YXQsIG9rYXk7CiAgICBva2F5ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwogICAgaWYgKG9rYXkpIHJldHVybiBva2F5OwogICAgaWYgKGFuZHkpIG1zdGF0ICY9IGFuZHk7CiAgICBtc3RhdCB8PSBvcnJpZTsKICAgIHJldHVybiBpb2N0bChmZCwgVElPQ01TRVQsICZtc3RhdCk7Cn0KCQpzdGF0aWMgdm9pZCBDQUxMQkFDSyBjb21tX25vdGlmaWNhdGlvbiggVUxPTkdfUFRSIHByaXZhdGUgKQp7CiAgc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyID0gKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKilwcml2YXRlOwogIGludCBwcmV2LCBibGVmdCwgbGVuOwogIFdPUkQgbWFzayA9IDA7CiAgaW50IGNpZCA9IEdldENvbW1Qb3J0X2ZkKHB0ci0+ZmQpOwoKICBUUkFDRSgiYXN5bmMgbm90aWZpY2F0aW9uXG4iKTsKICAvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KICBwcmV2ID0gY29tbV9pbmJ1ZihwdHIpOwogIGRvIHsKICAgIGJsZWZ0ID0gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IChwdHItPmlidWZfdGFpbC0xKSA6IHB0ci0+aWJ1Zl9zaXplKQogICAgICAtIHB0ci0+aWJ1Zl9oZWFkOwogICAgbGVuID0gcmVhZChwdHItPmZkLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIGJsZWZ0P2JsZWZ0OjEpOwogICAgaWYgKGxlbiA+IDApIHsKICAgICAgaWYgKCFibGVmdCkgewoJcHRyLT5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CiAgICAgIH0gZWxzZSB7CgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgbGVuKSkgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1JYRkxBRzsKCSAgbWFzayB8PSBDTl9FVkVOVDsKCX0KCWlmIChwdHItPmV2ZW50bWFzayAmIEVWX1JYQ0hBUikgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1JYQ0hBUjsKCSAgbWFzayB8PSBDTl9FVkVOVDsKCX0KCS8qIGFkdmFuY2UgYnVmZmVyIHBvc2l0aW9uICovCglwdHItPmlidWZfaGVhZCArPSBsZW47CglpZiAocHRyLT5pYnVmX2hlYWQgPj0gcHRyLT5pYnVmX3NpemUpCgkgIHB0ci0+aWJ1Zl9oZWFkID0gMDsKICAgICAgfQogICAgfQogIH0gd2hpbGUgKGxlbiA+IDApOwogIC8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KICBpZiAocHRyLT53bmQgJiYgKHB0ci0+bl9yZWFkPjApICYmIChwcmV2PHB0ci0+bl9yZWFkKSAmJgogICAgICAoY29tbV9pbmJ1ZihwdHIpPj1wdHItPm5fcmVhZCkpIHsKICAgIC8qIHBhc3NlZCB0aGUgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhyZXNob2xkICovCiAgICBtYXNrIHw9IENOX1JFQ0VJVkU7CiAgfQoKICAvKiB3cml0ZSBhbnkgVHJhbnNtaXRDb21tQ2hhciBjaGFyYWN0ZXIgKi8KICBpZiAocHRyLT54bWl0Pj0wKSB7CiAgICBsZW4gPSB3cml0ZShwdHItPmZkLCAmKHB0ci0+eG1pdCksIDEpOwogICAgaWYgKGxlbiA+IDApIHB0ci0+eG1pdCA9IC0xOwogIH0KICAvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwogIHByZXYgPSBjb21tX291dGJ1ZihwdHIpOwogIGRvIHsKICAgIGJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPyBwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKQogICAgICAtIHB0ci0+b2J1Zl90YWlsOwogICAgbGVuID0gYmxlZnQgPyB3cml0ZShwdHItPmZkLCBwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl90YWlsLCBibGVmdCkgOiAwOwogICAgaWYgKGxlbiA+IDApIHsKICAgICAgcHRyLT5vYnVmX3RhaWwgKz0gbGVuOwogICAgICBpZiAocHRyLT5vYnVmX3RhaWwgPj0gcHRyLT5vYnVmX3NpemUpCglwdHItPm9idWZfdGFpbCA9IDA7CiAgICAgIC8qIGZsYWcgZXZlbnQgKi8KICAgICAgaWYgKHB0ci0+b2J1Zl90YWlsID09IHB0ci0+b2J1Zl9oZWFkKSB7CglpZiAocHRyLT5zX3dyaXRlKSB7CgkgIFNFUlZJQ0VfRGVsZXRlKCBwdHItPnNfd3JpdGUgKTsKCSAgcHRyLT5zX3dyaXRlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cgl9CiAgICAgICAgaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfVFhFTVBUWSkgewoJICAqKFdPUkQqKSh1bmtub3duW2NpZF0pIHw9IEVWX1RYRU1QVFk7CgkgIG1hc2sgfD0gQ05fRVZFTlQ7Cgl9CiAgICAgIH0KICAgIH0KICB9IHdoaWxlIChsZW4gPiAwKTsKICAvKiBjaGVjayBmb3Igbm90aWZpY2F0aW9uICovCiAgaWYgKHB0ci0+d25kICYmIChwdHItPm5fd3JpdGU+MCkgJiYgKHByZXY+PXB0ci0+bl93cml0ZSkgJiYKICAgICAgKGNvbW1fb3V0YnVmKHB0cik8cHRyLT5uX3dyaXRlKSkgewogICAgLyogcGFzc2VkIHRoZSB0cmFuc21pdCBub3RpZmljYXRpb24gdGhyZXNob2xkICovCiAgICBtYXNrIHw9IENOX1RSQU5TTUlUOwogIH0KCiAgLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KICBpZiAocHRyLT53bmQgJiYgbWFzaykgewogICAgVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CiAgICBQb3N0TWVzc2FnZTE2KHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwogIH0KfQoKc3RhdGljIHZvaWQgY29tbV93YWl0cmVhZChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICBpZiAocHRyLT5zX3JlYWQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHJldHVybjsKICBwdHItPnNfcmVhZCA9IFNFUlZJQ0VfQWRkT2JqZWN0KCBGSUxFX0R1cFVuaXhIYW5kbGUoIHB0ci0+ZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgfCBTWU5DSFJPTklaRSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tX25vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVMT05HX1BUUilwdHIgKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0d3JpdGUoc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyKQp7CiAgaWYgKHB0ci0+c193cml0ZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgcmV0dXJuOwogIHB0ci0+c193cml0ZSA9IFNFUlZJQ0VfQWRkT2JqZWN0KCBGSUxFX0R1cFVuaXhIYW5kbGUoIHB0ci0+ZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IFNZTkNIUk9OSVpFICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tX25vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVTE9OR19QVFIpcHRyICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQgkJKFVTRVIuMjEzKQogKi8KQk9PTDE2IFdJTkFQSSBCdWlsZENvbW1EQ0IxNihMUENTVFIgZGV2aWNlLCBMUERDQjE2IGxwZGNiKQp7CgkvKiAiQ09NMTo5NjAwLG4sOCwxIgkqLwoJLyogIDAxMjM0NQkJKi8KCWludCBwb3J0OwoJY2hhciAqcHRyLCB0ZW1wWzI1Nl07CgoJVFJBQ0UoIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgkKCgkJaWYgKHBvcnQtLSA9PSAwKSB7CgkJCUVSUigiQlVHICEgQ09NMCBjYW4ndCBleGlzdCEuXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJaWYgKCFWYWxpZENPTVBvcnQocG9ydCkpIHsKCQkJRklYTUUoImludmFsaWQgQ09NIHBvcnQgJWQ/XG4iLHBvcnQpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCQoJCW1lbXNldChscGRjYiwgMCwgc2l6ZW9mKERDQjE2KSk7IC8qIGluaXRpYWxpemUgKi8KCgkJbHBkY2ItPklkID0gcG9ydDsKCQkKCQlpZiAoISooZGV2aWNlKzQpKQoJCQlyZXR1cm4gMDsKCgkJaWYgKCooZGV2aWNlKzQpICE9ICc6JykKCQkJcmV0dXJuIC0xOwoJCQoJCXN0cmNweSh0ZW1wLGRldmljZSs1KTsKCQlwdHIgPSBzdHJ0b2sodGVtcCwgIiwgIik7IAoKCQlpZiAoQ09NW3BvcnRdLmJhdWRyYXRlID4gMCkKCQkJbHBkY2ItPkJhdWRSYXRlID0gQ09NW3BvcnRdLmJhdWRyYXRlOwoJCWVsc2UKCQkJbHBkY2ItPkJhdWRSYXRlID0gYXRvaShwdHIpOwogICAgICAgIAlUUkFDRSgiYmF1ZHJhdGUgKCVkKVxuIiwgbHBkY2ItPkJhdWRSYXRlKTsKCgkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOwoJCWlmIChpc2xvd2VyKCpwdHIpKQoJCQkqcHRyID0gdG91cHBlcigqcHRyKTsKCiAgICAgICAgCVRSQUNFKCJwYXJpdHkgKCVjKVxuIiwgKnB0cik7CgkJbHBkY2ItPmZQYXJpdHkgPSBUUlVFOwoJCXN3aXRjaCAoKnB0cikgewoJCQljYXNlICdOJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBOT1BBUklUWTsKCQkJCWxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnRSc6CgkJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdNJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBNQVJLUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ08nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsKCQkJCWJyZWFrOwkJCQoJCQlkZWZhdWx0OgoJCQkJV0FSTigiVW5rbm93biBwYXJpdHkgYCVjJyFcbiIsICpwdHIpOwoJCQkJcmV0dXJuIC0xOwoJCX0KCgkJcHRyID0gc3RydG9rKE5VTEwsICIsICIpOyAKICAgICAgICAgCVRSQUNFKCJjaGFyc2l6ZSAoJWMpXG4iLCAqcHRyKTsKCQlscGRjYi0+Qnl0ZVNpemUgPSAqcHRyIC0gJzAnOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CiAgICAgICAgCVRSQUNFKCJzdG9wYml0cyAoJWMpXG4iLCAqcHRyKTsKCQlzd2l0Y2ggKCpwdHIpIHsKCQkJY2FzZSAnMSc6CgkJCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJzInOgoJCQkJbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgkJCQlicmVhazsJCQkKCQkJZGVmYXVsdDoKCQkJCVdBUk4oIlVua25vd24gIyBvZiBzdG9wYml0cyBgJWMnIVxuIiwgKnB0cik7CgkJCQlyZXR1cm4gLTE7CgkJfQoJfQkKCglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCU9wZW5Db21tCQkoVVNFUi4yMDApCiAqLwpJTlQxNiBXSU5BUEkgT3BlbkNvbW0xNihMUENTVFIgZGV2aWNlLFVJTlQxNiBjYkluUXVldWUsVUlOVDE2IGNiT3V0UXVldWUpCnsKCWludCBwb3J0LGZkOwoKICAgIAlUUkFDRSgiJXMsICVkLCAlZFxuIiwgZGV2aWNlLCBjYkluUXVldWUsIGNiT3V0UXVldWUpOwoKCWlmIChzdHJsZW4oZGV2aWNlKSA8IDQpCgkgICByZXR1cm4gSUVfQkFESUQ7CgoJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApCgkJRVJSKCJCVUcgISBDT00wIG9yIExQVDAgZG9uJ3QgZXhpc3QgIVxuIik7CgoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiQ09NIiwzKSkgewoJCQogICAgICAgICAgICAgICAgVFJBQ0UoIiVzID0gJXNcbiIsIGRldmljZSwgQ09NW3BvcnRdLmRldmljZW5hbWUpOwoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoQ09NW3BvcnRdLmZkKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJZmQgPSBvcGVuKENPTVtwb3J0XS5kZXZpY2VuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKCQlpZiAoZmQgPT0gLTEpIHsKCQkJRVJSKCJlcnJvcj0lZFxuIiwgZXJybm8pOwoJCQlyZXR1cm4gSUVfSEFSRFdBUkU7CgkJfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bltwb3J0XSA9IFNFR1BUUl9BTExPQyg0MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ6ZXJvKHVua25vd25bcG9ydF0sNDApOwoJCQlDT01bcG9ydF0uZmQgPSBmZDsKCQkJQ09NW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUNPTVtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlDT01bcG9ydF0uZXZ0Y2hhciA9IDA7IC8qIEZJWE1FOiBkZWZhdWx0PyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRlcm1pbmFsIHN0YXRlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHRjZ2V0YXR0cihmZCwmbV9zdGF0W3BvcnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihDT01bcG9ydF0uYmF1ZHJhdGU+LTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRENCMTYgZGNiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tbVN0YXRlMTYocG9ydCwgJmRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2IuQmF1ZFJhdGU9Q09NW3BvcnRdLmJhdWRyYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBkZWZhdWx0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGFiaXRzLCBwYXJpdHksIHN0b3BiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbW1TdGF0ZTE2KCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkvKiBpbml0IHByaW9yaXR5IGNoYXJhY3RlcnMgKi8KCQkJQ09NW3BvcnRdLnVuZ2V0ID0gLTE7CgkJCUNPTVtwb3J0XS54bWl0ID0gLTE7CgkJCS8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KCQkJQ09NW3BvcnRdLmlidWZfc2l6ZSA9IGNiSW5RdWV1ZTsKCQkJQ09NW3BvcnRdLmlidWZfaGVhZCA9IENPTVtwb3J0XS5pYnVmX3RhaWw9IDA7CgkJCUNPTVtwb3J0XS5vYnVmX3NpemUgPSBjYk91dFF1ZXVlOwoJCQlDT01bcG9ydF0ub2J1Zl9oZWFkID0gQ09NW3BvcnRdLm9idWZfdGFpbCA9IDA7CgoJCQlDT01bcG9ydF0uaW5idWYgPSBtYWxsb2MoY2JJblF1ZXVlKTsKCQkJaWYgKENPTVtwb3J0XS5pbmJ1ZikgewoJCQkgIENPTVtwb3J0XS5vdXRidWYgPSBtYWxsb2MoY2JPdXRRdWV1ZSk7CgkJCSAgaWYgKCFDT01bcG9ydF0ub3V0YnVmKQoJCQkgICAgZnJlZShDT01bcG9ydF0uaW5idWYpOwoJCQl9IGVsc2UgQ09NW3BvcnRdLm91dGJ1ZiA9IE5VTEw7CgkJCWlmICghQ09NW3BvcnRdLm91dGJ1ZikgewoJCQkgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCgkJCSAgdGNzZXRhdHRyKENPTVtwb3J0XS5mZCxUQ1NBTk9XLCZtX3N0YXRbcG9ydF0pOwoJCQkgIGNsb3NlKENPTVtwb3J0XS5mZCk7CgkJCSAgRVJSKCJvdXQgb2YgbWVtb3J5Iik7CgkJCSAgcmV0dXJuIElFX01FTU9SWTsKCQkJfQoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NW3BvcnRdLnNfcmVhZCA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0uc193cml0ZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICBjb21tX3dhaXRyZWFkKCAmQ09NW3BvcnRdICk7CgkJCXJldHVybiBwb3J0OwoJCX0KCX0gCgllbHNlIAoJaWYgKCFsc3RybmNtcGlBKGRldmljZSwiTFBUIiwzKSkgewoJCgkJaWYgKCFWYWxpZExQVFBvcnQocG9ydCkpCgkJCXJldHVybiBJRV9CQURJRDsKCgkJaWYgKExQVFtwb3J0XS5mZCkKCQkJcmV0dXJuIElFX09QRU47CgoJCWZkID0gb3BlbihMUFRbcG9ydF0uZGV2aWNlbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSywgMCk7CgkJaWYgKGZkID09IC0xKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uZmQgPSBmZDsKCQkJTFBUW3BvcnRdLmNvbW1lcnJvciA9IDA7CgkJCUxQVFtwb3J0XS5ldmVudG1hc2sgPSAwOwoJCQlyZXR1cm4gcG9ydHxGTEFHX0xQVDsKCQl9Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsb3NlQ29tbQkJKFVTRVIuMjA3KQogKi8KSU5UMTYgV0lOQVBJIENsb3NlQ29tbTE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIAogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCEoY2lkJkZMQUdfTFBUKSkgewoJCS8qIENPTSBwb3J0ICovCgkJU0VHUFRSX0ZSRUUodW5rbm93bltjaWRdKTsgLyogW0xXXSAqLwoKCQlTRVJWSUNFX0RlbGV0ZSggQ09NW2NpZF0uc193cml0ZSApOwoJCVNFUlZJQ0VfRGVsZXRlKCBDT01bY2lkXS5zX3JlYWQgKTsKCQkvKiBmcmVlIGJ1ZmZlcnMgKi8KCQlmcmVlKHB0ci0+b3V0YnVmKTsKCQlmcmVlKHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCXRjc2V0YXR0cihwdHItPmZkLFRDU0FOT1csJm1fc3RhdFtjaWRdKTsKCX0KCglpZiAoY2xvc2UocHRyLT5mZCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJLyogRklYTUU6IHNob3VsZCB3ZSBjbGVhciBwdHItPmZkIGhlcmU/ICovCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcHRyLT5mZCA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCQkoVVNFUi4yMTEpCiAqLwpJTlQxNiBXSU5BUEkgQ2xlYXJDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICghKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCXB0ci0+c3VzcGVuZGVkID0gMDsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRXNjYXBlQ29tbUZ1bmN0aW9uCShVU0VSLjIxNCkKICovCkxPTkcgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbjE2KFVJTlQxNiBjaWQsVUlOVDE2IG5GdW5jdGlvbikKewoJaW50CW1heDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CgogICAgCVRSQUNFKCJjaWQ9JWQsIGZ1bmN0aW9uPSVkXG4iLCBjaWQsIG5GdW5jdGlvbik7CglpZiAoKG5GdW5jdGlvbiAhPSBHRVRNQVhDT00pICYmIChuRnVuY3Rpb24gIT0gR0VUTUFYTFBUKSkgewoJCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKHRjZ2V0YXR0cihwdHItPmZkLCZwb3J0KSA9PSAtMSkgewoJCSAgICAgICAgVFJBQ0UoInRjZ2V0YXR0ciBmYWlsZWRcbiIpOwoJCQlwdHItPmNvbW1lcnJvcj1XaW5FcnJvcigpOwkKCQkJcmV0dXJuIC0xOwoJCX0KCX0gZWxzZSBwdHIgPSBOVUxMOwoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkgICAgICAgIFRSQUNFKCJSRVNFVERFVlxuIik7CgkJCWJyZWFrOwkJCQkJCgoJCWNhc2UgR0VUTUFYQ09NOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWENPTVxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshQ09NW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIG1heDsKCQkJYnJlYWs7CgoJCWNhc2UgR0VUTUFYTFBUOgoJCSAgICAgICAgVFJBQ0UoIkdFVE1BWExQVFxuIik7IAoJCQlmb3IgKG1heCA9IE1BWF9QT1JUUzshTFBUW21heF0uZGV2aWNlbmFtZTttYXgtLSkKCQkJCTsKCQkJcmV0dXJuIEZMQUdfTFBUICsgbWF4OwoJCQlicmVhazsKCgkJY2FzZSBHRVRCQVNFSVJROgoJCSAgICAgICAgVFJBQ0UoIkdFVEJBU0VJUlFcbiIpOyAKCQkJLyogRklYTUU6IHVzZSB0YWJsZXMgKi8KCQkJLyoganVzdCBmYWtlIHNvbWV0aGluZyBmb3Igbm93ICovCgkJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkJLyogTFBUMTogaXJxIDcsIExQVDI6IGlycSA1ICovCgkJCQlyZXR1cm4gKGNpZCAmIDB4N2YpID8gNSA6IDc7CgkJCX0gZWxzZSB7CgkJCQkvKiBDT00xOiBpcnEgNCwgQ09NMjogaXJxIDMsCgkJCQkgICBDT00zOiBpcnEgNCwgQ09NNDogaXJxIDMgKi8KCQkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIENMUkRUUjoKCQkgICAgICAgIFRSQUNFKCJDTFJEVFJcbiIpOyAKI2lmZGVmIFRJT0NNX0RUUgoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9EVFIsIDApOwojZW5kaWYKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOyAKI2lmZGVmIFRJT0NNX1JUUwoJCQlyZXR1cm4gQ09NTV9XaGFja01vZGVtKHB0ci0+ZmQsIH5USU9DTV9SVFMsIDApOwojZW5kaWYKCQoJCWNhc2UgU0VURFRSOgoJCSAgICAgICAgVFJBQ0UoIlNFVERUUlxuIik7IAojaWZkZWYgVElPQ01fRFRSCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fRFRSKTsKI2VuZGlmCgoJCWNhc2UgU0VUUlRTOgoJCSAgICAgICAgVFJBQ0UoIlNFVFJUU1xuIik7IAojaWZkZWYgVElPQ01fUlRTCQkJCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgMCwgVElPQ01fUlRTKTsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT0ZGXG4iKTsgCgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPTlxuIik7IAoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWNpZCwgbkZ1bmN0aW9uKTsKCQkJYnJlYWs7CQkJCQoJfQoJCglpZiAodGNzZXRhdHRyKHB0ci0+ZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZsdXNoQ29tbQkoVVNFUi4yMTUpCiAqLwpJTlQxNiBXSU5BUEkgRmx1c2hDb21tMTYoSU5UMTYgY2lkLElOVDE2IGZuUXVldWUpCnsKCWludCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgkJY2FzZSAwOgoJCSAgcXVldWUgPSBUQ09GTFVTSDsKCQkgIHB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJICBicmVhazsKCQljYXNlIDE6CgkJICBxdWV1ZSA9IFRDSUZMVVNIOwoJCSAgcHRyLT5pYnVmX2hlYWQgPSBwdHItPmlidWZfdGFpbDsKCQkgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICBXQVJOKCIoY2lkPSVkLGZuUXVldWU9JWQpOlVua25vd24gcXVldWVcbiIsIAoJCSAgICAgICAgICAgIGNpZCwgZm5RdWV1ZSk7CgkJICByZXR1cm4gLTE7CgkJfQoJaWYgKHRjZmx1c2gocHRyLT5mZCwgcXVldWUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiAtMTsJCgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gMDsKCX0KfSAgCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUVycm9yCShVU0VSLjIwMykKICovCklOVDE2IFdJTkFQSSBHZXRDb21tRXJyb3IxNihJTlQxNiBjaWQsTFBDT01TVEFUMTYgbHBTdGF0KQp7CglpbnQJCXRlbXBlcnJvcjsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwogICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bY2lkXSArIENPTU1fTVNSX09GRlNFVDsKICAgICAgICBpb2N0bChwdHItPmZkLFRJT0NNR0VULCZtc3RhdCk7CiAgICAgICAgaWYoIG1zdGF0JlRJT0NNX0NBUiApIAogICAgICAgICAgICAqc3RvbCB8PSAweDgwOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgICpzdG9sICY9MHg3ZjsKCglpZiAobHBTdGF0KSB7CgkJbHBTdGF0LT5zdGF0dXMgPSAwOwoKCQlscFN0YXQtPmNiT3V0UXVlID0gY29tbV9vdXRidWYocHRyKTsKCQlscFN0YXQtPmNiSW5RdWUgPSBjb21tX2luYnVmKHB0cik7CgogICAgCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0ICVkICVkICVkIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgCgkJCSAgICAgbHBTdGF0LT5jYk91dFF1ZSwgKnN0b2wpOwoJfQoJZWxzZQoJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBscFN0YXQgTlVMTCBzdG9sICV4XG4iLAoJCQkgICAgIGNpZCwgcHRyLT5jb21tZXJyb3IsICpzdG9sKTsKCgkvKiBSZXR1cm4gYW55IGVycm9ycyBhbmQgY2xlYXIgaXQgKi8KCXRlbXBlcnJvciA9IHB0ci0+Y29tbWVycm9yOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuKHRlbXBlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOCkKICovClNFR1BUUiBXSU5BUEkgU2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZnVFdnRNYXNrKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgdW5zaWduZWQgY2hhciAqc3RvbDsKICAgICAgICBpbnQgcmVwaWQ7CiAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCSAgICByZXR1cm4gKFNFR1BUUilOVUxMOwoJfQoKCXB0ci0+ZXZlbnRtYXNrID0gZnVFdnRNYXNrOwoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gKFNFR1BUUilOVUxMOwogICAgICAgIH0KICAgICAgICAvKiBpdCdzIGEgQ09NIHBvcnQgPyAtPiBtb2RpZnkgZmxhZ3MgKi8KICAgICAgICBzdG9sID0gKHVuc2lnbmVkIGNoYXIgKil1bmtub3duW2NpZF0gKyBDT01NX01TUl9PRkZTRVQ7CglyZXBpZCA9IGlvY3RsKHB0ci0+ZmQsVElPQ01HRVQsJm1zdGF0KTsKCVRSQUNFKCIgaW9jdGwgICVkLCBtc3IgJXggYXQgJXAgJXBcbiIscmVwaWQsbXN0YXQsc3RvbCx1bmtub3duW2NpZF0pOwoJaWYgKChtc3RhdCZUSU9DTV9DQVIpKQoJICAgICpzdG9sIHw9IDB4ODA7CgllbHNlCgkgICAgKnN0b2wgJj0weDdmOwoKCVRSQUNFKCIgbW9kZW0gZGNkIGNvbnN0cnVjdCAleFxuIiwqc3RvbCk7CglyZXR1cm4gU0VHUFRSX0dFVCh1bmtub3duW2NpZF0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDkpCiAqLwpVSU5UMTYgV0lOQVBJIEdldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZuRXZ0Q2xlYXIpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCVdPUkQgZXZlbnRzOwoKICAgIAlUUkFDRSgiY2lkICVkLCBtYXNrICVkXG4iLCBjaWQsIGZuRXZ0Q2xlYXIpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCEuXG4iLGNpZCk7CgkgICAgcmV0dXJuIDA7Cgl9CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCglldmVudHMgPSAqKFdPUkQqKSh1bmtub3duW2NpZF0pICYgZm5FdnRDbGVhcjsKCSooV09SRCopKHVua25vd25bY2lkXSkgJj0gfmZuRXZ0Q2xlYXI7CglyZXR1cm4gZXZlbnRzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlMTYJKFVTRVIuMjAxKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1TdGF0ZTE2KExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChscGRjYi0+SWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsbHBkY2ItPklkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAodGNnZXRhdHRyKHB0ci0+ZmQsICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfQoKCXBvcnQuY19jY1tWTUlOXSA9IDA7Cglwb3J0LmNfY2NbVlRJTUVdID0gMTsKCiNpZmRlZiBJTUFYQkVMCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSfElNQVhCRUwpOwojZWxzZQoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUik7CiNlbmRpZgoJcG9ydC5jX2lmbGFnIHw9IChJR05CUkspOwoKCXBvcnQuY19vZmxhZyAmPSB+KE9QT1NUKTsKCglwb3J0LmNfY2ZsYWcgJj0gfihIVVBDTCk7Cglwb3J0LmNfY2ZsYWcgfD0gQ0xPQ0FMIHwgQ1JFQUQ7CgoJcG9ydC5jX2xmbGFnICY9IH4oSUNBTk9OfEVDSE98SVNJRyk7Cglwb3J0LmNfbGZsYWcgfD0gTk9GTFNIOwoKICAgIAlUUkFDRSgiYmF1ZHJhdGUgJWRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgNTc2MDE6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTE1MjAwOwoJCQlicmVhazsJCQojZW5kaWYKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JBVURSQVRFOwoJCQlyZXR1cm4gLTE7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcG9ydC5jX2lzcGVlZCA9IHBvcnQuY19vc3BlZWQ7CiNlbmRpZgogICAgCVRSQUNFKCJieXRlc2l6ZSAlZFxuIixscGRjYi0+Qnl0ZVNpemUpOwoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAobHBkY2ItPkJ5dGVTaXplKSB7CgkJY2FzZSA1OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M1OwoJCQlicmVhazsKCQljYXNlIDY6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzY7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNzsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwoJCQlyZXR1cm4gLTE7Cgl9CgogICAgCVRSQUNFKCJmUGFyaXR5ICVkIFBhcml0eSAlZFxuIixscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSk7Cglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoJCgogICAgCVRSQUNFKCJzdG9wYml0cyAlZFxuIixscGRjYi0+U3RvcEJpdHMpOwoKCXN3aXRjaCAobHBkY2ItPlN0b3BCaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CgkJCXJldHVybiAtMTsKCX0KI2lmZGVmIENSVFNDVFMKCglpZiAobHBkY2ItPmZEdHJmbG93IHx8IGxwZGNiLT5mUnRzZmxvdyB8fCBscGRjYi0+Zk91dHhDdHNGbG93KQoJCXBvcnQuY19jZmxhZyB8PSBDUlRTQ1RTOwoKCWlmIChscGRjYi0+ZkR0ckRpc2FibGUpIAoJCXBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKI2VuZGlmCQoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJcHRyLT5ldnRjaGFyID0gbHBkY2ItPkV2dENoYXI7CgoJaWYgKHRjc2V0YXR0cihwdHItPmZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJaW50IHNwZWVkOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CglscGRjYi0+SWQgPSBjaWQ7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICAgICBzcGVlZCA9IHBvcnQuY19jZmxhZyAmIENCQVVEOwojZWxzZQogICAgICAgIHNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCiAgICAgICAgc3dpdGNoKHNwZWVkKSB7CgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSBCNTc2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDU3NjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMTsKCQkJYnJlYWs7CiNlbmRpZgoJfQojZW5kaWYKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgQ1NJWkUpIHsKCQljYXNlIENTNToKCQkJbHBkY2ItPkJ5dGVTaXplID0gNTsKCQkJYnJlYWs7CgkJY2FzZSBDUzY6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDY7CgkJCWJyZWFrOwoJCWNhc2UgQ1M3OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA3OwoJCQlicmVhazsKCQljYXNlIENTODoKCQkJbHBkY2ItPkJ5dGVTaXplID0gODsKCQkJYnJlYWs7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7Cglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKSB7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsJCQoJCQlicmVhazsKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQoJCWxwZGNiLT5TdG9wQml0cyA9IFRXT1NUT1BCSVRTOwoJZWxzZQoJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPlJsc1RpbWVvdXQgPSA1MDsKCWxwZGNiLT5DdHNUaW1lb3V0ID0gNTA7IAoJbHBkY2ItPkRzclRpbWVvdXQgPSA1MDsKCWxwZGNiLT5mTnVsbCA9IDA7CglscGRjYi0+ZkNoRXZ0ID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCWxwZGNiLT5mRHRyRGlzYWJsZSA9IDA7CgojaWZkZWYgQ1JUU0NUUwoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJbHBkY2ItPmZEdHJmbG93ID0gMTsKCQlscGRjYi0+ZlJ0c2Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJCWxwZGNiLT5mT3V0eERzckZsb3cgPSAxOwoJfSBlbHNlIAojZW5kaWYKCQlscGRjYi0+ZkR0ckRpc2FibGUgPSAxOwoKCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0gCglscGRjYi0+WG9mZkNoYXIgPSAKICovCglscGRjYi0+WG9uTGltID0gMTA7CglscGRjYi0+WG9mZkxpbSA9IDEwOwoKCWxwZGNiLT5FdnRDaGFyID0gcHRyLT5ldnRjaGFyOwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVHJhbnNtaXRDb21tQ2hhcgkoVVNFUi4yMDYpCiAqLwpJTlQxNiBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVHJhbnNtaXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgZGF0YSAlZCBcbiIsIGNpZCwgY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnhtaXQgPj0gMCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1RYRlVMTDsKCSAgcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgewoJICAvKiB0cmFuc21pdCBxdWV1ZSBlbXB0eSwgdHJ5IHRvIHRyYW5zbWl0IGRpcmVjdGx5ICovCgkgIGlmICh3cml0ZShwdHItPmZkLCAmY2hUcmFuc21pdCwgMSkgPT0gLTEpIHsKCSAgICAvKiBkaWRuJ3Qgd29yaywgcXVldWUgaXQgKi8KCSAgICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICAgIGNvbW1fd2FpdHdyaXRlKHB0cik7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIGRhdGEgaW4gcXVldWUsIGxldCB0aGlzIGNoYXIgYmUgdHJhbnNtaXR0ZWQgbmV4dCAqLwoJICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVW5nZXRDb21tQ2hhcgkoVVNFUi4yMTIpCiAqLwpJTlQxNiBXSU5BUEkgVW5nZXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVW5nZXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCAoY2hhciAlZClcbiIsIGNpZCwgY2hVbmdldCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCS8qIHJlYWQgdW5nZXQgY2hhcmFjdGVyICovCglpZiAocHRyLT51bmdldD49MCkgewoJCSpscHZCdWYrKyA9IHB0ci0+dW5nZXQ7CgkJcHRyLT51bmdldCA9IC0xOwoKCQlsZW5ndGggPSAxOwoJfSBlbHNlCgkgCWxlbmd0aCA9IDA7CgoJLyogcmVhZCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCgl3aGlsZSAobGVuZ3RoIDwgY2JSZWFkKSB7CgkgIHN0YXR1cyA9ICgocHRyLT5pYnVmX2hlYWQgPCBwdHItPmlidWZfdGFpbCkgPwoJCSAgICBwdHItPmlidWZfc2l6ZSA6IHB0ci0+aWJ1Zl9oZWFkKSAtIHB0ci0+aWJ1Zl90YWlsOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JSZWFkIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYlJlYWQgLSBsZW5ndGg7CgoJICBtZW1jcHkobHB2QnVmLCBwdHItPmluYnVmICsgcHRyLT5pYnVmX3RhaWwsIHN0YXR1cyk7CgkgIHB0ci0+aWJ1Zl90YWlsICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+aWJ1Zl90YWlsID49IHB0ci0+aWJ1Zl9zaXplKQoJICAgIHB0ci0+aWJ1Zl90YWlsID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCX0KCglUUkFDRSgiJS4qc1xuIiwgbGVuZ3RoLCBvcmdCdWYpOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVdyaXRlQ29tbQkoVVNFUi4yMDUpCiAqLwpJTlQxNiBXSU5BUEkgV3JpdGVDb21tMTYoSU5UMTYgY2lkLCBMUFNUUiBscHZCdWYsIElOVDE2IGNiV3JpdGUpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIAoJCWNpZCwgbHB2QnVmLCBjYldyaXRlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgkKCVRSQUNFKCIlLipzXG4iLCBjYldyaXRlLCBscHZCdWYgKTsKCglsZW5ndGggPSAwOwoJd2hpbGUgKGxlbmd0aCA8IGNiV3JpdGUpIHsKCSAgaWYgKChwdHItPm9idWZfaGVhZCA9PSBwdHItPm9idWZfdGFpbCkgJiYgKHB0ci0+eG1pdCA8IDApKSB7CgkgICAgLyogbm8gZGF0YSBxdWV1ZWQsIHRyeSB0byB3cml0ZSBkaXJlY3RseSAqLwoJICAgIHN0YXR1cyA9IHdyaXRlKHB0ci0+ZmQsIGxwdkJ1ZiwgY2JXcml0ZSAtIGxlbmd0aCk7CgkgICAgaWYgKHN0YXR1cyA+IDApIHsKCSAgICAgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgICAgICBsZW5ndGggKz0gc3RhdHVzOwoJICAgICAgY29udGludWU7CgkgICAgfQoJICB9CgkgIC8qIGNhbid0IHdyaXRlIGRpcmVjdGx5LCBwdXQgaW50byB0cmFuc21pdCBidWZmZXIgKi8KCSAgc3RhdHVzID0gKChwdHItPm9idWZfdGFpbCA+IHB0ci0+b2J1Zl9oZWFkKSA/CgkJICAgIChwdHItPm9idWZfdGFpbC0xKSA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl9oZWFkOwoJICBpZiAoIXN0YXR1cykgYnJlYWs7CgkgIGlmICgoY2JXcml0ZSAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JXcml0ZSAtIGxlbmd0aDsKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5vdXRidWYgKyBwdHItPm9idWZfaGVhZCwgc3RhdHVzKTsKCSAgcHRyLT5vYnVmX2hlYWQgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5vYnVmX2hlYWQgPj0gcHRyLT5vYnVmX3NpemUpCgkgICAgcHRyLT5vYnVmX2hlYWQgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsJCglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24gICAoVVNFUi4yNDYpCiAqLwpCT09MMTYgV0lOQVBJIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24xNiggSU5UMTYgY2lkLCBIV05EMTYgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjYldyaXRlTm90aWZ5LCBJTlQxNiBjYk91dFF1ZXVlICkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCIoJWQsICV4LCAlZCwgJWQpXG4iLCBjaWQsIGh3bmQsIGNiV3JpdGVOb3RpZnksIGNiT3V0UXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCEuXG4iLGNpZCk7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9CQURJRDsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IGh3bmQ7CglwdHItPm5fcmVhZCA9IGNiV3JpdGVOb3RpZnk7CglwdHItPm5fd3JpdGUgPSBjYk91dFF1ZXVlOwoJcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuMTQpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBKExQQ1NUUiBkZXZpY2UsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJKEtFUk5FTDMyLjE1KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNBKExQQ1NUUiBkZXZpY2UsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCWludAlwb3J0OwoJY2hhcgkqcHRyLCp0ZW1wOwoKCVRSQUNFKCIoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydD1kZXZpY2VbM10tJzAnOwoJCWlmIChwb3J0LS09PTApIHsKCQkJRVJSKCJCVUchIENPTTAgY2FuJ3QgZXhpc3RzIS5cbiIpOwoJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gRkFMU0U7CgkJaWYgKCooZGV2aWNlKzQpIT0nOicpCgkJCXJldHVybiBGQUxTRTsKCQl0ZW1wPShMUFNUUikoZGV2aWNlKzUpOwoJfSBlbHNlCgkJdGVtcD0oTFBTVFIpZGV2aWNlOwoKCW1lbXNldChscGRjYiwgMCwgc2l6ZW9mKERDQikpOyAvKiBpbml0aWFsaXplICovCgoJbHBkY2ItPkRDQmxlbmd0aAk9IHNpemVvZihEQ0IpOwoJaWYgKHN0cmNocih0ZW1wLCcsJykpIHsJLyogb2xkIHN0eWxlICovCgkJRENCMTYJZGNiMTY7CgkJQk9PTDE2CXJldDsKCQljaGFyCWxhc3Q9dGVtcFtzdHJsZW4odGVtcCktMV07CgoJCXJldD1CdWlsZENvbW1EQ0IxNihkZXZpY2UsJmRjYjE2KTsKCQlpZiAoIXJldCkKCQkJcmV0dXJuIEZBTFNFOwoJCWxwZGNiLT5CYXVkUmF0ZQkJPSBkY2IxNi5CYXVkUmF0ZTsKCQlscGRjYi0+Qnl0ZVNpemUJCT0gZGNiMTYuQnl0ZVNpemU7CgkJbHBkY2ItPmZCaW5hcnkJCT0gZGNiMTYuZkJpbmFyeTsKCQlscGRjYi0+UGFyaXR5CQk9IGRjYjE2LlBhcml0eTsKCQlscGRjYi0+ZlBhcml0eQkJPSBkY2IxNi5mUGFyaXR5OwoJCWxwZGNiLT5mTnVsbAkJPSBkY2IxNi5mTnVsbDsKCQlscGRjYi0+U3RvcEJpdHMJCT0gZGNiMTYuU3RvcEJpdHM7CgkJaWYgKGxhc3QgPT0gJ3gnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IFRSVUU7CgkJCWxwZGNiLT5mT3V0WAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhDdHNGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBGQUxTRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJfSBlbHNlIGlmIChsYXN0PT0ncCcpIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IFRSVUU7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBUUlVFOwoJCQlscGRjYi0+ZkR0ckNvbnRyb2wJPSBEVFJfQ09OVFJPTF9IQU5EU0hBS0U7CgkJCWxwZGNiLT5mUnRzQ29udHJvbAk9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKCQl9IGVsc2UgewoJCQlscGRjYi0+ZkluWAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXRYCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhDdHNGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eERzckZsb3cJPSBGQUxTRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJfQoJCWxwZGNiLT5Yb25DaGFyCT0gZGNiMTYuWG9uQ2hhcjsKCQlscGRjYi0+WG9mZkNoYXIJPSBkY2IxNi5Yb2ZmQ2hhcjsKCQlscGRjYi0+RXJyb3JDaGFyPSBkY2IxNi5QZUNoYXI7CgkJbHBkY2ItPmZFcnJvckNoYXI9IGRjYjE2LmZQZUNoYXI7CgkJbHBkY2ItPkVvZkNoYXIJPSBkY2IxNi5Fb2ZDaGFyOwoJCWxwZGNiLT5FdnRDaGFyCT0gZGNiMTYuRXZ0Q2hhcjsKCQlscGRjYi0+WG9uTGltCT0gZGNiMTYuWG9uTGltOwoJCWxwZGNiLT5Yb2ZmTGltCT0gZGNiMTYuWG9mZkxpbTsKCQlyZXR1cm4gVFJVRTsKCX0KCXB0cj1zdHJ0b2sodGVtcCwiICIpOyAKCXdoaWxlIChwdHIpIHsKCQlEV09SRAlmbGFnLHg7CgoJCWZsYWc9MDsKCQlpZiAoIXN0cm5jbXAoImJhdWQ9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPkJhdWRSYXRlID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoInN0b3A9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPlN0b3BCaXRzID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoImRhdGE9IixwdHIsNSkpIHsKCQkJaWYgKCFzc2NhbmYocHRyKzUsIiVsZCIsJngpKQoJCQkJV0FSTigiQ291bGRuJ3QgcGFyc2UgJXNcbiIscHRyKTsKCQkJbHBkY2ItPkJ5dGVTaXplID0geDsKCQkJZmxhZz0xOwoJCX0KCQlpZiAoIXN0cm5jbXAoInBhcml0eT0iLHB0ciw3KSkgewoJCQlscGRjYi0+ZlBhcml0eQk9IFRSVUU7CgkJCXN3aXRjaCAocHRyWzhdKSB7CgkJCWNhc2UgJ04nOmNhc2UgJ24nOgoJCQkJbHBkY2ItPmZQYXJpdHkJPSBGQUxTRTsKCQkJCWxwZGNiLT5QYXJpdHkJPSBOT1BBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdFJzpjYXNlICdlJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBFVkVOUEFSSVRZOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ08nOmNhc2UgJ28nOgoJCQkJbHBkY2ItPlBhcml0eQk9IE9ERFBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdNJzpjYXNlICdtJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBNQVJLUEFSSVRZOwoJCQkJYnJlYWs7CgkJCX0KCQkJZmxhZz0xOwoJCX0KCQlpZiAoIWZsYWcpCgkJCUVSUigiVW5oYW5kbGVkIHNwZWNpZmllciAnJXMnLCBwbGVhc2UgcmVwb3J0LlxuIixwdHIpOwoJCXB0cj1zdHJ0b2soTlVMTCwiICIpOwoJfQoJaWYgKGxwZGNiLT5CYXVkUmF0ZT09MTEwKQoJCWxwZGNiLT5TdG9wQml0cyA9IDI7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCQW5kVGltZW91dHNXCQkoS0VSTkVMMzIuMTYpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coIExQQ1dTVFIgZGV2aWQsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzICkKewoJTFBTVFIJZGV2aWRBOwoJQk9PTAlyZXQ7CgoJVFJBQ0UoIiglcCwlcCwlcClcbiIsZGV2aWQsbHBkY2IsbHB0aW1lb3V0cyk7CglkZXZpZEEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkICk7CglyZXQ9QnVpbGRDb21tRENCQW5kVGltZW91dHNBKGRldmlkQSxscGRjYixscHRpbWVvdXRzKTsKICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV2aWRBICk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JXCQkoS0VSTkVMMzIuMTcpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JXKExQQ1dTVFIgZGV2aWQsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coZGV2aWQsbHBkY2IsTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENPTU1fR2V0UmVhZEZkCiAqICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nLgogKiAgTWFrZSBzdXJlIHRvIGNsb3NlIHRoZSBoYW5kbGUgYWZ0ZXJ3YXJkcyEKICovCnN0YXRpYyBpbnQgQ09NTV9HZXRSZWFkRmQoIEhBTkRMRSBoYW5kbGUpCnsKICAgIGludCBmZDsKICAgIHN0cnVjdCBnZXRfcmVhZF9mZF9yZXF1ZXN0ICpyZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwogICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICBzZXJ2ZXJfY2FsbF9mZCggUkVRX0dFVF9SRUFEX0ZELCAtMSwgJmZkICk7CiAgICByZXR1cm4gZmQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENPTU1fR2V0V3JpdGVGZAogKiAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3Igd3JpdGluZy4KICogIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlIGFmdGVyd2FyZHMhCiAqLwpzdGF0aWMgaW50IENPTU1fR2V0V3JpdGVGZCggSEFORExFIGhhbmRsZSkKewogICAgaW50IGZkID0gLTE7CiAgICBzdHJ1Y3QgZ2V0X3dyaXRlX2ZkX3JlcXVlc3QgKnJlcSA9IGdldF9yZXFfYnVmZmVyKCk7CiAgICByZXEtPmhhbmRsZSA9IGhhbmRsZTsKICAgIHNlcnZlcl9jYWxsX2ZkKCBSRVFfR0VUX1dSSVRFX0ZELCAtMSwgJmZkICk7CiAgICByZXR1cm4gZmQ7Cn0KCi8qIEZJWE1FOiBoYXZpbmcgdGhlc2UgZ2xvYmFsIGZvciB3aW4zMiBmb3Igbm93ICovCmludCBjb21tZXJyb3I9MCxldmVudG1hc2s9MDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShLRVJORUwzMi40NDkpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQnJlYWsoSEFORExFIGhhbmRsZSkKewojaWYgZGVmaW5lZChUSU9DU0JSSykgJiYgZGVmaW5lZChUSU9DQ0JSSykgLyogY2hlY2sgaWYgYXZhaWxhYmxlIGZvciBjb21waWxhdGlvbiAqLwogICAgICAgIGludCBmZCxyZXN1bHQ7CiAKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CglpZihmZDwwKSB7CgkgICAgICAgIFRSQUNFKCJDT01NX0dldFdyaXRlRmQgZmFpbGVkXG4iKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DU0JSSywwKTsKCWNsb3NlKGZkKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkJKEtFUk5FTDMyLjIwKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tQnJlYWsoSEFORExFIGhhbmRsZSkKewojaWYgZGVmaW5lZChUSU9DU0JSSykgJiYgZGVmaW5lZChUSU9DQ0JSSykgLyogY2hlY2sgaWYgYXZhaWxhYmxlIGZvciBjb21waWxhdGlvbiAqLwogICAgICAgIGludCBmZCxyZXN1bHQ7CiAKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CglpZihmZDwwKSB7CgkgICAgICAgIFRSQUNFKCJDT01NX0dldFdyaXRlRmQgZmFpbGVkXG4iKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCWNsb3NlKGZkKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLjIxNCkKICovCkJPT0wgV0lOQVBJIEVzY2FwZUNvbW1GdW5jdGlvbihIQU5ETEUgaGFuZGxlLFVJTlQgbkZ1bmN0aW9uKQp7CglpbnQgZmQsZGlyZWN0PUZBTFNFLHJlc3VsdD1GQUxTRTsKCXN0cnVjdCB0ZXJtaW9zCXBvcnQ7CgogICAgCVRSQUNFKCJoYW5kbGUgJWQsIGZ1bmN0aW9uPSVkXG4iLCBoYW5kbGUsIG5GdW5jdGlvbik7CglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJCUZJWE1FKCJoYW5kbGUgJWQgbm90IGZvdW5kLlxuIixoYW5kbGUpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewoJCWNvbW1lcnJvcj1XaW5FcnJvcigpOwoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCQljYXNlIFJFU0VUREVWOgoJCSAgICAgICAgVFJBQ0UoIlxuIik7CgkJCWJyZWFrOwkJCQkJCgoJCWNhc2UgQ0xSRFRSOgoJCSAgICAgICAgVFJBQ0UoIkNMUkRUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOwojaWZkZWYgVElPQ01fUlRTCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CgkJCWJyZWFrOwojZW5kaWYKCQoJCWNhc2UgU0VURFRSOgoJCSAgICAgICAgVFJBQ0UoIlNFVERUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9EVFIpOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgU0VUUlRTOgoJCSAgICAgICAgVFJBQ0UoIlNFVFJUU1xuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCAwLCBUSU9DTV9SVFMpOwoJCQlicmVhazsKI2VuZGlmCgoJCWNhc2UgU0VUWE9GRjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT0ZGXG4iKTsKCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJCQlicmVhazsKCgkJY2FzZSBTRVRYT046CgkJICAgICAgICBUUkFDRSgiU0VUWE9OXG4iKTsKCQkJcG9ydC5jX2lmbGFnIHw9IElYT047CgkJCWJyZWFrOwoJCWNhc2UgU0VUQlJFQUs6CgkJCVRSQUNFKCJzZXRicmVha1xuIik7CiNpZmRlZiAJVElPQ1NCUksKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdCA9IGlvY3RsKGZkLFRJT0NTQlJLLDApOwoJCQlicmVhazsKI2VuZGlmCgkJY2FzZSBDTFJCUkVBSzoKCQkJVFJBQ0UoImNscmJyZWFrXG4iKTsKI2lmZGVmIAlUSU9DU0JSSwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlXQVJOKCIoaGFuZGxlPSVkLG5GdW5jdGlvbj0lZCk6IFVua25vd24gZnVuY3Rpb25cbiIsIAoJCQloYW5kbGUsIG5GdW5jdGlvbik7CgkJCWJyZWFrOwkJCQkKCX0KCQoJaWYgKCFkaXJlY3QpCgkgIGlmICh0Y3NldGF0dHIoZmQsIFRDU0FEUkFJTiwgJnBvcnQpID09IC0xKSB7CgkJY29tbWVycm9yID0gV2luRXJyb3IoKTsKCQljbG9zZShmZCk7CgkJcmV0dXJuIEZBTFNFOwkKCSAgfSBlbHNlIAoJICAgICAgICByZXN1bHQ9IFRSVUU7CgllbHNlCgkgIHsKCSAgICBpZiAocmVzdWx0ID09IC0xKQoJICAgICAgewoJCXJlc3VsdD0gRkFMU0U7CgkJY29tbWVycm9yPVdpbkVycm9yKCk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcmVzdWx0ID0gVFJVRTsKCSAgfQoJY2xvc2UoZmQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgUHVyZ2VDb21tICAgICAgICAoS0VSTkVMMzIuNTU3KQogKi8KQk9PTCBXSU5BUEkgUHVyZ2VDb21tKCBIQU5ETEUgaGFuZGxlLCBEV09SRCBmbGFncykgCnsKICAgICBpbnQgZmQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJWQsIGZsYWdzICVseFxuIiwgaGFuZGxlLCBmbGFncyk7CgogICAgIGZkID0gQ09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CiAgICAgaWYoZmQ8MCkgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgICAgLyoKICAgICAqKiBub3QgZXhhY3RseSBzdXJlIGhvdyB0aGVzZSBhcmUgZGlmZmVyZW50CiAgICAgKiogUGVyaGFwcyBpZiB3ZSBoYWQgb3VyIG93biBpbnRlcm5hbCBxdWV1ZXMsIG9uZSBmbHVzaGVzIHRoZW0KICAgICAqKiBhbmQgdGhlIG90aGVyIGZsdXNoZXMgdGhlIGtlcm5lbCdzIGJ1ZmZlcnMuCiAgICAgKi8KICAgICBpZihmbGFncyZQVVJHRV9UWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9UWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBjbG9zZShmZCk7CgogICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tRXJyb3IJKEtFUk5FTDMyLjIxKQogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tRXJyb3IoSU5UIGhhbmRsZSxMUERXT1JEIGVycm9ycyxMUENPTVNUQVQgbHBTdGF0KQp7CiAgICBpbnQgZmQ7CgogICAgZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKTsKICAgIGlmKDA+ZmQpIAogICAgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZiAobHBTdGF0KSAKICAgIHsKCWxwU3RhdC0+c3RhdHVzID0gMDsKCiNpZmRlZiBUSU9DT1VUUQoJaWYoaW9jdGwoZmQsIFRJT0NPVVRRLCAmbHBTdGF0LT5jYk91dFF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwojZWxzZQoJbHBTdGF0LT5jYk91dFF1ZSA9IDA7IC8qIEZJWE1FOiBmaW5kIGEgZGlmZmVyZW50IHdheSB0byBmaW5kIG91dCAqLwojZW5kaWYKCglpZihpb2N0bChmZCwgVElPQ0lOUSwgJmxwU3RhdC0+Y2JJblF1ZSkpCgkgICAgV0FSTigiaW9jdGwgcmV0dXJuZWQgZXJyb3JcbiIpOwoKCVRSQUNFKCJoYW5kbGUgJWQgY2JJblF1ZSA9ICVsZCBjYk91dFF1ZSA9ICVsZFxuIiwKCSAgICAgIGhhbmRsZSwgbHBTdGF0LT5jYkluUXVlLCBscFN0YXQtPmNiT3V0UXVlKTsKICAgIH0KCiAgICBjbG9zZShmZCk7CgogICAgaWYoZXJyb3JzKQogICAgICAgICplcnJvcnMgPSAwOwoKICAgIC8qCiAgICAqKiBBZnRlciBhbiBhc3luY2hyb25vdXMgd3JpdGUgb3BwZXJhdGlvbiwgdGhlCiAgICAqKiBhcHAgd2lsbCBjYWxsIENsZWFyQ29tbUVycm9yIHRvIHNlZSBpZiB0aGUKICAgICoqIHJlc3VsdHMgYXJlIHJlYWR5IHlldC4gSXQgd2FpdHMgZm9yIEVSUk9SX0lPX1BFTkRJTkcKICAgICovCiAgICBjb21tZXJyb3IgPSBFUlJPUl9JT19QRU5ESU5HOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTZXR1cENvbW0gICAgICAgKEtFUk5FTDMyLjY3NikKICovCkJPT0wgV0lOQVBJIFNldHVwQ29tbSggSEFORExFIGhhbmRsZSwgRFdPUkQgaW5zaXplLCBEV09SRCBvdXRzaXplKQp7CiAgICBpbnQgZmQ7CgogICAgRklYTUUoImluc2l6ZSAlbGQgb3V0c2l6ZSAlbGQgdW5pbXBsZW1lbnRlZCBzdHViXG4iLCBpbnNpemUsIG91dHNpemUpOwogICAgZmQ9Q09NTV9HZXRXcml0ZUZkKGhhbmRsZSk7CiAgICBpZigwPmZkKSB7CglGSVhNRSgiaGFuZGxlICVkIG5vdCBmb3VuZD9cbiIsaGFuZGxlKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gVFJVRTsKfSAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tTWFzawkoS0VSTkVMMzIuMTU2KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1hc2soSEFORExFIGhhbmRsZSxMUERXT1JEIGV2dG1hc2spCnsKICAgIGludCBmZDsKCiAgICBUUkFDRSgiaGFuZGxlICVkLCBtYXNrICVwXG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgaWYoMD4oZmQ9Q09NTV9HZXRSZWFkRmQoaGFuZGxlKSkpIAogICAgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgICpldnRtYXNrID0gZXZlbnRtYXNrOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2ZW50bWFzayZFVl9CUkVBSyk/IkVWX0JSRUFLIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9DVFMpPyJFVl9DVFMiOiIiLAoJICAoZXZlbnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldmVudG1hc2smRVZfRVJSKT8iRVZfRVJSIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9SSU5HKT8iRVZfUklORyI6IiIsCgkgIChldmVudG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZlbnRtYXNrJkVWX1JYQ0hBUik/IkVWX1JYQ0hBUiI6IiIsCgkgIChldmVudG1hc2smRVZfUlhGTEFHKT8iRVZfUlhGTEFHIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbU1hc2sJKEtFUk5FTDMyLjQ1MSkKICovCkJPT0wgV0lOQVBJIFNldENvbW1NYXNrKElOVCBoYW5kbGUsRFdPUkQgZXZ0bWFzaykKewogICAgaW50IGZkOwoKICAgIFRSQUNFKCJoYW5kbGUgJWQsIG1hc2sgJWx4XG4iLCBoYW5kbGUsIGV2dG1hc2spOwogICAgVFJBQ0UoIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKCSAgKGV2dG1hc2smRVZfQlJFQUspPyJFVl9CUkVBSyI6IiIsCgkgIChldnRtYXNrJkVWX0NUUyk/IkVWX0NUUyI6IiIsCgkgIChldnRtYXNrJkVWX0RTUik/IkVWX0RTUiI6IiIsCgkgIChldnRtYXNrJkVWX0VSUik/IkVWX0VSUiI6IiIsCgkgIChldnRtYXNrJkVWX1JJTkcpPyJFVl9SSU5HIjoiIiwKCSAgKGV2dG1hc2smRVZfUkxTRCk/IkVWX1JMU0QiOiIiLAoJICAoZXZ0bWFzayZFVl9SWENIQVIpPyJFVl9SWENIQVIiOiIiLAoJICAoZXZ0bWFzayZFVl9SWEZMQUcpPyJFVl9SWEZMQUciOiIiLAoJICAoZXZ0bWFzayZFVl9UWEVNUFRZKT8iRVZfVFhFTVBUWSI6IiIpOwoJICAKICAgIGlmKDA+KGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSkgewoJRklYTUUoIm5vIGhhbmRsZSAlZCBmb3VuZFxuIixoYW5kbGUpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGNsb3NlKGZkKTsKICAgIGV2ZW50bWFzayA9IGV2dG1hc2s7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZSAgICAoS0VSTkVMMzIuNDUyKQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVN0YXRlKElOVCBoYW5kbGUsTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKICAgICBUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CiAgICAgVFJBQ0UoIiVzICVzXG4iLChscGRjYi0+ZkluWCk/IklYT04iOiJ+SVhPTiIsCgkgICAobHBkY2ItPmZPdXRYKT8iSVhPRkYiOiJ+SVhPRkYiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSA8IDApICB7CglGSVhNRSgibm8gaGFuZGxlICVkIGZvdW5kXG4iLGhhbmRsZSk7CglyZXR1cm4gRkFMU0U7CiAgICAgfQoKICAgICBpZiAoKHRjZ2V0YXR0cihmZCwmcG9ydCkpID09IC0xKSB7CiAgICAgICAgIGludCBzYXZlX2Vycm9yID0gZXJybm87CiAgICAgICAgIGNvbW1lcnJvciA9IFdpbkVycm9yKCk7CiAgICAgICAgIGNsb3NlKCBmZCApOwojaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgICAgICBFUlIoInRjZ2V0YXR0ciBlcnJvciAnJXMnXG4iLCBzdHJlcnJvcihzYXZlX2Vycm9yKSk7CiNlbHNlCiAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICVkXG4iLCBzYXZlX2Vycm9yKTsKI2VuZGlmCiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CgoJcG9ydC5jX2NjW1ZNSU5dID0gMDsKCXBvcnQuY19jY1tWVElNRV0gPSAxOwoKI2lmZGVmIElNQVhCRUwKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1J8SU1BWEJFTCk7CiNlbHNlCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSKTsKI2VuZGlmCglwb3J0LmNfaWZsYWcgfD0gKElHTkJSSyk7CgoJcG9ydC5jX29mbGFnICY9IH4oT1BPU1QpOwoKCXBvcnQuY19jZmxhZyAmPSB+KEhVUENMKTsKCXBvcnQuY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsKCglwb3J0LmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJU0lHKTsKCXBvcnQuY19sZmxhZyB8PSBOT0ZMU0g7CgogICAgIC8qCiAgICAgKiogTUpNIC0gcmVtb3ZlZCBkZWZhdWx0IGJhdWRyYXRlIHNldHRpbmdzCiAgICAgKiogVFJBQ0UoY29tbSwiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAgICAgKi8KI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgMTE1MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExNTIwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMjMwNDAwCgkJY2FzZSAyMzA0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMjMwNDAwOwoJCQlicmVhazsJCQojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgogICAgICAgCSAgICAgICAgZGVmYXVsdDoKCQkJY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CgkJCWNsb3NlKCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcnJvciA9IElFX0JBVURSQVRFOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQkJRVJSKCJiYXVkcmF0ZSAlZCBcbiIsbHBkY2ItPkJhdWRSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChscGRjYi0+Qnl0ZVNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQkJRVJSKCJCeXRlU2l6ZVxuIik7CgkJCXJldHVybiBGQUxTRTsKCX0KCglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBjb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiUGFyaXR5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KCQoKCXN3aXRjaCAobHBkY2ItPlN0b3BCaXRzKSB7CgkJY2FzZSBPTkVTVE9QQklUOgoJCQkJcG9ydC5jX2NmbGFnICY9IH5DU1RPUEI7CgkJCQlicmVhazsKCQljYXNlIFRXT1NUT1BCSVRTOgoJCQkJcG9ydC5jX2NmbGFnIHw9IENTVE9QQjsKCQkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQkJRVJSKCJTdG9wQml0c1xuIik7CgkJCXJldHVybiBGQUxTRTsKCX0KI2lmZGVmIENSVFNDVFMKCWlmICgJbHBkY2ItPmZPdXR4Q3RzRmxvdyAJCQl8fAoJCWxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9FTkFCTEV8fAoJCWxwZGNiLT5mUnRzQ29udHJvbCA9PSBSVFNfQ09OVFJPTF9FTkFCTEUKCSkgCgkgIHsKCSAgICBwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCSAgICBUUkFDRSgiQ1JUU0NUU1xuIik7CgkgIH0KCQoJaWYgKGxwZGNiLT5mRHRyQ29udHJvbCA9PSBEVFJfQ09OVFJPTF9ESVNBQkxFKQoJICB7CgkgICAgcG9ydC5jX2NmbGFnICY9IH5DUlRTQ1RTOwoJICAgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CgkgIH0KCiNlbmRpZgkKCWlmIChscGRjYi0+ZkluWCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT047CglpZiAobHBkY2ItPmZPdXRYKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCWVsc2UKCQlwb3J0LmNfaWZsYWcgJj0gfklYT0ZGOwoKCWlmICh0Y3NldGF0dHIoZmQsVENTQU5PVywmcG9ydCk9PS0xKSB7IC8qIG90aGVyd2lzZSBpdCBoYW5ncyB3aXRoIHBlbmRpbmcgaW5wdXQqLwoJICAgICAgICBpbnQgc2F2ZV9lcnJvcj1lcnJubzsKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwojaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwojZWxzZQogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJWRcbiIsIHNhdmVfZXJyb3IpOwojZW5kaWYKCQlyZXR1cm4gRkFMU0U7Cgl9IGVsc2UgewoJCWNvbW1lcnJvciA9IDA7CiAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQlyZXR1cm4gVFJVRTsKCX0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKEtFUk5FTDMyLjE1OSkKICovCkJPT0wgV0lOQVBJIEdldENvbW1TdGF0ZShJTlQgaGFuZGxlLCBMUERDQiBscGRjYikKewogICAgIHN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAgICAgaW50IGZkLHNwZWVkOwoKICAgICBUUkFDRSgiaGFuZGxlICVkLCBwdHIgJXBcbiIsIGhhbmRsZSwgbHBkY2IpOwoKICAgICBpZiAoKGZkID0gQ09NTV9HZXRSZWFkRmQoaGFuZGxlKSkgPCAwKSAKICAgICAgIHsKCSBFUlIoImNhbid0IGdldCBDT01NX0dldFJlYWRGZFxuIik7CgkgcmV0dXJuIEZBTFNFOwogICAgICAgfQogICAgIGlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMSkgewogICAgICAgICAgICAgICAgaW50IHNhdmVfZXJyb3I9ZXJybm87CiNpZmRlZiBIQVZFX1NUUkVSUk9SCiAgICAgICAgICAgICAgICBFUlIoInRjZ2V0YXR0ciBlcnJvciAnJXMnXG4iLCBzdHJlcnJvcihzYXZlX2Vycm9yKSk7CiNlbHNlCiAgICAgICAgICAgICAgICBFUlIoInRjZ2V0YXR0ciBlcnJvciAlZFxuIiwgc2F2ZV9lcnJvcik7CiNlbmRpZgoJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQogICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJcmV0dXJuIEZBTFNFOwoJfQogICAgIGNsb3NlKCBmZCApOwojaWZuZGVmIF9fRU1YX18KI2lmZGVmIENCQVVECiAgICAgc3BlZWQ9IChwb3J0LmNfY2ZsYWcgJiBDQkFVRCk7CiNlbHNlCiAgICAgc3BlZWQ9IChjZmdldG9zcGVlZCgmcG9ydCkpOwojZW5kaWYKICAgICBzd2l0Y2ggKHNwZWVkKSB7CgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSBCNTc2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDU3NjAwOwoJCQlicmVhazsJCQojZW5kaWYKI2lmZGVmIEIxMTUyMDAKCQljYXNlIEIxMTUyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDExNTIwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMjMwNDAwCiAgICAgICAgICAgICAgICBjYXNlIEIyMzA0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDIzMDQwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCNDYwODAwCiAgICAgICAgICAgICAgICBjYXNlIEI0NjA4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ2MDgwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCgkgICAgICAgIGRlZmF1bHQ6CgkJICAgICAgICBFUlIoInVua25vd24gc3BlZWQgJXggXG4iLHNwZWVkKTsKCX0KI2VuZGlmCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CgkJY2FzZSBDUzU6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CgkJCWJyZWFrOwoJCWNhc2UgQ1M2OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA2OwoJCQlicmVhazsKCQljYXNlIENTNzoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNzsKCQkJYnJlYWs7CgkJY2FzZSBDUzg6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDg7CgkJCWJyZWFrOwoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNpemUgJXggXG4iLHBvcnQuY19jZmxhZyAmIENTSVpFKTsKCX0JCgkKICAgICAgICBpZihwb3J0LmNfaWZsYWcgJiBJTlBDSykKICAgICAgICAgICAgbHBkY2ItPmZQYXJpdHkgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbHBkY2ItPmZQYXJpdHkgPSBGQUxTRTsKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCkpIHsKCQljYXNlIDA6CgkJCWxwZGNiLT5QYXJpdHkgPSBOT1BBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSBQQVJFTkI6CgkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIChQQVJFTkIgfCBQQVJPREQpOgoJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwkJCgkJCWJyZWFrOwoJfQoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDU1RPUEIpCgkJbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgllbHNlCgkJbHBkY2ItPlN0b3BCaXRzID0gT05FU1RPUEJJVDsKCglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZCaW5hcnkgPSAxOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0VOQUJMRTsKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IDE7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IDE7Cgl9IGVsc2UgCiNlbmRpZgoJewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0RJU0FCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRElTQUJMRTsKCX0KCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0gCglscGRjYi0+WG9mZkNoYXIgPSAKICovCglscGRjYi0+WG9uTGltID0gMTA7CglscGRjYi0+WG9mZkxpbSA9IDEwOwoKCWNvbW1lcnJvciA9IDA7CgogICAgICAgIFRSQUNFKCJPS1xuIik7CiAKCVRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICAgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKCVRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRU5BQkxFfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRU5BQkxFCgkJKSAKCSAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJCglpZiAobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0RJU0FCTEUpCgkgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CgkKI2VuZGlmCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShLRVJORUwzMi41MzUpCiAqLwpCT09MIFdJTkFQSSBUcmFuc21pdENvbW1DaGFyKElOVCBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCUZJWE1FKCIoJWQsJyVjJyksIHVzZSB3aW4zMiBoYW5kbGUhXG4iLGNpZCxjaFRyYW5zbWl0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpCgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gRkFMU0U7CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZiAod3JpdGUocHRyLT5mZCwgKHZvaWQgKikgJmNoVHJhbnNtaXQsIDEpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCXJldHVybiBGQUxTRTsKCX0gIGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlyZXR1cm4gVFJVRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLjE2MCkKICovCkJPT0wgV0lOQVBJIEdldENvbW1UaW1lb3V0cyhIQU5ETEUgaGNvbSxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKQp7CglGSVhNRSgiKCV4LCVwKTpzdHViLlxuIixoY29tLGxwdGltZW91dHMpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tVGltZW91dHMJCShLRVJORUwzMi40NTMpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tVGltZW91dHMoSEFORExFIGhjb20sTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgewoJLyogc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOyAqLwoJc3RydWN0IHRlcm1pb3MJdGlvczsKCWludAlmZDsKCglGSVhNRSgiKCV4LCVwKTpzdHViLlxuIixoY29tLGxwdGltZW91dHMpOwoJLyogCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChoY29tKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCEuXG4iLGhjb20pOwoJCXJldHVybiBGQUxTRTsKCX0KCSAqLwoKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhjb20pOwoJaWYgKGZkIDwgMCkgewoJCUZJWE1FKCJubyBmZCBmb3IgY2lkID0gJTB4IS5cbiIsaGNvbSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCglGSVhNRSgiUmVhZEludGVydmFsVGltZW91dCAlbGRcbiIsbHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCk7CglGSVhNRSgiUmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgJWxkXG4iLGxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyKTsKCUZJWE1FKCJSZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQgJWxkXG4iLGxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRDb25zdGFudCk7CglGSVhNRSgiV3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyICVsZFxuIixscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIpOwoJRklYTUUoIldyaXRlVG90YWxUaW1lb3V0Q29uc3RhbnQgJWxkXG4iLGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0Q29uc3RhbnQpOwoKCglpZiAoLTE9PXRjZ2V0YXR0cihmZCwmdGlvcykpIHsKCQlGSVhNRSgidGNnZXRhdHRyIG9uIGZkICVkIGZhaWxlZCFcbiIsZmQpOwoJCXJldHVybiBGQUxTRTsKCX0KCS8qIFZUSU1FIGlzIGluIDEvMTAgc2Vjb25kcyAqLwoJdGlvcy5jX2NjW1ZUSU1FXT0gKGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQrOTkpLzEwMDsKCWlmICgtMT09dGNzZXRhdHRyKGZkLDAsJnRpb3MpKSB7CgkJRklYTUUoInRjc2V0YXR0ciBvbiBmZCAlZCBmYWlsZWQhXG4iLGZkKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tTW9kZW1TdGF0dXMgICAoS0VSTkVMMzIuMjg1KQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbU1vZGVtU3RhdHVzKEhBTkRMRSBoRmlsZSxMUERXT1JEIGxwTW9kZW1TdGF0ICkKewoJaW50IGZkLG1zdGF0LCByZXN1bHQ9RkFMU0U7CgkKCSpscE1vZGVtU3RhdD0wOwojaWZkZWYgVElPQ01HRVQKCWZkID0gQ09NTV9HZXRXcml0ZUZkKGhGaWxlKTsKCWlmKGZkPDApCgkJcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwoJY2xvc2UoZmQpOwoJaWYgKHJlc3VsdCA9PSAtMSkKCSAgewoJICAgIFRSQUNFKCJpb2N0bCBmYWlsZWRcbiIpOwoJICAgIHJldHVybiBGQUxTRTsKCSAgfQoJaWYgKG1zdGF0ICYgVElPQ01fQ1RTKQoJICAgICpscE1vZGVtU3RhdCB8PSBNU19DVFNfT047CglpZiAobXN0YXQgJiBUSU9DTV9EU1IpCgkgICpscE1vZGVtU3RhdCB8PSBNU19EU1JfT047CglpZiAobXN0YXQgJiBUSU9DTV9STkcpCgkgICpscE1vZGVtU3RhdCB8PSBNU19SSU5HX09OOwoJLypGSVhNRTogIE5vdCByZWFsbHkgc3VyZSBhYm91dCBSTFNEICBVQiA5OTA4MTAqLwoJaWYgKG1zdGF0ICYgVElPQ01fQ0FSKQoJICAqbHBNb2RlbVN0YXQgfD0gTVNfUkxTRF9PTjsKCVRSQUNFKCIlcyVzJXMlc1xuIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JMU0RfT04pPyJNU19STFNEX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19SSU5HX09OKT8iTVNfUklOR19PTiAiOiIiLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfRFNSX09OKT8iTVNfRFNSX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19DVFNfT04pPyJNU19DVFNfT04gIjoiIik7CglyZXR1cm4gVFJVRTsKI2Vsc2UKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBXYWl0Q29tbUV2ZW50ICAgKEtFUk5FTDMyLjcxOSkKICovCkJPT0wgV0lOQVBJIFdhaXRDb21tRXZlbnQoSEFORExFIGhGaWxlLExQRFdPUkQgZXZlbnRtYXNrICxMUE9WRVJMQVBQRUQgb3ZlcmxhcHBlZCkKewoJRklYTUUoIiglZCAlcCAlcCApXG4iLGhGaWxlLCBldmVudG1hc2ssb3ZlcmxhcHBlZCk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tUHJvcGVydGllcyAgIChLRVJORUwzMi4/Pz8pCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tUHJvcGVydGllcyhIQU5ETEUgaEZpbGUsIExQRENCICpkY2IpCnsKICAgIEZJWE1FKCIoJWQgJXAgKVxuIixoRmlsZSxkY2IpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0Q29tbVByb3BlcnRpZXMgICAoS0VSTkVMMzIuPz8/KQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVByb3BlcnRpZXMoSEFORExFIGhGaWxlLCBMUERDQiBkY2IpCnsKICAgIEZJWE1FKCIoJWQgJXAgKVxuIixoRmlsZSxkY2IpOwogICAgcmV0dXJuIFRSVUU7Cn0KCg==