IC8qCiAqIERFQyA5MyBFcmlrIEJvcyA8ZXJpa0B4czRhbGwubmw+CiAqCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2lmZGVmIEhBVkVfU1RSSU5HU19ICiMgaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAiY29tbS5oIgojaWZkZWYgSEFWRV9TWVNfTU9ERU1fSAojIGluY2x1ZGUgPHN5cy9tb2RlbS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NUUlRJT19ICiMgaW5jbHVkZSA8c3lzL3N0cnRpby5oPgojZW5kaWYKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKCiNpbmNsdWRlICJzZXJ2ZXIuaCIKI2luY2x1ZGUgInByb2Nlc3MuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJzZXJ2aWNlcy5oIgojaW5jbHVkZSAiY2FsbGJhY2suaCIKI2luY2x1ZGUgImZpbGUuaCIKCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSk7CgojaWZuZGVmIFRJT0NJTlEKI2RlZmluZQlUSU9DSU5RIEZJT05SRUFECiNlbmRpZgoKLyogd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIENPTU1fTVNSX09GRlNFVCAgMzUKI2RlZmluZSBNU1JfQ1RTICAweDEwCiNkZWZpbmUgTVNSX0RTUiAgMHgyMAojZGVmaW5lIE1TUl9SSSAgIDB4NDAKI2RlZmluZSBNU1JfUkxTRCAweDgwCiNkZWZpbmUgTVNSX01BU0sgKE1TUl9DVFN8TVNSX0RTUnxNU1JfUkl8TVNSX1JMU0QpCgojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCiNpZmRlZiBsaW51eAojZGVmaW5lIENNU1BBUiAweDQwMDAwMDAwIC8qIHN0aWNrIHBhcml0eSAqLwojZW5kaWYKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgQ09NW01BWF9QT1JUU107CnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107Ci8qIHBvaW50ZXJzIHRvIHVua25vd24oPT11bmRvY3VtZW50ZWQpIGNvbW0gc3RydWN0dXJlICovIApMUENWT0lEICp1bmtub3duW01BWF9QT1JUU107Ci8qIHNhdmUgdGVybWluYWwgc3RhdGVzICovCnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBtX3N0YXRbTUFYX1BPUlRTXTsKCi8qIHVwZGF0ZSB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCi8qIHNlZSBrbm93bGVkZ2UgYmFzZSBRMTAxNDE3ICovCnN0YXRpYyB2b2lkIENPTU1fTVNSVXBkYXRlKCBVQ0hBUiAqIHBNc3IsIHVuc2lnbmVkIGludCBtc3RhdCkKewogICAgVUNIQVIgdG1wbXNyPTA7CiAgICBpZihtc3RhdCAmIFRJT0NNX0NUUykgdG1wbXNyIHw9IE1TUl9DVFM7CiAgICBpZihtc3RhdCAmIFRJT0NNX0RTUikgdG1wbXNyIHw9IE1TUl9EU1I7CiAgICBpZihtc3RhdCAmIFRJT0NNX1JJKSAgdG1wbXNyIHw9IE1TUl9SSTsKICAgIGlmKG1zdGF0ICYgVElPQ01fQ0FSKSB0bXBtc3IgfD0gTVNSX1JMU0Q7CiAgICAqcE1zciA9ICgqcE1zciAmIH5NU1JfTUFTSykgfCB0bXBtc3I7Cn0KCnZvaWQgQ09NTV9Jbml0KHZvaWQpCnsKCWludCB4OwoJY2hhciBvcHRpb25bMTBdLCB0ZW1wWzI1Nl0sICpidGVtcDsKCXN0cnVjdCBzdGF0IHN0OwoKCWZvciAoeD0wOyB4IT1NQVhfUE9SVFM7IHgrKykgewoJCXN0cmNweShvcHRpb24sIkNPTXgiKTsKCQlvcHRpb25bM10gPSAnMScgKyB4OwoJCW9wdGlvbls0XSA9ICdcMCc7CgoJCVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggInNlcmlhbHBvcnRzIiwgb3B0aW9uLCAiKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykgCgkJCUNPTVt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkgIAlidGVtcCA9IHN0cmNocih0ZW1wLCcsJyk7CgkJCWlmIChidGVtcCAhPSBOVUxMKSB7CgkJCSAgCSpidGVtcCsrID0gJ1wwJzsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IGF0b2koYnRlbXApOwoJCQl9IGVsc2UgewoJCQkJQ09NW3hdLmJhdWRyYXRlID0gLTE7CgkJCX0KCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZQoJCQkJaWYgKChDT01beF0uZGV2aWNlbmFtZSA9IG1hbGxvYyhzdHJsZW4odGVtcCkrMSkpID09IE5VTEwpIAoJCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJCWVsc2UgewoJCQkJCUNPTVt4XS5mZCA9IDA7CgkJCQkJc3RyY3B5KENPTVt4XS5kZXZpY2VuYW1lLCB0ZW1wKTsKCQkJCX0KICAgICAgICAgICAgICAgIFRSQUNFKCIlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAicGFyYWxsZWxwb3J0cyIsIG9wdGlvbiwgIioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBzaXplb2YodGVtcCkgKTsKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpCgkJCUxQVFt4XS5kZXZpY2VuYW1lID0gTlVMTDsKCQllbHNlIHsKCQkJc3RhdCh0ZW1wLCAmc3QpOwoJCQlpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIAoJCQkJV0FSTigiQ2FuJ3QgdXNlIGAlcycgYXMgJXMgIVxuIiwgdGVtcCwgb3B0aW9uKTsKCQkJZWxzZSAKCQkJCWlmICgoTFBUW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCQllbHNlIHsKCQkJCQlMUFRbeF0uZmQgPSAwOwoJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQl9CiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBMUFRbeF0uZGV2aWNlbmFtZSk7CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGZkKQp7CglpZiAoKGZkJjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoZmQmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtmZF0uZmQpCgkJICAgIHJldHVybiAmQ09NW2ZkXTsKCSAgICB9IGVsc2UgewoJCWZkICY9IDB4N2Y7CgkJaWYgKExQVFtmZF0uZmQpCgkJICAgIHJldHVybiAmTFBUW2ZkXTsKCSAgICB9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBpbnQgICAgR2V0Q29tbVBvcnRfZmQoaW50IGZkKQp7CiAgICAgICAgaW50IHg7CiAgICAgICAgCiAgICAgICAgZm9yICh4PTA7IHg8TUFYX1BPUlRTOyB4KyspIHsKICAgICAgICAgICAgIGlmIChDT01beF0uZmQgPT0gZmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICB9CiAgICAgICAKICAgICAgIHJldHVybiAtMTsKfSAKCnN0YXRpYyBpbnQgVmFsaWRDT01Qb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/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+bl93cml0ZSkgJiYKICAgICAgKGNvbW1fb3V0YnVmKHB0cik8cHRyLT5uX3dyaXRlKSkgewogICAgLyogcGFzc2VkIHRoZSB0cmFuc21pdCBub3RpZmljYXRpb24gdGhyZXNob2xkICovCiAgICBtYXNrIHw9IENOX1RSQU5TTUlUOwogIH0KCiAgLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KICBpZiAocHRyLT53bmQgJiYgbWFzaykgewogICAgVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CiAgICBDYWxsb3V0LlBvc3RNZXNzYWdlMTYocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7CiAgfQp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIGlmIChwdHItPnNfcmVhZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgcmV0dXJuOwogIHB0ci0+c19yZWFkID0gU0VSVklDRV9BZGRPYmplY3QoIEZJTEVfRHVwVW5peEhhbmRsZSggcHRyLT5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCB8IFNZTkNIUk9OSVpFICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fbm90aWZpY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUxPTkdfUFRSKXB0ciApOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXR3cml0ZShzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICBpZiAocHRyLT5zX3dyaXRlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSByZXR1cm47CiAgcHRyLT5zX3dyaXRlID0gU0VSVklDRV9BZGRPYmplY3QoIEZJTEVfRHVwVW5peEhhbmRsZSggcHRyLT5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFIHwgU1lOQ0hST05JWkUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fbm90aWZpY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVMT05HX1BUUilwdHIgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCCQkoVVNFUi4yMTMpCiAqLwpCT09MMTYgV0lOQVBJIEJ1aWxkQ29tbURDQjE2KExQQ1NUUiBkZXZpY2UsIExQRENCMTYgbHBkY2IpCnsKCS8qICJDT00xOjk2MDAsbiw4LDEiCSovCgkvKiAgMDEyMzQ1CQkqLwoJaW50IHBvcnQ7CgljaGFyICpwdHIsIHRlbXBbMjU2XTsKCglUUkFDRSgiKCVzKSwgcHRyICVwXG4iLCBkZXZpY2UsIGxwZGNiKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCQoKCQlpZiAocG9ydC0tID09IDApIHsKCQkJRVJSKCJCVUcgISBDT00wIGNhbid0IGV4aXN0IS5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewoJCQlGSVhNRSgiaW52YWxpZCBDT00gcG9ydCAlZD9cbiIscG9ydCk7CgkJCXJldHVybiAtMTsKCQl9CgkJCgkJbWVtc2V0KGxwZGNiLCAwLCBzaXplb2YoRENCMTYpKTsgLyogaW5pdGlhbGl6ZSAqLwoKCQlscGRjYi0+SWQgPSBwb3J0OwoJCQoJCWlmICghKihkZXZpY2UrNCkpCgkJCXJldHVybiAwOwoKCQlpZiAoKihkZXZpY2UrNCkgIT0gJzonKQoJCQlyZXR1cm4gLTE7CgkJCgkJc3RyY3B5KHRlbXAsZGV2aWNlKzUpOwoJCXB0ciA9IHN0cnRvayh0ZW1wLCAiLCAiKTsgCgoJCWlmIChDT01bcG9ydF0uYmF1ZHJhdGUgPiAwKQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBDT01bcG9ydF0uYmF1ZHJhdGU7CgkJZWxzZQoJCQlscGRjYi0+QmF1ZFJhdGUgPSBhdG9pKHB0cik7CiAgICAgICAgCVRSQUNFKCJiYXVkcmF0ZSAoJWQpXG4iLCBscGRjYi0+QmF1ZFJhdGUpOwoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7CgkJaWYgKGlzbG93ZXIoKnB0cikpCgkJCSpwdHIgPSB0b3VwcGVyKCpwdHIpOwoKICAgICAgICAJVFJBQ0UoInBhcml0eSAoJWMpXG4iLCAqcHRyKTsKCQlscGRjYi0+ZlBhcml0eSA9IFRSVUU7CgkJc3dpdGNoICgqcHRyKSB7CgkJCWNhc2UgJ04nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE5PUEFSSVRZOwoJCQkJbHBkY2ItPmZQYXJpdHkgPSBGQUxTRTsKCQkJCWJyZWFrOwkJCQoJCQljYXNlICdFJzoKCQkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWNhc2UgJ00nOgoJCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnTyc6CgkJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwoJCQkJYnJlYWs7CQkJCgkJCWRlZmF1bHQ6CgkJCQlXQVJOKCJVbmtub3duIHBhcml0eSBgJWMnIVxuIiwgKnB0cik7CgkJCQlyZXR1cm4gLTE7CgkJfQoKCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7IAogICAgICAgICAJVFJBQ0UoImNoYXJzaXplICglYylcbiIsICpwdHIpOwoJCWxwZGNiLT5CeXRlU2l6ZSA9ICpwdHIgLSAnMCc7CgoJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsKICAgICAgICAJVFJBQ0UoInN0b3BiaXRzICglYylcbiIsICpwdHIpOwoJCXN3aXRjaCAoKnB0cikgewoJCQljYXNlICcxJzoKCQkJCWxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAnMic6CgkJCQlscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCQkJCWJyZWFrOwkJCQoJCQlkZWZhdWx0OgoJCQkJV0FSTigiVW5rbm93biAjIG9mIHN0b3BiaXRzIGAlYychXG4iLCAqcHRyKTsKCQkJCXJldHVybiAtMTsKCQl9Cgl9CQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQsZmQ7CgogICAgCVRSQUNFKCIlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CgoJaWYgKHN0cmxlbihkZXZpY2UpIDwgNCkKCSAgIHJldHVybiBJRV9CQURJRDsKCglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkKCQlFUlIoIkJVRyAhIENPTTAgb3IgTFBUMCBkb24ndCBleGlzdCAhXG4iKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJCiAgICAgICAgICAgICAgICBUUkFDRSgiJXMgPSAlc1xuIiwgZGV2aWNlLCBDT01bcG9ydF0uZGV2aWNlbmFtZSk7CgoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gSUVfQkFESUQ7CgoJCWlmIChDT01bcG9ydF0uZmQpCgkJCXJldHVybiBJRV9PUEVOOwoKCQlmZCA9IG9wZW4oQ09NW3BvcnRdLmRldmljZW5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOwoJCWlmIChmZCA9PSAtMSkgewoJCQlFUlIoImVycm9yPSVkXG4iLCBlcnJubyk7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duW3BvcnRdID0gU0VHUFRSX0FMTE9DKDQwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnplcm8odW5rbm93bltwb3J0XSw0MCk7CgkJCUNPTVtwb3J0XS5mZCA9IGZkOwoJCQlDT01bcG9ydF0uY29tbWVycm9yID0gMDsKCQkJQ09NW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCUNPTVtwb3J0XS5ldnRjaGFyID0gMDsgLyogRklYTUU6IGRlZmF1bHQ/ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGVybWluYWwgc3RhdGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdGNnZXRhdHRyKGZkLCZtX3N0YXRbcG9ydF0pOwogICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgZGVmYXVsdCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKENPTVtwb3J0XS5iYXVkcmF0ZT4tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0IxNiBkY2I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb21tU3RhdGUxNihwb3J0LCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYi5CYXVkUmF0ZT1DT01bcG9ydF0uYmF1ZHJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3JlIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGF0YWJpdHMsIHBhcml0eSwgc3RvcGJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q29tbVN0YXRlMTYoICZkY2IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJCS8qIGluaXQgcHJpb3JpdHkgY2hhcmFjdGVycyAqLwoJCQlDT01bcG9ydF0udW5nZXQgPSAtMTsKCQkJQ09NW3BvcnRdLnhtaXQgPSAtMTsKCQkJLyogYWxsb2NhdGUgYnVmZmVycyAqLwoJCQlDT01bcG9ydF0uaWJ1Zl9zaXplID0gY2JJblF1ZXVlOwoJCQlDT01bcG9ydF0uaWJ1Zl9oZWFkID0gQ09NW3BvcnRdLmlidWZfdGFpbD0gMDsKCQkJQ09NW3BvcnRdLm9idWZfc2l6ZSA9IGNiT3V0UXVldWU7CgkJCUNPTVtwb3J0XS5vYnVmX2hlYWQgPSBDT01bcG9ydF0ub2J1Zl90YWlsID0gMDsKCgkJCUNPTVtwb3J0XS5pbmJ1ZiA9IG1hbGxvYyhjYkluUXVldWUpOwoJCQlpZiAoQ09NW3BvcnRdLmluYnVmKSB7CgkJCSAgQ09NW3BvcnRdLm91dGJ1ZiA9IG1hbGxvYyhjYk91dFF1ZXVlKTsKCQkJICBpZiAoIUNPTVtwb3J0XS5vdXRidWYpCgkJCSAgICBmcmVlKENPTVtwb3J0XS5pbmJ1Zik7CgkJCX0gZWxzZSBDT01bcG9ydF0ub3V0YnVmID0gTlVMTDsKCQkJaWYgKCFDT01bcG9ydF0ub3V0YnVmKSB7CgkJCSAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KCQkJICB0Y3NldGF0dHIoQ09NW3BvcnRdLmZkLFRDU0FOT1csJm1fc3RhdFtwb3J0XSk7CgkJCSAgY2xvc2UoQ09NW3BvcnRdLmZkKTsKCQkJICBFUlIoIm91dCBvZiBtZW1vcnkiKTsKCQkJICByZXR1cm4gSUVfTUVNT1JZOwoJCQl9CgogICAgICAgICAgICAgICAgICAgICAgICBDT01bcG9ydF0uc19yZWFkID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS5zX3dyaXRlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1fd2FpdHJlYWQoICZDT01bcG9ydF0gKTsKCQkJcmV0dXJuIHBvcnQ7CgkJfQoJfSAKCWVsc2UgCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJMUFQiLDMpKSB7CgkKCQlpZiAoIVZhbGlkTFBUUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoTFBUW3BvcnRdLmZkKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJZmQgPSBvcGVuKExQVFtwb3J0XS5kZXZpY2VuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKCQlpZiAoZmQgPT0gLTEpIHsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCUxQVFtwb3J0XS5mZCA9IGZkOwoJCQlMUFRbcG9ydF0uY29tbWVycm9yID0gMDsKCQkJTFBUW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCXJldHVybiBwb3J0fEZMQUdfTFBUOwoJCX0KCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xvc2VDb21tCQkoVVNFUi4yMDcpCiAqLwpJTlQxNiBXSU5BUEkgQ2xvc2VDb21tMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAgICAgICAgCiAgICAJVFJBQ0UoImNpZD0lZFxuIiwgY2lkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoIShjaWQmRkxBR19MUFQpKSB7CgkJLyogQ09NIHBvcnQgKi8KCQlTRUdQVFJfRlJFRSh1bmtub3duW2NpZF0pOyAvKiBbTFddICovCgoJCVNFUlZJQ0VfRGVsZXRlKCBDT01bY2lkXS5zX3dyaXRlICk7CgkJU0VSVklDRV9EZWxldGUoIENPTVtjaWRdLnNfcmVhZCApOwoJCS8qIGZyZWUgYnVmZmVycyAqLwoJCWZyZWUocHRyLT5vdXRidWYpOwoJCWZyZWUocHRyLT5pbmJ1Zik7CgoJCS8qIHJlc2V0IG1vZGVtIGxpbmVzICovCgkJdGNzZXRhdHRyKHB0ci0+ZmQsVENTQU5PVywmbV9zdGF0W2NpZF0pOwoJfQoKCWlmIChjbG9zZShwdHItPmZkKSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkvKiBGSVhNRTogc2hvdWxkIHdlIGNsZWFyIHB0ci0+ZmQgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmZkID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKFVTRVIuMjEwKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXB0ci0+c3VzcGVuZGVkID0gMTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJCShVU0VSLjIxMSkKICovCklOVDE2IFdJTkFQSSBDbGVhckNvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKCEocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglpbnQJbWF4OwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoImNpZD0lZCwgZnVuY3Rpb249JWRcbiIsIGNpZCwgbkZ1bmN0aW9uKTsKCWlmICgobkZ1bmN0aW9uICE9IEdFVE1BWENPTSkgJiYgKG5GdW5jdGlvbiAhPSBHRVRNQVhMUFQpKSB7CgkJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlpZiAodGNnZXRhdHRyKHB0ci0+ZmQsJnBvcnQpID09IC0xKSB7CgkJICAgICAgICBUUkFDRSgidGNnZXRhdHRyIGZhaWxlZFxuIik7CgkJCXB0ci0+Y29tbWVycm9yPVdpbkVycm9yKCk7CQoJCQlyZXR1cm4gLTE7CgkJfQoJfSBlbHNlIHB0ciA9IE5VTEw7CgoJc3dpdGNoIChuRnVuY3Rpb24pIHsKCQljYXNlIFJFU0VUREVWOgoJCSAgICAgICAgVFJBQ0UoIlJFU0VUREVWXG4iKTsKCQkJYnJlYWs7CQkJCQkKCgkJY2FzZSBHRVRNQVhDT006CgkJICAgICAgICBUUkFDRSgiR0VUTUFYQ09NXG4iKTsgCgkJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFDT01bbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQkJOwoJCQlyZXR1cm4gbWF4OwoJCQlicmVhazsKCgkJY2FzZSBHRVRNQVhMUFQ6CgkJICAgICAgICBUUkFDRSgiR0VUTUFYTFBUXG4iKTsgCgkJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFMUFRbbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQkJOwoJCQlyZXR1cm4gRkxBR19MUFQgKyBtYXg7CgkJCWJyZWFrOwoKCQljYXNlIEdFVEJBU0VJUlE6CgkJICAgICAgICBUUkFDRSgiR0VUQkFTRUlSUVxuIik7IAoJCQkvKiBGSVhNRTogdXNlIHRhYmxlcyAqLwoJCQkvKiBqdXN0IGZha2Ugc29tZXRoaW5nIGZvciBub3cgKi8KCQkJaWYgKGNpZCAmIEZMQUdfTFBUKSB7CgkJCQkvKiBMUFQxOiBpcnEgNywgTFBUMjogaXJxIDUgKi8KCQkJCXJldHVybiAoY2lkICYgMHg3ZikgPyA1IDogNzsKCQkJfSBlbHNlIHsKCQkJCS8qIENPTTE6IGlycSA0LCBDT00yOiBpcnEgMywKCQkJCSAgIENPTTM6IGlycSA0LCBDT000OiBpcnEgMyAqLwoJCQkJcmV0dXJuIDQgLSAoY2lkICYgMSk7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgQ0xSRFRSOgoJCSAgICAgICAgVFJBQ0UoIkNMUkRUUlxuIik7IAojaWZkZWYgVElPQ01fRFRSCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgflRJT0NNX0RUUiwgMCk7CiNlbmRpZgoJCWNhc2UgQ0xSUlRTOgoJCSAgICAgICAgVFJBQ0UoIkNMUlJUU1xuIik7IAojaWZkZWYgVElPQ01fUlRTCgkJCXJldHVybiBDT01NX1doYWNrTW9kZW0ocHRyLT5mZCwgflRJT0NNX1JUUywgMCk7CiNlbmRpZgoJCgkJY2FzZSBTRVREVFI6CgkJICAgICAgICBUUkFDRSgiU0VURFRSXG4iKTsgCiNpZmRlZiBUSU9DTV9EVFIKCQkJcmV0dXJuIENPTU1fV2hhY2tNb2RlbShwdHItPmZkLCAwLCBUSU9DTV9EVFIpOwojZW5kaWYKCgkJY2FzZSBTRVRSVFM6CgkJICAgICAgICBUUkFDRSgiU0VUUlRTXG4iKTsgCiNpZmRlZiBUSU9DTV9SVFMJCQkKCQkJcmV0dXJuIENPTU1fV2hhY2tNb2RlbShwdHItPmZkLCAwLCBUSU9DTV9SVFMpOwojZW5kaWYKCgkJY2FzZSBTRVRYT0ZGOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPRkZcbiIpOyAKCQkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJCQlicmVhazsKCgkJY2FzZSBTRVRYT046CgkJICAgICAgICBUUkFDRSgiU0VUWE9OXG4iKTsgCgkJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJV0FSTigiKGNpZD0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLCAKCQkJY2lkLCBuRnVuY3Rpb24pOwoJCQlicmVhazsJCQkJCgl9CgkKCWlmICh0Y3NldGF0dHIocHRyLT5mZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwkKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRmx1c2hDb21tCShVU0VSLjIxNSkKICovCklOVDE2IFdJTkFQSSBGbHVzaENvbW0xNihJTlQxNiBjaWQsSU5UMTYgZm5RdWV1ZSkKewoJaW50IHF1ZXVlOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkLCBxdWV1ZT0lZFxuIiwgY2lkLCBmblF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9Cglzd2l0Y2ggKGZuUXVldWUpIHsKCQljYXNlIDA6CgkJICBxdWV1ZSA9IFRDT0ZMVVNIOwoJCSAgcHRyLT5vYnVmX3RhaWwgPSBwdHItPm9idWZfaGVhZDsKCQkgIGJyZWFrOwoJCWNhc2UgMToKCQkgIHF1ZXVlID0gVENJRkxVU0g7CgkJICBwdHItPmlidWZfaGVhZCA9IHB0ci0+aWJ1Zl90YWlsOwoJCSAgYnJlYWs7CgkJZGVmYXVsdDoKCQkgIFdBUk4oIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwgCgkJICAgICAgICAgICAgY2lkLCBmblF1ZXVlKTsKCQkgIHJldHVybiAtMTsKCQl9CglpZiAodGNmbHVzaChwdHItPmZkLCBxdWV1ZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwkKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9ICAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXJyb3IJKFVTRVIuMjAzKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1FcnJvcjE2KElOVDE2IGNpZCxMUENPTVNUQVQxNiBscFN0YXQpCnsKCWludAkJdGVtcGVycm9yOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CiAgICAgICAgdW5zaWduZWQgaW50IG1zdGF0OwoKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KICAgICAgICBpZiAoY2lkJkZMQUdfTFBUKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gQ0VfTU9ERTsKICAgICAgICB9CiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopdW5rbm93bltjaWRdICsgQ09NTV9NU1JfT0ZGU0VUOwogICAgICAgIGlvY3RsKHB0ci0+ZmQsVElPQ01HRVQsJm1zdGF0KTsKICAgICAgICBDT01NX01TUlVwZGF0ZSggc3RvbCwgbXN0YXQpOwoKCWlmIChscFN0YXQpIHsKCQlscFN0YXQtPnN0YXR1cyA9IDA7CgoJCWxwU3RhdC0+Y2JPdXRRdWUgPSBjb21tX291dGJ1ZihwdHIpOwoJCWxwU3RhdC0+Y2JJblF1ZSA9IGNvbW1faW5idWYocHRyKTsKCiAgICAJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBscFN0YXQgJWQgJWQgJWQgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCBscFN0YXQtPnN0YXR1cywgbHBTdGF0LT5jYkluUXVlLCAKCQkJICAgICBscFN0YXQtPmNiT3V0UXVlLCAqc3RvbCk7Cgl9CgllbHNlCgkJVFJBQ0UoImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCBOVUxMIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgKnN0b2wpOwoKCS8qIFJldHVybiBhbnkgZXJyb3JzIGFuZCBjbGVhciBpdCAqLwoJdGVtcGVycm9yID0gcHRyLT5jb21tZXJyb3I7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4odGVtcGVycm9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1FdmVudE1hc2sJKFVTRVIuMjA4KQogKi8KU0VHUFRSIFdJTkFQSSBTZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmdUV2dE1hc2spCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwogICAgICAgIGludCByZXBpZDsKICAgICAgICB1bnNpZ25lZCBpbnQgbXN0YXQ7CgogICAgCVRSQUNFKCJjaWQgJWQsbWFzayAlZFxuIixjaWQsZnVFdnRNYXNrKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJICAgIHJldHVybiAoU0VHUFRSKU5VTEw7Cgl9CgoJcHRyLT5ldmVudG1hc2sgPSBmdUV2dE1hc2s7CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiAgICAgICAgfQogICAgICAgIC8qIGl0J3MgYSBDT00gcG9ydCA/IC0+IG1vZGlmeSBmbGFncyAqLwogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKXVua25vd25bY2lkXSArIENPTU1fTVNSX09GRlNFVDsKCXJlcGlkID0gaW9jdGwocHRyLT5mZCxUSU9DTUdFVCwmbXN0YXQpOwoJVFJBQ0UoIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlcCAlcFxuIixyZXBpZCxtc3RhdCxzdG9sLHVua25vd25bY2lkXSk7CiAgICAgICAgQ09NTV9NU1JVcGRhdGUoIHN0b2wsIG1zdGF0KTsKCglUUkFDRSgiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwoJcmV0dXJuIFNFR1BUUl9HRVQodW5rbm93bltjaWRdKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1FdmVudE1hc2sJKFVTRVIuMjA5KQogKi8KVUlOVDE2IFdJTkFQSSBHZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmbkV2dENsZWFyKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglXT1JEIGV2ZW50czsKCiAgICAJVFJBQ0UoImNpZCAlZCwgbWFzayAlZFxuIiwgY2lkLCBmbkV2dENsZWFyKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJICAgIHJldHVybiAwOwoJfQoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJZXZlbnRzID0gKihXT1JEKikodW5rbm93bltjaWRdKSAmIGZuRXZ0Q2xlYXI7CgkqKFdPUkQqKSh1bmtub3duW2NpZF0pICY9IH5mbkV2dENsZWFyOwoJcmV0dXJuIGV2ZW50czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1TdGF0ZTE2CShVU0VSLjIwMSkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tU3RhdGUxNihMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgdGVybWlvcyBwb3J0OwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIGludCBieXRlc2l6ZSwgc3RvcGJpdHM7CiAgICAgICAgaW50IGZhaWw9MDsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBscGRjYi0+SWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGxwZGNiLT5JZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixscGRjYi0+SWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CgoJcG9ydC5jX2NjW1ZNSU5dID0gMDsKCXBvcnQuY19jY1tWVElNRV0gPSAxOwoKI2lmZGVmIElNQVhCRUwKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1J8SU1BWEJFTCk7CiNlbHNlCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSKTsKI2VuZGlmCglwb3J0LmNfaWZsYWcgfD0gKElHTkJSSyk7CgoJcG9ydC5jX29mbGFnICY9IH4oT1BPU1QpOwoKCXBvcnQuY19jZmxhZyAmPSB+KEhVUENMKTsKCXBvcnQuY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsKCglwb3J0LmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJU0lHKTsKCXBvcnQuY19sZmxhZyB8PSBOT0ZMU0g7CgogICAgCVRSQUNFKCJiYXVkcmF0ZSAlZFxuIixscGRjYi0+QmF1ZFJhdGUpOwojaWZkZWYgQ0JBVUQKCXBvcnQuY19jZmxhZyAmPSB+Q0JBVUQ7Cglzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewoJCWNhc2UgMTEwOgoJCWNhc2UgQ0JSXzExMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzMDA6CgkJY2FzZSBDQlJfMzAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjMwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDYwMDoKCQljYXNlIENCUl82MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTIwMDoKCQljYXNlIENCUl8xMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAyNDAwOgoJCWNhc2UgQ0JSXzI0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMjQwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDQ4MDA6CgkJY2FzZSBDQlJfNDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0ODAwOwoJCQlicmVhazsJCQoJCWNhc2UgOTYwMDoKCQljYXNlIENCUl85NjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjk2MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAxOTIwMDoKCQljYXNlIENCUl8xOTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxOTIwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDM4NDAwOgoJCWNhc2UgQ0JSXzM4NDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwoJCQlicmVhazsJCQojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSA1NzYwMToKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgoJCWRlZmF1bHQ6CgkJCXB0ci0+Y29tbWVycm9yID0gSUVfQkFVRFJBVEU7CgkJCWZhaWw9MTsKCX0KI2VsaWYgIWRlZmluZWQoX19FTVhfXykKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5jb21tZXJyb3IgPSBJRV9CQVVEUkFURTsKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbD0xOwogICAgICAgIH0KICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCiAgICAgICAgYnl0ZXNpemU9bHBkY2ItPkJ5dGVTaXplOwogICAgICAgIHN0b3BiaXRzPWxwZGNiLT5TdG9wQml0czsKCiAgICAJVFJBQ0UoImZQYXJpdHkgJWQgUGFyaXR5ICVkXG4iLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5KTsKI2lmZGVmIENNU1BBUgoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKI2Vsc2UKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiNlbmRpZgoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBDTVNQQVIKICAgICAgICAgICAgICAgIC8qIExpbnV4IGRlZmluZXMgbWFyay9zcGFjZSAoc3RpY2spIHBhcml0eSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQgfCAgQ01TUEFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgICAgICAgICAvKiB0cnkgdGhlIFBPU0lYIHdheSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggc3RvcGJpdHMgPT0gT05FU1RPUEJJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcGJpdHMgPSBUV09TVE9QQklUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmNvbW1lcnJvciA9IElFX0JZVEVTSVpFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbD0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJ5dGVzaXplIDwgOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNpemUgKz0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+Y29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsPTE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbD0xOwogICAgICAgIH0KCQogICAgCVRSQUNFKCJieXRlc2l6ZSAlZFxuIixieXRlc2l6ZSk7Cglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChieXRlc2l6ZSkgewoJCWNhc2UgNToKCQkJcG9ydC5jX2NmbGFnIHw9IENTNTsKCQkJYnJlYWs7CgkJY2FzZSA2OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M2OwoJCQlicmVhazsKCQljYXNlIDc6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzc7CgkJCWJyZWFrOwoJCWNhc2UgODoKCQkJcG9ydC5jX2NmbGFnIHw9IENTODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKCQkJZmFpbD0xOwoJfQoKICAgIAlUUkFDRSgic3RvcGJpdHMgJWRcbiIsc3RvcGJpdHMpOwoKCXN3aXRjaCAoc3RvcGJpdHMpIHsKCQljYXNlIE9ORVNUT1BCSVQ6CgkJCQlwb3J0LmNfY2ZsYWcgJj0gfkNTVE9QQjsKCQkJCWJyZWFrOwoJCWNhc2UgT05FNVNUT1BCSVRTOiAvKiB3aWwgYmUgc2VsZWN0ZWQgaWYgYnl0ZXNpemUgaXMgNSAqLwoJCWNhc2UgVFdPU1RPUEJJVFM6CgkJCQlwb3J0LmNfY2ZsYWcgfD0gQ1NUT1BCOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcHRyLT5jb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKCQkJZmFpbD0xOwoJfQojaWZkZWYgQ1JUU0NUUwoKCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93IHx8IGxwZGNiLT5mT3V0eEN0c0Zsb3cpCgkJcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgoJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkgCgkJcG9ydC5jX2NmbGFnICY9IH5DUlRTQ1RTOwojZW5kaWYJCglpZiAobHBkY2ItPmZJblgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT047CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9OOwoJaWYgKGxwZGNiLT5mT3V0WCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9GRjsKCglwdHItPmV2dGNoYXIgPSBscGRjYi0+RXZ0Q2hhcjsKCiAgICAgICAgaWYoZmFpbCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIAoJaWYgKHRjc2V0YXR0cihwdHItPmZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsJCgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJaW50IHNwZWVkOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJc3RydWN0IHRlcm1pb3MgcG9ydDsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICh0Y2dldGF0dHIocHRyLT5mZCwgJnBvcnQpID09IC0xKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CglscGRjYi0+SWQgPSBjaWQ7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICAgICBzcGVlZCA9IHBvcnQuY19jZmxhZyAmIENCQVVEOwojZWxzZQogICAgICAgIHNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCiAgICAgICAgc3dpdGNoKHNwZWVkKSB7CgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSBCNTc2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDU3NjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMTsKCQkJYnJlYWs7CiNlbmRpZgoJfQojZW5kaWYKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgQ1NJWkUpIHsKCQljYXNlIENTNToKCQkJbHBkY2ItPkJ5dGVTaXplID0gNTsKCQkJYnJlYWs7CgkJY2FzZSBDUzY6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDY7CgkJCWJyZWFrOwoJCWNhc2UgQ1M3OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA3OwoJCQlicmVhazsKCQljYXNlIENTODoKCQkJbHBkY2ItPkJ5dGVTaXplID0gODsKCQkJYnJlYWs7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7CiNpZmRlZiBDTVNQQVIKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUikpCiNlbHNlCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKQojZW5kaWYKCXsKCQljYXNlIDA6CgkJCWxwZGNiLT5QYXJpdHkgPSBOT1BBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSBQQVJFTkI6CgkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIChQQVJFTkIgfCBQQVJPREQpOgoJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwkJCgkJCWJyZWFrOwojaWZkZWYgQ01TUEFSCgkJY2FzZSAoUEFSRU5CIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CQkKCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gU1BBQ0VQQVJJVFk7CQkKCQkJYnJlYWs7CiNlbmRpZgoJfQoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDU1RPUEIpCiAgICAgICAgICAgIGlmKGxwZGNiLT5CeXRlU2l6ZSA9PSA1KQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FNVNUT1BCSVRTOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FU1RPUEJJVDsKCglscGRjYi0+UmxzVGltZW91dCA9IDUwOwoJbHBkY2ItPkN0c1RpbWVvdXQgPSA1MDsgCglscGRjYi0+RHNyVGltZW91dCA9IDUwOwoJbHBkY2ItPmZOdWxsID0gMDsKCWxwZGNiLT5mQ2hFdnQgPSAwOwoJbHBkY2ItPmZCaW5hcnkgPSAxOwoJbHBkY2ItPmZEdHJEaXNhYmxlID0gMDsKCiNpZmRlZiBDUlRTQ1RTCgoJaWYgKHBvcnQuY19jZmxhZyAmIENSVFNDVFMpIHsKCQlscGRjYi0+ZkR0cmZsb3cgPSAxOwoJCWxwZGNiLT5mUnRzZmxvdyA9IDE7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IDE7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IDE7Cgl9IGVsc2UgCiNlbmRpZgoJCWxwZGNiLT5mRHRyRGlzYWJsZSA9IDE7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT04pCgkJbHBkY2ItPmZJblggPSAxOwoJZWxzZQoJCWxwZGNiLT5mSW5YID0gMDsKCglpZiAocG9ydC5jX2lmbGFnICYgSVhPRkYpCgkJbHBkY2ItPmZPdXRYID0gMTsKCWVsc2UKCQlscGRjYi0+Zk91dFggPSAwOwovKgoJbHBkY2ItPlhvbkNoYXIgPSAKCWxwZGNiLT5Yb2ZmQ2hhciA9IAogKi8KCWxwZGNiLT5Yb25MaW0gPSAxMDsKCWxwZGNiLT5Yb2ZmTGltID0gMTA7CgoJbHBkY2ItPkV2dENoYXIgPSBwdHItPmV2dGNoYXI7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShVU0VSLjIwNikKICovCklOVDE2IFdJTkFQSSBUcmFuc21pdENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hUcmFuc21pdCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBkYXRhICVkIFxuIiwgY2lkLCBjaFRyYW5zbWl0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+eG1pdCA+PSAwKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfVFhGVUxMOwoJICByZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSB7CgkgIC8qIHRyYW5zbWl0IHF1ZXVlIGVtcHR5LCB0cnkgdG8gdHJhbnNtaXQgZGlyZWN0bHkgKi8KCSAgaWYgKHdyaXRlKHB0ci0+ZmQsICZjaFRyYW5zbWl0LCAxKSA9PSAtMSkgewoJICAgIC8qIGRpZG4ndCB3b3JrLCBxdWV1ZSBpdCAqLwoJICAgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgICAgY29tbV93YWl0d3JpdGUocHRyKTsKCSAgfQoJfSBlbHNlIHsKCSAgLyogZGF0YSBpbiBxdWV1ZSwgbGV0IHRoaXMgY2hhciBiZSB0cmFuc21pdHRlZCBuZXh0ICovCgkgIHB0ci0+eG1pdCA9IGNoVHJhbnNtaXQ7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVbmdldENvbW1DaGFyCShVU0VSLjIxMikKICovCklOVDE2IFdJTkFQSSBVbmdldENvbW1DaGFyMTYoSU5UMTYgY2lkLENIQVIgY2hVbmdldCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkIChjaGFyICVkKVxuIiwgY2lkLCBjaFVuZ2V0KTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+dW5nZXQ+PTApIHsKCSAgLyogY2hhcmFjdGVyIGFscmVhZHkgcXVldWVkICovCgkgIC8qIEZJWE1FOiB3aGljaCBlcnJvciB3b3VsZCBXaW5kb3dzIHJldHVybj8gKi8KCSAgcHRyLT5jb21tZXJyb3IgPSBDRV9SWE9WRVI7CgkgIHJldHVybiAtMTsKCX0KCglwdHItPnVuZ2V0ID0gY2hVbmdldDsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVJlYWRDb21tCShVU0VSLjIwNCkKICovCklOVDE2IFdJTkFQSSBSZWFkQ29tbTE2KElOVDE2IGNpZCxMUFNUUiBscHZCdWYsSU5UMTYgY2JSZWFkKQp7CglpbnQgc3RhdHVzLCBsZW5ndGg7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglMUFNUUiBvcmdCdWYgPSBscHZCdWY7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCBjaWQsIGxwdkJ1ZiwgY2JSZWFkKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghLlxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJLyogcmVhZCB1bmdldCBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkJKmxwdkJ1ZisrID0gcHRyLT51bmdldDsKCQlwdHItPnVuZ2V0ID0gLTE7CgoJCWxlbmd0aCA9IDE7Cgl9IGVsc2UKCSAJbGVuZ3RoID0gMDsKCgkvKiByZWFkIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KCXdoaWxlIChsZW5ndGggPCBjYlJlYWQpIHsKCSAgc3RhdHVzID0gKChwdHItPmlidWZfaGVhZCA8IHB0ci0+aWJ1Zl90YWlsKSA/CgkJICAgIHB0ci0+aWJ1Zl9zaXplIDogcHRyLT5pYnVmX2hlYWQpIC0gcHRyLT5pYnVmX3RhaWw7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYlJlYWQgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiUmVhZCAtIGxlbmd0aDsKCgkgIG1lbWNweShscHZCdWYsIHB0ci0+aW5idWYgKyBwdHItPmlidWZfdGFpbCwgc3RhdHVzKTsKCSAgcHRyLT5pYnVmX3RhaWwgKz0gc3RhdHVzOwoJICBpZiAocHRyLT5pYnVmX3RhaWwgPj0gcHRyLT5pYnVmX3NpemUpCgkgICAgcHRyLT5pYnVmX3RhaWwgPSAwOwoJICBscHZCdWYgKz0gc3RhdHVzOwoJICBsZW5ndGggKz0gc3RhdHVzOwoJfQoKCVRSQUNFKCIlLipzXG4iLCBsZW5ndGgsIG9yZ0J1Zik7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCEuXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChwdHItPnN1c3BlbmRlZCkgewoJCXB0ci0+Y29tbWVycm9yID0gSUVfSEFSRFdBUkU7CgkJcmV0dXJuIC0xOwoJfQkKCQoJVFJBQ0UoIiUuKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOwoKCWxlbmd0aCA9IDA7Cgl3aGlsZSAobGVuZ3RoIDwgY2JXcml0ZSkgewoJICBpZiAoKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSAmJiAocHRyLT54bWl0IDwgMCkpIHsKCSAgICAvKiBubyBkYXRhIHF1ZXVlZCwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5ICovCgkgICAgc3RhdHVzID0gd3JpdGUocHRyLT5mZCwgbHB2QnVmLCBjYldyaXRlIC0gbGVuZ3RoKTsKCSAgICBpZiAoc3RhdHVzID4gMCkgewoJICAgICAgbHB2QnVmICs9IHN0YXR1czsKCSAgICAgIGxlbmd0aCArPSBzdGF0dXM7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgIH0KCSAgLyogY2FuJ3Qgd3JpdGUgZGlyZWN0bHksIHB1dCBpbnRvIHRyYW5zbWl0IGJ1ZmZlciAqLwoJICBzdGF0dXMgPSAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8KCQkgICAgKHB0ci0+b2J1Zl90YWlsLTEpIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX2hlYWQ7CgkgIGlmICghc3RhdHVzKSBicmVhazsKCSAgaWYgKChjYldyaXRlIC0gbGVuZ3RoKSA8IHN0YXR1cykKCSAgICBzdGF0dXMgPSBjYldyaXRlIC0gbGVuZ3RoOwoJICBtZW1jcHkobHB2QnVmLCBwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl9oZWFkLCBzdGF0dXMpOwoJICBwdHItPm9idWZfaGVhZCArPSBzdGF0dXM7CgkgIGlmIChwdHItPm9idWZfaGVhZCA+PSBwdHItPm9idWZfc2l6ZSkKCSAgICBwdHItPm9idWZfaGVhZCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7CgkgIGNvbW1fd2FpdHdyaXRlKHB0cik7Cgl9CgoJcHRyLT5jb21tZXJyb3IgPSAwOwkKCXJldHVybiBsZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbiAgIChVU0VSLjI0NikKICovCkJPT0wxNiBXSU5BUEkgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbjE2KCBJTlQxNiBjaWQsIEhXTkQxNiBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNiV3JpdGVOb3RpZnksIElOVDE2IGNiT3V0UXVldWUgKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgoJVFJBQ0UoIiglZCwgJXgsICVkLCAlZClcbiIsIGNpZCwgaHduZCwgY2JXcml0ZU5vdGlmeSwgY2JPdXRRdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IGh3bmQ7CglwdHItPm5fcmVhZCA9IGNiV3JpdGVOb3RpZnk7CglwdHItPm5fd3JpdGUgPSBjYk91dFF1ZXVlOwoJcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuMTQpCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBKExQQ1NUUiBkZXZpY2UsTFBEQ0IgbHBkY2IpCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJKEtFUk5FTDMyLjE1KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNBKExQQ1NUUiBkZXZpY2UsIExQRENCIGxwZGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCWludAlwb3J0OwoJY2hhcgkqcHRyLCp0ZW1wOwoKCVRSQUNFKCIoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKCglpZiAoIWxzdHJuY21waUEoZGV2aWNlLCJDT00iLDMpKSB7CgkJcG9ydD1kZXZpY2VbM10tJzAnOwoJCWlmIChwb3J0LS09PTApIHsKCQkJRVJSKCJCVUchIENPTTAgY2FuJ3QgZXhpc3RzIS5cbiIpOwoJCQlyZXR1cm4gRkFMU0U7CgkJfQoJCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKQoJCQlyZXR1cm4gRkFMU0U7CgkJaWYgKCooZGV2aWNlKzQpIT0nOicpCgkJCXJldHVybiBGQUxTRTsKCQl0ZW1wPShMUFNUUikoZGV2aWNlKzUpOwoJfSBlbHNlCgkJdGVtcD0oTFBTVFIpZGV2aWNlOwoKCWxwZGNiLT5EQ0JsZW5ndGgJPSBzaXplb2YoRENCKTsKCWlmIChzdHJjaHIodGVtcCwnLCcpKSB7CS8qIG9sZCBzdHlsZSAqLwoJCURDQjE2CWRjYjE2OwoJCUJPT0wxNglyZXQ7CgkJY2hhcglsYXN0PXRlbXBbc3RybGVuKHRlbXApLTFdOwoKCQlyZXQ9QnVpbGRDb21tRENCMTYoZGV2aWNlLCZkY2IxNik7CgkJaWYgKCFyZXQpCgkJCXJldHVybiBGQUxTRTsKCQlscGRjYi0+QmF1ZFJhdGUJCT0gZGNiMTYuQmF1ZFJhdGU7CgkJbHBkY2ItPkJ5dGVTaXplCQk9IGRjYjE2LkJ5dGVTaXplOwoJCWxwZGNiLT5mQmluYXJ5CQk9IGRjYjE2LmZCaW5hcnk7CgkJbHBkY2ItPlBhcml0eQkJPSBkY2IxNi5QYXJpdHk7CgkJbHBkY2ItPmZQYXJpdHkJCT0gZGNiMTYuZlBhcml0eTsKCQlscGRjYi0+Zk51bGwJCT0gZGNiMTYuZk51bGw7CgkJbHBkY2ItPlN0b3BCaXRzCQk9IGRjYjE2LlN0b3BCaXRzOwoJCWlmIChsYXN0ID09ICd4JykgewoJCQlscGRjYi0+ZkluWAkJPSBUUlVFOwoJCQlscGRjYi0+Zk91dFgJCT0gVFJVRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0gZWxzZSBpZiAobGFzdD09J3AnKSB7CgkJCWxwZGNiLT5mSW5YCQk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dFgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0eEN0c0Zsb3cJPSBUUlVFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gVFJVRTsKCQkJbHBkY2ItPmZEdHJDb250cm9sCT0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCQlscGRjYi0+ZlJ0c0NvbnRyb2wJPSBSVFNfQ09OVFJPTF9IQU5EU0hBS0U7CgkJfSBlbHNlIHsKCQkJbHBkY2ItPmZJblgJCT0gRkFMU0U7CgkJCWxwZGNiLT5mT3V0WAkJPSBGQUxTRTsKCQkJbHBkY2ItPmZPdXR4Q3RzRmxvdwk9IEZBTFNFOwoJCQlscGRjYi0+Zk91dHhEc3JGbG93CT0gRkFMU0U7CgkJCWxwZGNiLT5mRHRyQ29udHJvbAk9IERUUl9DT05UUk9MX0VOQUJMRTsKCQkJbHBkY2ItPmZSdHNDb250cm9sCT0gUlRTX0NPTlRST0xfRU5BQkxFOwoJCX0KCQlscGRjYi0+WG9uQ2hhcgk9IGRjYjE2LlhvbkNoYXI7CgkJbHBkY2ItPlhvZmZDaGFyCT0gZGNiMTYuWG9mZkNoYXI7CgkJbHBkY2ItPkVycm9yQ2hhcj0gZGNiMTYuUGVDaGFyOwoJCWxwZGNiLT5mRXJyb3JDaGFyPSBkY2IxNi5mUGVDaGFyOwoJCWxwZGNiLT5Fb2ZDaGFyCT0gZGNiMTYuRW9mQ2hhcjsKCQlscGRjYi0+RXZ0Q2hhcgk9IGRjYjE2LkV2dENoYXI7CgkJbHBkY2ItPlhvbkxpbQk9IGRjYjE2LlhvbkxpbTsKCQlscGRjYi0+WG9mZkxpbQk9IGRjYjE2LlhvZmZMaW07CgkJcmV0dXJuIFRSVUU7Cgl9CglwdHI9c3RydG9rKHRlbXAsIiAiKTsgCgl3aGlsZSAocHRyKSB7CgkJRFdPUkQJZmxhZyx4OwoKCQlmbGFnPTA7CgkJaWYgKCFzdHJuY21wKCJiYXVkPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJzdG9wPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5TdG9wQml0cyA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJkYXRhPSIscHRyLDUpKSB7CgkJCWlmICghc3NjYW5mKHB0cis1LCIlbGQiLCZ4KSkKCQkJCVdBUk4oIkNvdWxkbid0IHBhcnNlICVzXG4iLHB0cik7CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IHg7CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFzdHJuY21wKCJwYXJpdHk9IixwdHIsNykpIHsKCQkJbHBkY2ItPmZQYXJpdHkJPSBUUlVFOwoJCQlzd2l0Y2ggKHB0cls4XSkgewoJCQljYXNlICdOJzpjYXNlICduJzoKCQkJCWxwZGNiLT5mUGFyaXR5CT0gRkFMU0U7CgkJCQlscGRjYi0+UGFyaXR5CT0gTk9QQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnRSc6Y2FzZSAnZSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gRVZFTlBBUklUWTsKCQkJCWJyZWFrOwoJCQljYXNlICdPJzpjYXNlICdvJzoKCQkJCWxwZGNiLT5QYXJpdHkJPSBPRERQQVJJVFk7CgkJCQlicmVhazsKCQkJY2FzZSAnTSc6Y2FzZSAnbSc6CgkJCQlscGRjYi0+UGFyaXR5CT0gTUFSS1BBUklUWTsKCQkJCWJyZWFrOwoJCQl9CgkJCWZsYWc9MTsKCQl9CgkJaWYgKCFmbGFnKQoJCQlFUlIoIlVuaGFuZGxlZCBzcGVjaWZpZXIgJyVzJywgcGxlYXNlIHJlcG9ydC5cbiIscHRyKTsKCQlwdHI9c3RydG9rKE5VTEwsIiAiKTsKCX0KCWlmIChscGRjYi0+QmF1ZFJhdGU9PTExMCkKCQlscGRjYi0+U3RvcEJpdHMgPSAyOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVwkJKEtFUk5FTDMyLjE2KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQW5kVGltZW91dHNXKCBMUENXU1RSIGRldmlkLCBMUERDQiBscGRjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cyApCnsKCUxQU1RSCWRldmlkQTsKCUJPT0wJcmV0OwoKCVRSQUNFKCIoJXAsJXAsJXApXG4iLGRldmlkLGxwZGNiLGxwdGltZW91dHMpOwoJZGV2aWRBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXZpZCApOwoJcmV0PUJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzQShkZXZpZEEsbHBkY2IsbHB0aW1lb3V0cyk7CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRldmlkQSApOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgQnVpbGRDb21tRENCVwkJKEtFUk5FTDMyLjE3KQogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCVyhMUENXU1RSIGRldmlkLExQRENCIGxwZGNiKQp7CglyZXR1cm4gQnVpbGRDb21tRENCQW5kVGltZW91dHNXKGRldmlkLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDT01NX0dldFJlYWRGZAogKiAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgcmVhZGluZy4KICogIE1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlIGFmdGVyd2FyZHMhCiAqLwpzdGF0aWMgaW50IENPTU1fR2V0UmVhZEZkKCBIQU5ETEUgaGFuZGxlKQp7CiAgICBpbnQgZmQ7CiAgICBzdHJ1Y3QgZ2V0X3JlYWRfZmRfcmVxdWVzdCAqcmVxID0gZ2V0X3JlcV9idWZmZXIoKTsKICAgIHJlcS0+aGFuZGxlID0gaGFuZGxlOwogICAgc2VydmVyX2NhbGxfZmQoIFJFUV9HRVRfUkVBRF9GRCwgLTEsICZmZCApOwogICAgcmV0dXJuIGZkOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDT01NX0dldFdyaXRlRmQKICogIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHdyaXRpbmcuCiAqICBNYWtlIHN1cmUgdG8gY2xvc2UgdGhlIGhhbmRsZSBhZnRlcndhcmRzIQogKi8Kc3RhdGljIGludCBDT01NX0dldFdyaXRlRmQoIEhBTkRMRSBoYW5kbGUpCnsKICAgIGludCBmZCA9IC0xOwogICAgc3RydWN0IGdldF93cml0ZV9mZF9yZXF1ZXN0ICpyZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwogICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICBzZXJ2ZXJfY2FsbF9mZCggUkVRX0dFVF9XUklURV9GRCwgLTEsICZmZCApOwogICAgcmV0dXJuIGZkOwp9CgovKiBGSVhNRTogaGF2aW5nIHRoZXNlIGdsb2JhbCBmb3Igd2luMzIgZm9yIG5vdyAqLwppbnQgY29tbWVycm9yPTAsZXZlbnRtYXNrPTA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUJyZWFrCQkoS0VSTkVMMzIuNDQ5KQogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwogCglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJICAgICAgICBUUkFDRSgiQ09NTV9HZXRXcml0ZUZkIGZhaWxlZFxuIik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09LTEpCgkgIHsKCSAgICAgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJCXJldHVybiBGQUxTRTsKCSAgfQoJcmV0dXJuIFRSVUU7CiNlbHNlCglGSVhNRSgiaW9jdGwgbm90IGF2YWlsYWJsZVxuIik7CglTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CglyZXR1cm4gRkFMU0U7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJCShLRVJORUwzMi4yMCkKICovCkJPT0wgV0lOQVBJIENsZWFyQ29tbUJyZWFrKEhBTkRMRSBoYW5kbGUpCnsKI2lmIGRlZmluZWQoVElPQ1NCUkspICYmIGRlZmluZWQoVElPQ0NCUkspIC8qIGNoZWNrIGlmIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24gKi8KICAgICAgICBpbnQgZmQscmVzdWx0OwogCglmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwoJaWYoZmQ8MCkgewoJICAgICAgICBUUkFDRSgiQ09NTV9HZXRXcml0ZUZkIGZhaWxlZFxuIik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09LTEpCgkgIHsKCSAgICAgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9TVVBQT1JURUQpOwoJCXJldHVybiBGQUxTRTsKCSAgfQoJcmV0dXJuIFRSVUU7CiNlbHNlCglGSVhNRSgiaW9jdGwgbm90IGF2YWlsYWJsZVxuIik7CglTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CglyZXR1cm4gRkFMU0U7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRXNjYXBlQ29tbUZ1bmN0aW9uCShLRVJORUwzMi4yMTQpCiAqLwpCT09MIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24oSEFORExFIGhhbmRsZSxVSU5UIG5GdW5jdGlvbikKewoJaW50IGZkLGRpcmVjdD1GQUxTRSxyZXN1bHQ9RkFMU0U7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRSgiaGFuZGxlICVkLCBmdW5jdGlvbj0lZFxuIiwgaGFuZGxlLCBuRnVuY3Rpb24pOwoJZmQgPSBDT01NX0dldFdyaXRlRmQoaGFuZGxlKTsKCWlmKGZkPDApIHsKCQlGSVhNRSgiaGFuZGxlICVkIG5vdCBmb3VuZC5cbiIsaGFuZGxlKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKHRjZ2V0YXR0cihmZCwmcG9ydCkgPT0gLTEpIHsKCQljb21tZXJyb3I9V2luRXJyb3IoKTsKCQljbG9zZShmZCk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgkJY2FzZSBSRVNFVERFVjoKCQkgICAgICAgIFRSQUNFKCJcbiIpOwoJCQlicmVhazsJCQkJCQoKCQljYXNlIENMUkRUUjoKCQkgICAgICAgIFRSQUNFKCJDTFJEVFJcbiIpOwojaWZkZWYgVElPQ01fRFRSCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX0RUUiwgMCk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBDTFJSVFM6CgkJICAgICAgICBUUkFDRSgiQ0xSUlRTXG4iKTsKI2lmZGVmIFRJT0NNX1JUUwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIH5USU9DTV9SVFMsIDApOwoJCQlicmVhazsKI2VuZGlmCgkKCQljYXNlIFNFVERUUjoKCQkgICAgICAgIFRSQUNFKCJTRVREVFJcbiIpOwojaWZkZWYgVElPQ01fRFRSCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgMCwgVElPQ01fRFRSKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVFJUUzoKCQkgICAgICAgIFRSQUNFKCJTRVRSVFNcbiIpOwojaWZkZWYgVElPQ01fRFRSCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgMCwgVElPQ01fUlRTKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIFNFVFhPRkY6CgkJICAgICAgICBUUkFDRSgiU0VUWE9GRlxuIik7CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9GRjsKCQkJYnJlYWs7CgoJCWNhc2UgU0VUWE9OOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPTlxuIik7CgkJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJCQlicmVhazsKCQljYXNlIFNFVEJSRUFLOgoJCQlUUkFDRSgic2V0YnJlYWtcbiIpOwojaWZkZWYgCVRJT0NTQlJLCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQgPSBpb2N0bChmZCxUSU9DU0JSSywwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWNhc2UgQ0xSQlJFQUs6CgkJCVRSQUNFKCJjbHJicmVha1xuIik7CiNpZmRlZiAJVElPQ1NCUksKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdCA9IGlvY3RsKGZkLFRJT0NDQlJLLDApOwoJCQlicmVhazsKI2VuZGlmCgkJZGVmYXVsdDoKCQkJV0FSTigiKGhhbmRsZT0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLCAKCQkJaGFuZGxlLCBuRnVuY3Rpb24pOwoJCQlicmVhazsJCQkJCgl9CgkKCWlmICghZGlyZWN0KQoJICBpZiAodGNzZXRhdHRyKGZkLCBUQ1NBRFJBSU4sICZwb3J0KSA9PSAtMSkgewoJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJY2xvc2UoZmQpOwoJCXJldHVybiBGQUxTRTsJCgkgIH0gZWxzZSAKCSAgICAgICAgcmVzdWx0PSBUUlVFOwoJZWxzZQoJICB7CgkgICAgaWYgKHJlc3VsdCA9PSAtMSkKCSAgICAgIHsKCQlyZXN1bHQ9IEZBTFNFOwoJCWNvbW1lcnJvcj1XaW5FcnJvcigpOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHJlc3VsdCA9IFRSVUU7CgkgIH0KCWNsb3NlKGZkKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFB1cmdlQ29tbSAgICAgICAgKEtFUk5FTDMyLjU1NykKICovCkJPT0wgV0lOQVBJIFB1cmdlQ29tbSggSEFORExFIGhhbmRsZSwgRFdPUkQgZmxhZ3MpIAp7CiAgICAgaW50IGZkOwoKICAgICBUUkFDRSgiaGFuZGxlICVkLCBmbGFncyAlbHhcbiIsIGhhbmRsZSwgZmxhZ3MpOwoKICAgICBmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwogICAgIGlmKGZkPDApIHsKCUZJWE1FKCJubyBoYW5kbGUgJWQgZm91bmRcbiIsaGFuZGxlKTsKCXJldHVybiBGQUxTRTsKICAgICB9CgogICAgIC8qCiAgICAgKiogbm90IGV4YWN0bHkgc3VyZSBob3cgdGhlc2UgYXJlIGRpZmZlcmVudAogICAgICoqIFBlcmhhcHMgaWYgd2UgaGFkIG91ciBvd24gaW50ZXJuYWwgcXVldWVzLCBvbmUgZmx1c2hlcyB0aGVtCiAgICAgKiogYW5kIHRoZSBvdGhlciBmbHVzaGVzIHRoZSBrZXJuZWwncyBidWZmZXJzLgogICAgICovCiAgICAgaWYoZmxhZ3MmUFVSR0VfVFhBQk9SVCkKICAgICAgICAgdGNmbHVzaChmZCxUQ09GTFVTSCk7CiAgICAgaWYoZmxhZ3MmUFVSR0VfUlhBQk9SVCkKICAgICAgICAgdGNmbHVzaChmZCxUQ0lGTFVTSCk7CiAgICAgaWYoZmxhZ3MmUFVSR0VfVFhDTEVBUikKICAgICAgICAgdGNmbHVzaChmZCxUQ09GTFVTSCk7CiAgICAgaWYoZmxhZ3MmUFVSR0VfUlhDTEVBUikKICAgICAgICAgdGNmbHVzaChmZCxUQ0lGTFVTSCk7CiAgICAgY2xvc2UoZmQpOwoKICAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUVycm9yCShLRVJORUwzMi4yMSkKICovCkJPT0wgV0lOQVBJIENsZWFyQ29tbUVycm9yKEhBTkRMRSBoYW5kbGUsTFBEV09SRCBlcnJvcnMsTFBDT01TVEFUIGxwU3RhdCkKewogICAgaW50IGZkOwoKICAgIGZkPUNPTU1fR2V0UmVhZEZkKGhhbmRsZSk7CiAgICBpZigwPmZkKSAKICAgIHsKCUZJWE1FKCJubyBoYW5kbGUgJWQgZm91bmRcbiIsaGFuZGxlKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYgKGxwU3RhdCkgCiAgICB7CglscFN0YXQtPnN0YXR1cyA9IDA7CgojaWZkZWYgVElPQ09VVFEKCWlmKGlvY3RsKGZkLCBUSU9DT1VUUSwgJmxwU3RhdC0+Y2JPdXRRdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKI2Vsc2UKCWxwU3RhdC0+Y2JPdXRRdWUgPSAwOyAvKiBGSVhNRTogZmluZCBhIGRpZmZlcmVudCB3YXkgdG8gZmluZCBvdXQgKi8KI2VuZGlmCgoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKCglUUkFDRSgiaGFuZGxlICVkIGNiSW5RdWUgPSAlbGQgY2JPdXRRdWUgPSAlbGRcbiIsCgkgICAgICBoYW5kbGUsIGxwU3RhdC0+Y2JJblF1ZSwgbHBTdGF0LT5jYk91dFF1ZSk7CiAgICB9CgogICAgY2xvc2UoZmQpOwoKICAgIGlmKGVycm9ycykKICAgICAgICAqZXJyb3JzID0gMDsKCiAgICAvKgogICAgKiogQWZ0ZXIgYW4gYXN5bmNocm9ub3VzIHdyaXRlIG9wcGVyYXRpb24sIHRoZQogICAgKiogYXBwIHdpbGwgY2FsbCBDbGVhckNvbW1FcnJvciB0byBzZWUgaWYgdGhlCiAgICAqKiByZXN1bHRzIGFyZSByZWFkeSB5ZXQuIEl0IHdhaXRzIGZvciBFUlJPUl9JT19QRU5ESU5HCiAgICAqLwogICAgY29tbWVycm9yID0gRVJST1JfSU9fUEVORElORzsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU2V0dXBDb21tICAgICAgIChLRVJORUwzMi42NzYpCiAqLwpCT09MIFdJTkFQSSBTZXR1cENvbW0oIEhBTkRMRSBoYW5kbGUsIERXT1JEIGluc2l6ZSwgRFdPUkQgb3V0c2l6ZSkKewogICAgaW50IGZkOwoKICAgIEZJWE1FKCJpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKICAgIGZkPUNPTU1fR2V0V3JpdGVGZChoYW5kbGUpOwogICAgaWYoMD5mZCkgewoJRklYTUUoImhhbmRsZSAlZCBub3QgZm91bmQ/XG4iLGhhbmRsZSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgY2xvc2UoZmQpOwogICAgcmV0dXJuIFRSVUU7Cn0gCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbU1hc2sJKEtFUk5FTDMyLjE1NikKICovCkJPT0wgV0lOQVBJIEdldENvbW1NYXNrKEhBTkRMRSBoYW5kbGUsTFBEV09SRCBldnRtYXNrKQp7CiAgICBpbnQgZmQ7CgogICAgVFJBQ0UoImhhbmRsZSAlZCwgbWFzayAlcFxuIiwgaGFuZGxlLCBldnRtYXNrKTsKICAgIGlmKDA+KGZkPUNPTU1fR2V0UmVhZEZkKGhhbmRsZSkpKSAKICAgIHsKCUZJWE1FKCJubyBoYW5kbGUgJWQgZm91bmRcbiIsaGFuZGxlKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICAqZXZ0bWFzayA9IGV2ZW50bWFzazsKICAgIFRSQUNFKCIlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCgkgIChldmVudG1hc2smRVZfQlJFQUspPyJFVl9CUkVBSyI6IiIsCgkgIChldmVudG1hc2smRVZfQ1RTKT8iRVZfQ1RTIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9EU1IpPyJFVl9EU1IiOiIiLAoJICAoZXZlbnRtYXNrJkVWX0VSUik/IkVWX0VSUiI6IiIsCgkgIChldmVudG1hc2smRVZfUklORyk/IkVWX1JJTkciOiIiLAoJICAoZXZlbnRtYXNrJkVWX1JMU0QpPyJFVl9STFNEIjoiIiwKCSAgKGV2ZW50bWFzayZFVl9SWENIQVIpPyJFVl9SWENIQVIiOiIiLAoJICAoZXZlbnRtYXNrJkVWX1JYRkxBRyk/IkVWX1JYRkxBRyI6IiIsCgkgIChldmVudG1hc2smRVZfVFhFTVBUWSk/IkVWX1RYRU1QVFkiOiIiKTsKCSAgCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1NYXNrCShLRVJORUwzMi40NTEpCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tTWFzayhIQU5ETEUgaGFuZGxlLERXT1JEIGV2dG1hc2spCnsKICAgIGludCBmZDsKCiAgICBUUkFDRSgiaGFuZGxlICVkLCBtYXNrICVseFxuIiwgaGFuZGxlLCBldnRtYXNrKTsKICAgIFRSQUNFKCIlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCgkgIChldnRtYXNrJkVWX0JSRUFLKT8iRVZfQlJFQUsiOiIiLAoJICAoZXZ0bWFzayZFVl9DVFMpPyJFVl9DVFMiOiIiLAoJICAoZXZ0bWFzayZFVl9EU1IpPyJFVl9EU1IiOiIiLAoJICAoZXZ0bWFzayZFVl9FUlIpPyJFVl9FUlIiOiIiLAoJICAoZXZ0bWFzayZFVl9SSU5HKT8iRVZfUklORyI6IiIsCgkgIChldnRtYXNrJkVWX1JMU0QpPyJFVl9STFNEIjoiIiwKCSAgKGV2dG1hc2smRVZfUlhDSEFSKT8iRVZfUlhDSEFSIjoiIiwKCSAgKGV2dG1hc2smRVZfUlhGTEFHKT8iRVZfUlhGTEFHIjoiIiwKCSAgKGV2dG1hc2smRVZfVFhFTVBUWSk/IkVWX1RYRU1QVFkiOiIiKTsKCSAgCiAgICBpZigwPihmZD1DT01NX0dldFdyaXRlRmQoaGFuZGxlKSkpIHsKCUZJWE1FKCJubyBoYW5kbGUgJWQgZm91bmRcbiIsaGFuZGxlKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICBldmVudG1hc2sgPSBldnRtYXNrOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUgICAgKEtFUk5FTDMyLjQ1MikKICovCkJPT0wgV0lOQVBJIFNldENvbW1TdGF0ZShIQU5ETEUgaGFuZGxlLExQRENCIGxwZGNiKQp7CiAgICAgc3RydWN0IHRlcm1pb3MgcG9ydDsKICAgICBpbnQgZmQ7CiAgICAgaW50IGJ5dGVzaXplLCBzdG9wYml0czsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKICAgICBUUkFDRSgiYnl0ZXNpemUgJWQgYmF1ZHJhdGUgJWxkIGZQYXJpdHkgJWQgUGFyaXR5ICVkIHN0b3BiaXRzICVkXG4iLAoJICAgbHBkY2ItPkJ5dGVTaXplLGxwZGNiLT5CYXVkUmF0ZSxscGRjYi0+ZlBhcml0eSwgbHBkY2ItPlBhcml0eSwKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gT05FU1RPUEJJVCk/MToKCSAgIChscGRjYi0+U3RvcEJpdHMgPT0gVFdPU1RPUEJJVFMpPzI6MCk7CiAgICAgVFJBQ0UoIiVzICVzXG4iLChscGRjYi0+ZkluWCk/IklYT04iOiJ+SVhPTiIsCgkgICAobHBkY2ItPmZPdXRYKT8iSVhPRkYiOiJ+SVhPRkYiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0V3JpdGVGZChoYW5kbGUpKSA8IDApICB7CglGSVhNRSgibm8gaGFuZGxlICVkIGZvdW5kXG4iLGhhbmRsZSk7CglyZXR1cm4gRkFMU0U7CiAgICAgfQoKICAgICBpZiAoKHRjZ2V0YXR0cihmZCwmcG9ydCkpID09IC0xKSB7CiAgICAgICAgIGludCBzYXZlX2Vycm9yID0gZXJybm87CiAgICAgICAgIGNvbW1lcnJvciA9IFdpbkVycm9yKCk7CiAgICAgICAgIGNsb3NlKCBmZCApOwojaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgICAgICBFUlIoInRjZ2V0YXR0ciBlcnJvciAnJXMnXG4iLCBzdHJlcnJvcihzYXZlX2Vycm9yKSk7CiNlbHNlCiAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICVkXG4iLCBzYXZlX2Vycm9yKTsKI2VuZGlmCiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CgoJcG9ydC5jX2NjW1ZNSU5dID0gMDsKCXBvcnQuY19jY1tWVElNRV0gPSAxOwoKI2lmZGVmIElNQVhCRUwKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1J8SU1BWEJFTCk7CiNlbHNlCglwb3J0LmNfaWZsYWcgJj0gfihJU1RSSVB8QlJLSU5UfElHTkNSfElDUk5MfElOTENSKTsKI2VuZGlmCglwb3J0LmNfaWZsYWcgfD0gKElHTkJSSyk7CgoJcG9ydC5jX29mbGFnICY9IH4oT1BPU1QpOwoKCXBvcnQuY19jZmxhZyAmPSB+KEhVUENMKTsKCXBvcnQuY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsKCglwb3J0LmNfbGZsYWcgJj0gfihJQ0FOT058RUNIT3xJU0lHKTsKCXBvcnQuY19sZmxhZyB8PSBOT0ZMU0g7CgogICAgIC8qCiAgICAgKiogTUpNIC0gcmVtb3ZlZCBkZWZhdWx0IGJhdWRyYXRlIHNldHRpbmdzCiAgICAgKiogVFJBQ0UoY29tbSwiYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CiAgICAgKi8KI2lmZGVmIENCQVVECglwb3J0LmNfY2ZsYWcgJj0gfkNCQVVEOwoJc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKCQljYXNlIDExMDoKCQljYXNlIENCUl8xMTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTEwOwoJCQlicmVhazsJCQoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA2MDA6CgkJY2FzZSBDQlJfNjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjYwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDEyMDA6CgkJY2FzZSBDQlJfMTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMjQwMDoKCQljYXNlIENCUl8yNDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjI0MDA7CgkJCWJyZWFrOwkJCgkJY2FzZSA0ODAwOgoJCWNhc2UgQ0JSXzQ4MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNDgwMDsKCQkJYnJlYWs7CQkKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsJCQoJCWNhc2UgMTkyMDA6CgkJY2FzZSBDQlJfMTkyMDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTkyMDA7CgkJCWJyZWFrOwkJCgkJY2FzZSAzODQwMDoKCQljYXNlIENCUl8zODQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzODQwMDsKCQkJYnJlYWs7CQkKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgMTE1MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjExNTIwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMjMwNDAwCgkJY2FzZSAyMzA0MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMjMwNDAwOwoJCQlicmVhazsJCQojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgogICAgICAgCSAgICAgICAgZGVmYXVsdDoKCQkJY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CgkJCWNsb3NlKCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgc3dpdGNoIChscGRjYi0+QmF1ZFJhdGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjExMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzMwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA2MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl82MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTIwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzEyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI0MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8yNDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjI0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0ODAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfNDgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgOTYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzk2MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCOTYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE5MjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTkyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTkyMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzODQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzM4NDAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjM4NDAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lcnJvciA9IElFX0JBVURSQVRFOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKCQkJRVJSKCJiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKI2VuZGlmCiAgICAgICAgYnl0ZXNpemU9bHBkY2ItPkJ5dGVTaXplOwogICAgICAgIHN0b3BiaXRzPWxwZGNiLT5TdG9wQml0czsKCiNpZmRlZiBDTVNQQVIKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUik7CiNlbHNlCglwb3J0LmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwojZW5kaWYKCWlmIChscGRjYi0+ZlBhcml0eSkKICAgICAgICAgICAgcG9ydC5jX2lmbGFnIHw9IElOUENLOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICBzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKICAgICAgICAgICAgICAgIGNhc2UgTk9QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBPRERQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVWRU5QQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSBQQVJFTkI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgQ01TUEFSCiAgICAgICAgICAgICAgICAvKiBMaW51eCBkZWZpbmVzIG1hcmsvc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICAgICAgICAgICAgICAgIGNhc2UgTUFSS1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBDTVNQQVIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU1BBQ0VQQVJJVFk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19jZmxhZyB8PSAoUEFSRU5CIHwgUEFST0REIHwgIENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZWxzZQogICAgICAgICAgICAgICAgLyogdHJ5IHRoZSBQT1NJWCB3YXkgKi8KICAgICAgICAgICAgICAgIGNhc2UgTUFSS1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN0b3BiaXRzID09IE9ORVNUT1BCSVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BiaXRzID0gVFdPU1RPUEJJVFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiQ2Fubm90IHNldCBNQVJLIFBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNQQUNFUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggYnl0ZXNpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc2l6ZSArPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiQ2Fubm90IHNldCBTUEFDRSBQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCQlFUlIoIlBhcml0eVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CgkKCglwb3J0LmNfY2ZsYWcgJj0gfkNTSVpFOwoJc3dpdGNoIChieXRlc2l6ZSkgewoJCWNhc2UgNToKCQkJcG9ydC5jX2NmbGFnIHw9IENTNTsKCQkJYnJlYWs7CgkJY2FzZSA2OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M2OwoJCQlicmVhazsKCQljYXNlIDc6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzc7CgkJCWJyZWFrOwoJCWNhc2UgODoKCQkJcG9ydC5jX2NmbGFnIHw9IENTODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY29tbWVycm9yID0gSUVfQllURVNJWkU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCQlFUlIoIkJ5dGVTaXplXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQogICAgICAgIAoJc3dpdGNoIChzdG9wYml0cykgewoJCWNhc2UgT05FU1RPUEJJVDoKCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwoJCQkJYnJlYWs7CgkJY2FzZSBPTkU1U1RPUEJJVFM6IC8qIHdpbCBiZSBzZWxlY3RlZCBpZiBieXRlc2l6ZSBpcyA1ICovCgkJY2FzZSBUV09TVE9QQklUUzoKCQkJCXBvcnQuY19jZmxhZyB8PSBDU1RPUEI7CgkJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljb21tZXJyb3IgPSBJRV9CWVRFU0laRTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJCUVSUigiU3RvcEJpdHNcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRU5BQkxFfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRU5BQkxFCgkpIAoJICB7CgkgICAgcG9ydC5jX2NmbGFnIHw9IENSVFNDVFM7CgkgICAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJICB9CgkKCWlmIChscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRElTQUJMRSkKCSAgewoJICAgIHBvcnQuY19jZmxhZyAmPSB+Q1JUU0NUUzsKCSAgICBUUkFDRSgifkNSVFNDVFNcbiIpOwoJICB9CgojZW5kaWYJCglpZiAobHBkY2ItPmZJblgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT047CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9OOwoJaWYgKGxwZGNiLT5mT3V0WCkKCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgllbHNlCgkJcG9ydC5jX2lmbGFnICY9IH5JWE9GRjsKCglpZiAodGNzZXRhdHRyKGZkLFRDU0FOT1csJnBvcnQpPT0tMSkgeyAvKiBvdGhlcndpc2UgaXQgaGFuZ3Mgd2l0aCBwZW5kaW5nIGlucHV0Ki8KCSAgICAgICAgaW50IHNhdmVfZXJyb3I9ZXJybm87CgkJY29tbWVycm9yID0gV2luRXJyb3IoKTsJCiAgICAgICAgICAgICAgICBjbG9zZSggZmQgKTsKI2lmZGVmIEhBVkVfU1RSRVJST1IKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKI2Vsc2UKICAgICAgICAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICVkXG4iLCBzYXZlX2Vycm9yKTsKI2VuZGlmCgkJcmV0dXJuIEZBTFNFOwoJfSBlbHNlIHsKCQljb21tZXJyb3IgPSAwOwogICAgICAgICAgICAgICAgY2xvc2UoIGZkICk7CgkJcmV0dXJuIFRSVUU7Cgl9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShLRVJORUwzMi4xNTkpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tU3RhdGUoSEFORExFIGhhbmRsZSwgTFBEQ0IgbHBkY2IpCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZCxzcGVlZDsKCiAgICAgVFJBQ0UoImhhbmRsZSAlZCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgaWYgKChmZCA9IENPTU1fR2V0UmVhZEZkKGhhbmRsZSkpIDwgMCkgCiAgICAgICB7CgkgRVJSKCJjYW4ndCBnZXQgQ09NTV9HZXRSZWFkRmRcbiIpOwoJIHJldHVybiBGQUxTRTsKICAgICAgIH0KICAgICBpZiAodGNnZXRhdHRyKGZkLCAmcG9ydCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIGludCBzYXZlX2Vycm9yPWVycm5vOwojaWZkZWYgSEFWRV9TVFJFUlJPUgogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwojZWxzZQogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgZXJyb3IgJWRcbiIsIHNhdmVfZXJyb3IpOwojZW5kaWYKCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKICAgICAgICAgICAgICAgIGNsb3NlKCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KICAgICBjbG9zZSggZmQgKTsKI2lmbmRlZiBfX0VNWF9fCiNpZmRlZiBDQkFVRAogICAgIHNwZWVkPSAocG9ydC5jX2NmbGFnICYgQ0JBVUQpOwojZWxzZQogICAgIHNwZWVkPSAoY2ZnZXRvc3BlZWQoJnBvcnQpKTsKI2VuZGlmCiAgICAgc3dpdGNoIChzcGVlZCkgewoJCWNhc2UgQjExMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTEwOwoJCQlicmVhazsKCQljYXNlIEIzMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDMwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjEyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjI0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDI0MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjQ4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ4MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjk2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgQjE5MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxOTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMzg0MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgQjU3NjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA1NzYwMDsKCQkJYnJlYWs7CQkKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTUyMDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjIzMDQwMAogICAgICAgICAgICAgICAgY2FzZSBCMjMwNDAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAyMzA0MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgojaWZkZWYgQjQ2MDgwMAogICAgICAgICAgICAgICAgY2FzZSBCNDYwODAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA0NjA4MDA7CgkJCWJyZWFrOwkJCiNlbmRpZgoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNwZWVkICV4IFxuIixzcGVlZCk7Cgl9CiNlbmRpZgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA1OwoJCQlicmVhazsKCQljYXNlIENTNjoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNjsKCQkJYnJlYWs7CgkJY2FzZSBDUzc6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDc7CgkJCWJyZWFrOwoJCWNhc2UgQ1M4OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA4OwoJCQlicmVhazsKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzaXplICV4IFxuIixwb3J0LmNfY2ZsYWcgJiBDU0laRSk7Cgl9CQoJCiAgICAgICAgaWYocG9ydC5jX2lmbGFnICYgSU5QQ0spCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxwZGNiLT5mUGFyaXR5ID0gRkFMU0U7CiNpZmRlZiBDTVNQQVIKCXN3aXRjaCAocG9ydC5jX2NmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUikpCiNlbHNlCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQpKQojZW5kaWYKCXsKCQljYXNlIDA6CgkJCWxwZGNiLT5QYXJpdHkgPSBOT1BBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSBQQVJFTkI6CgkJCWxwZGNiLT5QYXJpdHkgPSBFVkVOUEFSSVRZOwoJCQlicmVhazsKCQljYXNlIChQQVJFTkIgfCBQQVJPREQpOgoJCQlscGRjYi0+UGFyaXR5ID0gT0REUEFSSVRZOwkJCgkJCWJyZWFrOwojaWZkZWYgQ01TUEFSCgkJY2FzZSAoUEFSRU5CIHwgQ01TUEFSKToKCQkJbHBkY2ItPlBhcml0eSA9IE1BUktQQVJJVFk7CQkKCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gU1BBQ0VQQVJJVFk7CQkKCQkJYnJlYWs7CiNlbmRpZgoJfQoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDU1RPUEIpCiAgICAgICAgICAgIGlmKGxwZGNiLT5CeXRlU2l6ZSA9PSA1KQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FNVNUT1BCSVRTOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBscGRjYi0+U3RvcEJpdHMgPSBUV09TVE9QQklUUzsKCWVsc2UKICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gT05FU1RPUEJJVDsKCglscGRjYi0+Zk51bGwgPSAwOwoJbHBkY2ItPmZCaW5hcnkgPSAxOwoKI2lmZGVmIENSVFNDVFMKCglpZiAocG9ydC5jX2NmbGFnICYgQ1JUU0NUUykgewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0VOQUJMRTsKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPSBSVFNfQ09OVFJPTF9FTkFCTEU7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IDE7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IDE7Cgl9IGVsc2UgCiNlbmRpZgoJewoJCWxwZGNiLT5mRHRyQ29udHJvbCA9IERUUl9DT05UUk9MX0RJU0FCTEU7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRElTQUJMRTsKCX0KCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0gCglscGRjYi0+WG9mZkNoYXIgPSAKICovCglscGRjYi0+WG9uTGltID0gMTA7CglscGRjYi0+WG9mZkxpbSA9IDEwOwoKCWNvbW1lcnJvciA9IDA7CgogICAgICAgIFRSQUNFKCJPS1xuIik7CiAKCVRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICAgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKCVRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRU5BQkxFfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRU5BQkxFCgkJKSAKCSAgVFJBQ0UoIkNSVFNDVFNcbiIpOwoJCglpZiAobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0RJU0FCTEUpCgkgIFRSQUNFKCJ+Q1JUU0NUU1xuIik7CgkKI2VuZGlmCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglUcmFuc21pdENvbW1DaGFyCShLRVJORUwzMi41MzUpCiAqLwpCT09MIFdJTkFQSSBUcmFuc21pdENvbW1DaGFyKEhBTkRMRSBoQ29tbSxDSEFSIGNoVHJhbnNtaXQpCnsKICAgIAlGSVhNRSgiKCV4LCclYycpLCB1c2Ugd2luMzIgaGFuZGxlIVxuIixoQ29tbSxjaFRyYW5zbWl0KTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuMTYwKQogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVRpbWVvdXRzKEhBTkRMRSBoY29tLExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpCnsKCUZJWE1FKCIoJXgsJXApOnN0dWIuXG4iLGhjb20sbHB0aW1lb3V0cyk7CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLjQ1MykKICovCkJPT0wgV0lOQVBJIFNldENvbW1UaW1lb3V0cyhIQU5ETEUgaGNvbSxMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSB7CgkvKiBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7ICovCglzdHJ1Y3QgdGVybWlvcwl0aW9zOwoJaW50CWZkOwoKCUZJWE1FKCIoJXgsJXApOnN0dWIuXG4iLGhjb20sbHB0aW1lb3V0cyk7CgkvKiAKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGhjb20pKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IS5cbiIsaGNvbSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJICovCgoJZmQgPSBDT01NX0dldFdyaXRlRmQoaGNvbSk7CglpZiAoZmQgPCAwKSB7CgkJRklYTUUoIm5vIGZkIGZvciBjaWQgPSAlMHghLlxuIixoY29tKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoKCUZJWE1FKCJSZWFkSW50ZXJ2YWxUaW1lb3V0ICVsZFxuIixscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0KTsKCUZJWE1FKCJSZWFkVG90YWxUaW1lb3V0TXVsdGlwbGllciAlbGRcbiIsbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIpOwoJRklYTUUoIlJlYWRUb3RhbFRpbWVvdXRDb25zdGFudCAlbGRcbiIsbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50KTsKCUZJWE1FKCJXcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIgJWxkXG4iLGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllcik7CglGSVhNRSgiV3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCAlbGRcbiIsbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCk7CgoKCWlmICgtMT09dGNnZXRhdHRyKGZkLCZ0aW9zKSkgewoJCUZJWE1FKCJ0Y2dldGF0dHIgb24gZmQgJWQgZmFpbGVkIVxuIixmZCk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJLyogVlRJTUUgaXMgaW4gMS8xMCBzZWNvbmRzICovCgl0aW9zLmNfY2NbVlRJTUVdPSAobHB0aW1lb3V0cy0+UmVhZEludGVydmFsVGltZW91dCs5OSkvMTAwOwoJaWYgKC0xPT10Y3NldGF0dHIoZmQsMCwmdGlvcykpIHsKCQlGSVhNRSgidGNzZXRhdHRyIG9uIGZkICVkIGZhaWxlZCFcbiIsZmQpOwoJCXJldHVybiBGQUxTRTsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Nb2RlbVN0YXR1cyAgIChLRVJORUwzMi4yODUpCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTW9kZW1TdGF0dXMoSEFORExFIGhGaWxlLExQRFdPUkQgbHBNb2RlbVN0YXQgKQp7CglpbnQgZmQsbXN0YXQsIHJlc3VsdD1GQUxTRTsKCQoJKmxwTW9kZW1TdGF0PTA7CiNpZmRlZiBUSU9DTUdFVAoJZmQgPSBDT01NX0dldFdyaXRlRmQoaEZpbGUpOwoJaWYoZmQ8MCkKCQlyZXR1cm4gRkFMU0U7CglyZXN1bHQgPSBpb2N0bChmZCwgVElPQ01HRVQsICZtc3RhdCk7CgljbG9zZShmZCk7CglpZiAocmVzdWx0ID09IC0xKQoJICB7CgkgICAgVFJBQ0UoImlvY3RsIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuIEZBTFNFOwoJICB9CglpZiAobXN0YXQgJiBUSU9DTV9DVFMpCgkgICAgKmxwTW9kZW1TdGF0IHw9IE1TX0NUU19PTjsKCWlmIChtc3RhdCAmIFRJT0NNX0RTUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX0RTUl9PTjsKCWlmIChtc3RhdCAmIFRJT0NNX1JORykKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JJTkdfT047CgkvKkZJWE1FOiAgTm90IHJlYWxseSBzdXJlIGFib3V0IFJMU0QgIFVCIDk5MDgxMCovCglpZiAobXN0YXQgJiBUSU9DTV9DQVIpCgkgICpscE1vZGVtU3RhdCB8PSBNU19STFNEX09OOwoJVFJBQ0UoIiVzJXMlcyVzXG4iLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfUkxTRF9PTik/Ik1TX1JMU0RfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JJTkdfT04pPyJNU19SSU5HX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19EU1JfT04pPyJNU19EU1JfT04gIjoiIiwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX0NUU19PTik/Ik1TX0NUU19PTiAiOiIiKTsKCXJldHVybiBUUlVFOwojZWxzZQoJcmV0dXJuIEZBTFNFOwojZW5kaWYKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFdhaXRDb21tRXZlbnQgICAoS0VSTkVMMzIuNzE5KQogKi8KQk9PTCBXSU5BUEkgV2FpdENvbW1FdmVudChIQU5ETEUgaEZpbGUsTFBEV09SRCBldmVudG1hc2sgLExQT1ZFUkxBUFBFRCBvdmVybGFwcGVkKQp7CglGSVhNRSgiKCVkICVwICVwIClcbiIsaEZpbGUsIGV2ZW50bWFzayxvdmVybGFwcGVkKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Qcm9wZXJ0aWVzICAgKEtFUk5FTDMyLj8/PykKICovCkJPT0wgV0lOQVBJIEdldENvbW1Qcm9wZXJ0aWVzKEhBTkRMRSBoRmlsZSwgTFBDT01NUFJPUCBscENvbW1Qcm9wKQp7CiAgICBGSVhNRSgiKCVkICVwIClcbiIsaEZpbGUsbHBDb21tUHJvcCk7CiAgICByZXR1cm4gVFJVRTsKfQoK