I2lmbmRlZiBXSU5FTElCCi8qIAogKiAgQ29weXJpZ2h0CTE5OTQJRXJpYyBZb3VuZGFsZSAmIEVyaWsgQm9zCiAqICBDb3B5cmlnaHQJMTk5NQlNYXJ0aW4gdm9uIEz2d2lzCiAqCiAqCWJhc2VkIG9uIEVyaWMgWW91bmRhbGUncyBwZS10ZXN0IGFuZDoKICoKICoJZnRwLm1pY3Jvc29mdC5jb206L3B1Yi9kZXZlbG9wZXIvTVNETi9DRDgvUEVGSUxFLlpJUAogKiBtYWtlIHRoYXQ6CiAqCWZ0cC5taWNyb3NvZnQuY29tOi9kZXZlbG9wci9NU0ROL09jdENEL1BFRklMRS5aSVAKICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJkbGxzLmgiCiNpbmNsdWRlICJuZWV4ZS5oIgojaW5jbHVkZSAicGVleGUuaCIKI2luY2x1ZGUgInBlX2ltYWdlLmgiCiNpbmNsdWRlICJyZWxheTMyLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgImFsaWFzLmgiCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgInRhc2suaCIKI2luY2x1ZGUgImxkdC5oIgojaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAieG1hbGxvYy5oIgoKc3RydWN0IHdfZmlsZXMgKndpbmVfZmlsZXMgPSBOVUxMOwoKdm9pZCBteV93Y3N0b21icyhjaGFyICogcmVzdWx0LCB1X3Nob3J0ICogc291cmNlLCBpbnQgbGVuKQp7CiAgd2hpbGUobGVuLS0pIHsKICAgIC8qIHRoaXMgdXNlZCB0byBiZSBpc2FzY2lpLCBidXQgc2VlIGlzYXNjaWkgaW1wbGVtZW50YXRpb24gaW4gTGludXgnCgkgICBjdHlwZS5oICovCiAgICBpZigqc291cmNlPDI1NSkgKnJlc3VsdCsrID0gKnNvdXJjZSsrOwogICAgZWxzZSB7CiAgICAgIHByaW50ZigiVW5hYmxlIHRvIGhhbmRsZSB1bmljb2RlIHJpZ2h0IG5vd1xuIik7CiAgICAgIGV4aXQoMCk7CiAgICB9CiAgfTsKfQoKI2lmIDAKY2hhciAqIHhtbWFwKGNoYXIgKiB2YWRkciwgdW5zaWduZWQgaW50IHZfc2l6ZSwgdW5zaWduZWQgaW50IHJfc2l6ZSwKCWludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgdW5zaWduZWQgaW50IGZpbGVfb2Zmc2V0KQp7CiAgY2hhciAqIHJlc3VsdDsKICAvKiAuYnNzIGhhcyBubyBhc3NvY2lhdGVkIHN0b3JhZ2UgaW4gdGhlIFBFIGZpbGUgKi8KICBpZihyX3NpemUpCiAgICB2X3NpemU9cl9zaXplOwogIGVsc2UKI2lmZGVmIF9fc3ZyNF9fCiAgICBmcHJpbnRmKHN0ZGVyciwieG1tYXA6ICVzIGxpbmUgJWQgZG9lc24ndCBzdXBwb3J0IE1BUF9BTk9OXG4iLF9fRklMRV9fLCBfX0xJTkVfXyk7CiNlbHNlCiAgICBmbGFncyB8PSBNQVBfQU5PTjsKI2VuZGlmCiAgcmVzdWx0ID0gbW1hcCh2YWRkciwgdl9zaXplLCBwcm90LCBmbGFncywgZmQsIGZpbGVfb2Zmc2V0KTsKICBpZigodW5zaWduZWQgaW50KSByZXN1bHQgIT0gMHhmZmZmZmZmZikgcmV0dXJuIHJlc3VsdDsKCiAgLyogU2lnaC4gIEFsaWdubWVudCBtdXN0IGJlIHdyb25nIGZvciBtbWFwLiAgRG8gdGhpcyB0aGUgaGFyZCB3YXkuICovCiAgaWYoIShmbGFncyAmIE1BUF9GSVhFRCkpIHsKICAgIHZhZGRyID0gKGNoYXIgKikweDQwMDAwMDAwOwogICAgZmxhZ3MgfD0gTUFQX0ZJWEVEOwogIH07CgogIG1tYXAodmFkZHIsIHZfc2l6ZSwgcHJvdCwgTUFQX0FOT05ZTU9VUyB8IGZsYWdzLCAwLCAwKTsKICBsc2VlayhmZCwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKTsKICByZWFkKGZkLCB2YWRkciwgdl9zaXplKTsKICByZXR1cm4gdmFkZHI7Cn07CiNlbmRpZgoKdm9pZCBkdW1wX2V4cG9ydHMoc3RydWN0IFBFX0V4cG9ydF9EaXJlY3RvcnkgKiBwZV9leHBvcnRzLCB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyKQp7IAogIGNoYXIgKiBNb2R1bGU7CiAgaW50IGk7CiAgdV9zaG9ydCAqIG9yZGluYWw7CiAgdV9sb25nICogZnVuY3Rpb247CiAgdV9jaGFyICoqIG5hbWUsICplbmFtZTsKCiAgTW9kdWxlID0gKChjaGFyICopIGxvYWRfYWRkcikgKyBwZV9leHBvcnRzLT5OYW1lOwogIGRwcmludGZfd2luMzIoc3RkZGViLCJcbioqKioqKipFWFBPUlQgREFUQSoqKioqKipcbk1vZHVsZSBuYW1lIGlzICVzLCAlbGQgZnVuY3Rpb25zLCAlbGQgbmFtZXNcbiIsIAoJIE1vZHVsZSwKCSBwZV9leHBvcnRzLT5OdW1iZXJfT2ZfRnVuY3Rpb25zLAoJIHBlX2V4cG9ydHMtPk51bWJlcl9PZl9OYW1lcyk7CgogIG9yZGluYWwgPSAodV9zaG9ydCAqKSAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSBwZV9leHBvcnRzLT5BZGRyZXNzX09mX05hbWVfT3JkaW5hbHMpOwogIGZ1bmN0aW9uID0gKHVfbG9uZyAqKSAgKCgoY2hhciAqKSBsb2FkX2FkZHIpICsgKGludCkgcGVfZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zKTsKICBuYW1lID0gKHVfY2hhciAqKikgICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpIHBlX2V4cG9ydHMtPkFkZHJlc3NPZk5hbWVzKTsKCiAgZHByaW50Zl93aW4zMihzdGRkZWIsIiUtMzJzIE9yZGluYWwgVmlydCBBZGRyXG4iLCAiRnVuY3Rpb24gTmFtZSIpOwogIGZvcihpPTA7IGk8IHBlX2V4cG9ydHMtPk51bWJlcl9PZl9GdW5jdGlvbnM7IGkrKykKICAgIHsKICAgICAgZW5hbWUgPSAgKGNoYXIgKikgKCgoY2hhciAqKSBsb2FkX2FkZHIpICsgKGludCkgKm5hbWUrKyk7CiAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCIlLTMycyAlNGQgICAgJTguOGx4XG4iLCBlbmFtZSwgKm9yZGluYWwrKywgKmZ1bmN0aW9uKyspOwogICAgfQp9CgpEV09SRCBQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbihzdHJ1Y3Qgd19maWxlcyogd3BudCwgY2hhciogZnVuY05hbWUpCnsKCXN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICogZXhwb3J0cyA9IHdwbnQtPnBlLT5wZV9leHBvcnQ7Cgl1bnNpZ25lZCBsb2FkX2FkZHIgPSB3cG50LT5wZS0+bG9hZF9hZGRyOwoJdV9zaG9ydCAqIG9yZGluYWw7Cgl1X2xvbmcgKiBmdW5jdGlvbjsKCXVfY2hhciAqKiBuYW1lLCAqZW5hbWU7CglpbnQgaTsKCWlmKCFleHBvcnRzKXJldHVybiAwOwoJb3JkaW5hbCA9ICh1X3Nob3J0ICopICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpIGV4cG9ydHMtPkFkZHJlc3NfT2ZfTmFtZV9PcmRpbmFscyk7CglmdW5jdGlvbiA9ICh1X2xvbmcgKikgICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpIGV4cG9ydHMtPkFkZHJlc3NPZkZ1bmN0aW9ucyk7CgluYW1lID0gKHVfY2hhciAqKikgICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpIGV4cG9ydHMtPkFkZHJlc3NPZk5hbWVzKTsKCWZvcihpPTA7IGk8ZXhwb3J0cy0+TnVtYmVyX09mX0Z1bmN0aW9uczsgaSsrKQoJewoJCWlmKEhJV09SRChmdW5jTmFtZSkpCgkJewoJCQllbmFtZSA9ICAoY2hhciAqKSAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSAqbmFtZSk7CgkJCWlmKHN0cmNtcChlbmFtZSxmdW5jTmFtZSk9PTApCgkJCQlyZXR1cm4gbG9hZF9hZGRyKypmdW5jdGlvbjsKCQl9ZWxzZXsKCQkJaWYoZnVuY05hbWUgPT0gKGludCkqb3JkaW5hbCArIGV4cG9ydHMtPkJhc2UpCgkJCQlyZXR1cm4gbG9hZF9hZGRyKypmdW5jdGlvbjsKCQl9CgkJZnVuY3Rpb24rKzsKCQlvcmRpbmFsKys7CgkJbmFtZSsrOwoJfQoJcmV0dXJuIDA7Cn0KCkRXT1JEIFBFX0dldFByb2NBZGRyZXNzKEhNT0RVTEUgaE1vZHVsZSwgY2hhciogZnVuY3Rpb24pCnsKCXN0cnVjdCB3X2ZpbGVzICp3cG50OwoJZm9yKHdwbnQ9d2luZV9maWxlczt3cG50O3dwbnQ9d3BudC0+bmV4dCkKCQlpZih3cG50LT5oTW9kdWxlPT1oTW9kdWxlKSBicmVhazsKCWlmKCF3cG50KXJldHVybiAwOwoJaWYod3BudC0+YnVpbHRpbikKCXsKCQlpZihISVdPUkQoZnVuY3Rpb24pKQoJCQlyZXR1cm4gUkVMQVkzMl9HZXRFbnRyeVBvaW50KHdwbnQtPmJ1aWx0aW4sZnVuY3Rpb24sMCk7CgkJZWxzZQoJCQlyZXR1cm4gUkVMQVkzMl9HZXRFbnRyeVBvaW50KHdwbnQtPmJ1aWx0aW4sMCwoaW50KWZ1bmN0aW9uKTsKCX0KCXJldHVybiBQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbih3cG50LGZ1bmN0aW9uKTsKfQoKdm9pZCBmaXh1cF9pbXBvcnRzKHN0cnVjdCB3X2ZpbGVzKiB3cG50KQp7IAogIHN0cnVjdCBQRV9JbXBvcnRfRGlyZWN0b3J5ICogcGVfaW1wOwogIGludCBmaXh1cF9mYWlsZWQ9MDsKICB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyID0gd3BudC0+cGUtPmxvYWRfYWRkcjsKICBpbnQgaTsKICBORV9NT0RVTEUgKm5lX21vZDsKICBITU9EVUxFICptb2RfcHRyOwoKIC8qIE9LLCBub3cgZHVtcCB0aGUgaW1wb3J0IGxpc3QgKi8KICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIlxuRHVtcGluZyBpbXBvcnRzIGxpc3RcbiIpOwoKICAvKiBmaXJzdCwgY291bnQgdGhlIG51bWJlciBvZiBpbXBvcnRlZCBub24taW50ZXJuYWwgbW9kdWxlcyAqLwogIHBlX2ltcCA9IHdwbnQtPnBlLT5wZV9pbXBvcnQ7CiAgZm9yKGk9MDtwZV9pbXAtPk1vZHVsZU5hbWU7cGVfaW1wKyspCiAgCWkrKzsKCiAgLyogTm93LCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRsbHNfdG9faW5pdCAqLwogIG5lX21vZCA9IEdsb2JhbExvY2sod3BudC0+aE1vZHVsZSk7CiAgbmVfbW9kLT5kbGxzX3RvX2luaXQgPSBHTE9CQUxfQWxsb2MoR01FTV9aRVJPSU5JVCwoaSsxKSAqIHNpemVvZihITU9EVUxFKSwKICAJCQkJCXdwbnQtPmhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKICBtb2RfcHRyID0gR2xvYmFsTG9jayhuZV9tb2QtPmRsbHNfdG9faW5pdCk7CiAgLyogbG9hZCB0aGUgbW9kdWxlcyBhbmQgcHV0IHRoZWlyIGhhbmRsZXMgaW50byB0aGUgbGlzdCAqLwogIGZvcihpPTAscGVfaW1wID0gd3BudC0+cGUtPnBlX2ltcG9ydDtwZV9pbXAtPk1vZHVsZU5hbWU7cGVfaW1wKyspCiAgewogIAljaGFyICpuYW1lID0gKGNoYXIqKWxvYWRfYWRkcitwZV9pbXAtPk1vZHVsZU5hbWU7CiAgCWlmKFJFTEFZMzJfR2V0QnVpbHRpbkRMTChuYW1lKSkKCQljb250aW51ZTsKCW1vZF9wdHJbaV0gPSBMb2FkTW9kdWxlKG5hbWUsKExQVk9JRCktMSk7CglpZihtb2RfcHRyW2ldPD0oSE1PRFVMRSkzMikKCXsKCQlmcHJpbnRmKHN0ZGVyciwiTW9kdWxlICVzIG5vdCBmb3VuZFxuIixuYW1lKTsKCQlleGl0KDApOwoJfQoJaSsrOwogIH0KICBwZV9pbXAgPSB3cG50LT5wZS0+cGVfaW1wb3J0OwogIHdoaWxlIChwZV9pbXAtPk1vZHVsZU5hbWUpCiAgICB7CiAgICAgIGNoYXIgKiBNb2R1bGU7CiAgICAgIHN0cnVjdCBwZV9pbXBvcnRfbmFtZSAqIHBlX25hbWU7CiAgICAgIHVuc2lnbmVkIGludCAqIGltcG9ydF9saXN0LCAqdGh1bmtfbGlzdDsKCiAgICAgIE1vZHVsZSA9ICgoY2hhciAqKSBsb2FkX2FkZHIpICsgcGVfaW1wLT5Nb2R1bGVOYW1lOwogICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIiVzXG4iLCBNb2R1bGUpOwoKICAgaWYocGVfaW1wLT5JbXBvcnRfTGlzdCAhPSAwKSB7IC8qIG9yaWdpbmFsIG1pY3Jvc29mdCBzdHlsZSAqLwogICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIk1pY3Jvc29mdCBzdHlsZSBpbXBvcnRzIHVzZWRcbiIpOwogICAgICBpbXBvcnRfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKikgCgkoKCh1bnNpZ25lZCBpbnQpIGxvYWRfYWRkcikgKyBwZV9pbXAtPkltcG9ydF9MaXN0KTsKCSAgdGh1bmtfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKikKCSAgKCgodW5zaWduZWQgaW50KSBsb2FkX2FkZHIpICsgcGVfaW1wLT5UaHVua19MaXN0KTsKCgogICAgd2hpbGUoKmltcG9ydF9saXN0KQoJewoJICBwZV9uYW1lID0gKHN0cnVjdCBwZV9pbXBvcnRfbmFtZSAqKSAoKGludCkgbG9hZF9hZGRyICsgKmltcG9ydF9saXN0KTsKCSAgaWYoKHVuc2lnbmVkKSppbXBvcnRfbGlzdCAmIDB4ODAwMDAwMDApCgkgIHsKCQlpbnQgb3JkaW5hbD0qaW1wb3J0X2xpc3QgJiAoMHg4MDAwMDAwMC0xKTsKCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiLS0tIE9yZGluYWwgJXMsJWRcbiIsIE1vZHVsZSwgb3JkaW5hbCk7CgkJKnRodW5rX2xpc3QgPSBXSU4zMl9HZXRQcm9jQWRkcmVzcyhNT0RVTEVfRmluZE1vZHVsZShNb2R1bGUpLAoJCQlvcmRpbmFsKTsKCSAgfWVsc2V7IC8qIGltcG9ydCBieSBuYW1lICovCgkgIGRwcmludGZfd2luMzIoc3RkZGViLCAiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwojaWZuZGVmIFdJTkVMSUIgLyogRklYTUU6IEpCUDogU2hvdWxkIHRoaXMgaGFwcGVuIGluIGxpYndpbmUuYT8gKi8KCSAgCSp0aHVua19saXN0ID0gV0lOMzJfR2V0UHJvY0FkZHJlc3MoTU9EVUxFX0ZpbmRNb2R1bGUoTW9kdWxlKSwKCQkJCXBlX25hbWUtPk5hbWUpOwoKI2Vsc2UKCSAgZnByaW50ZihzdGRlcnIsIkpCUDogQ2FsbCB0byBSRUxBWTMyX0dldEVudHJ5UG9pbnQgYmVpbmcgaWdub3JlZC5cbiIpOwojZW5kaWYKCQl9CgkgIGlmKCEqdGh1bmtfbGlzdCkKCSAgewoJICAJZnByaW50ZihzdGRlcnIsIk5vIGltcGxlbWVudGF0aW9uIGZvciAlcy4lZCglcylcbiIsTW9kdWxlLCAKCQkJcGVfbmFtZS0+SGludCwgcGVfbmFtZS0+TmFtZSk7CgkJZml4dXBfZmFpbGVkPTE7CgkgIH0KCgkgIGltcG9ydF9saXN0Kys7CgkgIHRodW5rX2xpc3QrKzsKCX0KICAgIH0gZWxzZSB7IC8qIEJvcmxhbmQgc3R5bGUgKi8KICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJCb3JsYW5kIHN0eWxlIGltcG9ydHMgdXNlZFxuIik7CiAgICAgIHRodW5rX2xpc3QgPSAodW5zaWduZWQgaW50ICopCiAgICAgICAgKCgodW5zaWduZWQgaW50KSBsb2FkX2FkZHIpICsgcGVfaW1wLT5UaHVua19MaXN0KTsKICAgICAgd2hpbGUoKnRodW5rX2xpc3QpIHsKICAgICAgICBwZV9uYW1lID0gKHN0cnVjdCBwZV9pbXBvcnRfbmFtZSAqKSAoKGludCkgbG9hZF9hZGRyICsgKnRodW5rX2xpc3QpOwogICAgICAgIGlmKCh1bnNpZ25lZClwZV9uYW1lICYgMHg4MDAwMDAwMCkgewogICAgICAgICAgZnByaW50ZihzdGRlcnIsIkltcG9ydCBieSBvcmRpbmFsIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICItLS0gJXMgJXMuJWRcbiIsIHBlX25hbWUtPk5hbWUsIE1vZHVsZSwgcGVfbmFtZS0+SGludCk7CiNpZm5kZWYgV0lORUxJQiAvKiBGSVhNRTogSkJQOiBTaG91bGQgdGhpcyBoYXBwZW4gaW4gbGlid2luZS5hPyAqLwoJLyogRklYTUU6IEJvdGggY2FsbHMgc2hvdWxkIGJlIHVuaWZpZWQgaW50byBHZXRQcm9jQWRkcmVzcyAqLwojaWYgMAogICAgICAgICp0aHVua19saXN0PSh1bnNpZ25lZCBpbnQpUkVMQVkzMl9HZXRFbnRyeVBvaW50KE1vZHVsZSxwZV9uYW1lLT5OYW1lLHBlX25hbWUtPkhpbnQpOwoJaWYoKnRodW5rX2xpc3QgPT0gMCkKI2VuZGlmCgkgIAkqdGh1bmtfbGlzdCA9IFdJTjMyX0dldFByb2NBZGRyZXNzKE1PRFVMRV9GaW5kTW9kdWxlKE1vZHVsZSksCgkJCQlwZV9uYW1lLT5OYW1lKTsKI2Vsc2UKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBDYWxsIHRvIFJFTEFZMzJfR2V0RW50cnlQb2ludCBiZWluZyBpZ25vcmVkLlxuIik7CiNlbmRpZgogICAgICAgIGlmKCEqdGh1bmtfbGlzdCkgewogICAgICAgICAgZnByaW50ZihzdGRlcnIsIk5vIGltcGxlbWVudGF0aW9uIGZvciAlcy4lZFxuIixNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwogICAgICAgICAgZml4dXBfZmFpbGVkPTE7CiAgICAgICAgfQogICAgICAgIHRodW5rX2xpc3QrKzsKICAgICAgfQogICAgfQogICAgcGVfaW1wKys7CiAgfQogIGlmKGZpeHVwX2ZhaWxlZClleGl0KDEpOwp9CgpzdGF0aWMgdm9pZCBjYWxjX3ZtYV9zaXplKHN0cnVjdCB3X2ZpbGVzICp3cG50KQp7CiAgaW50IGk7CgogIGRwcmludGZfd2luMzIoc3RkZGViLCAiRHVtcCBvZiBzZWdtZW50IHRhYmxlXG4iKTsKICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIiAgIE5hbWUgICAgVlN6ICBWYWRkciAgICAgU3pSYXcgICBGaWxlYWRyICAqUmVsb2MgKkxpbmV1bSAjUmVsb2MgI0xpbnVtIENoYXJcbiIpOwogIGZvcihpPTA7IGk8IHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQogICAgewogICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIiU4czogJTQuNGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU4LjhseCAlOC44bHggJTQuNHggJTQuNHggJTguOGx4XG4iLCAKCSAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5OYW1lLCAKCSAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX1NpemUsCgkgICAgIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzLAoJICAgICB3cG50LT5wZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEsCgkgICAgIHdwbnQtPnBlLT5wZV9zZWdbaV0uUG9pbnRlclRvUmF3RGF0YSwKCSAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SZWxvY2F0aW9ucywKCSAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9MaW5lbnVtYmVycywKCSAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5OdW1iZXJPZlJlbG9jYXRpb25zLAoJICAgICB3cG50LT5wZS0+cGVfc2VnW2ldLk51bWJlck9mTGluZW51bWJlcnMsCgkgICAgIHdwbnQtPnBlLT5wZV9zZWdbaV0uQ2hhcmFjdGVyaXN0aWNzKTsKCSAgd3BudC0+cGUtPnZtYV9zaXplID0gbWF4KHdwbnQtPnBlLT52bWFfc2l6ZSwKCSAgCQl3cG50LT5wZS0+cGVfc2VnW2ldLlZpcnR1YWxfQWRkcmVzcyArIAoJCQl3cG50LT5wZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBkb19yZWxvY2F0aW9ucyhzdHJ1Y3Qgd19maWxlcyAqd3BudCkKewoJaW50IGRlbHRhID0gd3BudC0+cGUtPmxvYWRfYWRkciAtIHdwbnQtPnBlLT5iYXNlX2FkZHI7CglzdHJ1Y3QgUEVfUmVsb2NfQmxvY2sgKnIgPSB3cG50LT5wZS0+cGVfcmVsb2M7CglpbnQgaGRlbHRhID0gKGRlbHRhID4+IDE2KSAmIDB4RkZGRjsKCWludCBsZGVsdGEgPSBkZWx0YSAmIDB4RkZGRjsKCS8qIGludCByZWxvY19zaXplID0gKi8KCWlmKGRlbHRhID09IDApCgkJLyogTm90aGluZyB0byBkbyAqLwoJCXJldHVybjsKCXdoaWxlKHItPlBhZ2VSVkEpCgl7CgkJY2hhciAqcGFnZSA9IChjaGFyKil3cG50LT5wZS0+bG9hZF9hZGRyICsgci0+UGFnZVJWQTsKCQlpbnQgY291bnQgPSAoci0+QmxvY2tTaXplIC0gOCkvMjsKCQlpbnQgaTsKCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwgIiV4IHJlbG9jYXRpb25zIGZvciBwYWdlICVseFxuIiwKCQkJY291bnQsIHItPlBhZ2VSVkEpOwoJCS8qIHBhdGNoaW5nIGluIHJldmVyc2Ugb3JkZXIgKi8KCQlmb3IoaT0wO2k8Y291bnQ7aSsrKQoJCXsKCQkJaW50IG9mZnNldCA9IHItPlJlbG9jYXRpb25zW2ldICYgMHhGRkY7CgkJCWludCB0eXBlID0gci0+UmVsb2NhdGlvbnNbaV0gPj4gMTI7CgkJCWRwcmludGZfZml4dXAoc3RkZGViLCJwYXRjaGluZyAleCB0eXBlICV4XG4iLCBvZmZzZXQsIHR5cGUpOwoJCQlzd2l0Y2godHlwZSkKCQkJewoJCQljYXNlIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURTogYnJlYWs7CgkJCWNhc2UgSU1BR0VfUkVMX0JBU0VEX0hJR0g6CgkJCQkqKHNob3J0KikocGFnZStvZmZzZXQpICs9IGhkZWx0YTsKCQkJCWJyZWFrOwoJCQljYXNlIElNQUdFX1JFTF9CQVNFRF9MT1c6CgkJCQkqKHNob3J0KikocGFnZStvZmZzZXQpICs9IGxkZWx0YTsKCQkJCWJyZWFrOwoJCQljYXNlIElNQUdFX1JFTF9CQVNFRF9ISUdITE9XOgojaWYgMQoJCQkJKihpbnQqKShwYWdlK29mZnNldCkgKz0gZGVsdGE7CiNlbHNlCgkJCQl7IGludCBoPSoodW5zaWduZWQgc2hvcnQqKShwYWdlK29mZnNldCk7CgkJCQkgIGludCBsPXItPlJlbG9jYXRpb25zWysraV07CgkJCQkgICoodW5zaWduZWQgaW50KikocGFnZSArIG9mZnNldCkgPSAoaDw8MTYpICsgbCArIGRlbHRhOwoJCQkJfQojZW5kaWYKCQkJCWJyZWFrOwoJCQljYXNlIElNQUdFX1JFTF9CQVNFRF9ISUdIQURKOgoJCQkJZnByaW50ZihzdGRlcnIsICJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBJTUFHRV9SRUxfQkFTRURfSElHSEFESlxuIik7CgkJCQlicmVhazsKCQkJY2FzZSBJTUFHRV9SRUxfQkFTRURfTUlQU19KTVBBRERSOgoJCQkJZnByaW50ZihzdGRlcnIsICJJcyB0aGlzIGEgTUlQUyBtYWNoaW5lID8/P1xuIik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBmaXh1cCB0eXBlXG4iKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXIgPSAoc3RydWN0IFBFX1JlbG9jX0Jsb2NrKikoKGNoYXIqKXIgKyByLT5CbG9ja1NpemUpOwoJfQp9CgkJCgoJCgkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJUEVfTG9hZEltYWdlCiAqIExvYWQgb25lIFBFIGZvcm1hdCBleGVjdXRhYmxlIGludG8gbWVtb3J5CiAqLwpzdGF0aWMgSElOU1RBTkNFIFBFX0xvYWRJbWFnZSggaW50IGZkLCBzdHJ1Y3Qgd19maWxlcyAqd3BudCApCnsKCWludCBpLCByZXN1bHQ7CiAgICB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyOwoJc3RydWN0IERpcmVjdG9yeSBkaXI7CgoJd3BudC0+cGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVfZGF0YSkpOwoJbWVtc2V0KHdwbnQtPnBlLDAsc2l6ZW9mKHN0cnVjdCBwZV9kYXRhKSk7Cgl3cG50LT5wZS0+cGVfaGVhZGVyID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBlX2hlYWRlcl9zKSk7CgoJLyogcmVhZCBQRSBoZWFkZXIgKi8KCWxzZWVrKCBmZCwgd3BudC0+bXpfaGVhZGVyLT5uZV9vZmZzZXQsIFNFRUtfU0VUKTsKCXJlYWQoIGZkLCB3cG50LT5wZS0+cGVfaGVhZGVyLCBzaXplb2Yoc3RydWN0IHBlX2hlYWRlcl9zKSk7CgoJLyogcmVhZCBzZWN0aW9ucyAqLwoJd3BudC0+cGUtPnBlX3NlZyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlKSAqIAoJCQkJICAgd3BudC0+cGUtPnBlX2hlYWRlci0+Y29mZi5OdW1iZXJPZlNlY3Rpb25zKTsKCXJlYWQoIGZkLCB3cG50LT5wZS0+cGVfc2VnLCBzaXplb2Yoc3RydWN0IHBlX3NlZ21lbnRfdGFibGUpICogCgkJCXdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9ucyk7CgoJbG9hZF9hZGRyID0gd3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuQmFzZU9mSW1hZ2U7Cgl3cG50LT5wZS0+YmFzZV9hZGRyPWxvYWRfYWRkcjsKCXdwbnQtPnBlLT52bWFfc2l6ZT0wOwoJZHByaW50Zl93aW4zMihzdGRkZWIsICJMb2FkIGFkZHIgaXMgJXhcbiIsbG9hZF9hZGRyKTsKCWNhbGNfdm1hX3NpemUod3BudCk7CgoJLyogV2UgdXNlIG1hbGxvYyBoZXJlLCB3aGlsZSBhIGh1Z2UgcGFydCBvZiB0aGF0IGFkZHJlc3Mgc3BhY2UgZG9lcwoJICAgbm90IGJlIHN1cHBvcnRlZCBieSBhY3R1YWwgbWVtb3J5LiBJdCBoYXMgdG8gYmUgY29udGlndW91cywgdGhvdWdoLgoJICAgSSBkb24ndCBrbm93IGlmIG1tYXAoIi9kZXYvbnVsbCIpOyB3b3VsZCBkbyBhbnkgYmV0dGVyLgoJICAgV2hhdCBJJ2QgcmVhbGx5IGxpa2UgdG8gZG8gaXMgYSBXaW4zMiBzdHlsZSBWaXJ0dWFsQWxsb2MvTWFwVmlld09mRmlsZQoJICAgc2VxdWVuY2UgKi8KCWxvYWRfYWRkciA9IHdwbnQtPnBlLT5sb2FkX2FkZHIgPSBtYWxsb2Mod3BudC0+cGUtPnZtYV9zaXplKTsKCWRwcmludGZfd2luMzIoc3RkZGViLCAiTG9hZCBhZGRyIGlzIHJlYWxseSAleCwgcmFuZ2UgJXhcbiIsCgkJd3BudC0+cGUtPmxvYWRfYWRkciwgd3BudC0+cGUtPnZtYV9zaXplKTsKCgoJZm9yKGk9MDsgaSA8IHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQoJewoJCS8qIGxvYWQgb25seSBub24tQlNTIHNlZ21lbnRzICovCgkJaWYod3BudC0+cGUtPnBlX3NlZ1tpXS5DaGFyYWN0ZXJpc3RpY3MgJiAKCQkJfiBJTUFHRV9TQ05fVFlQRV9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKQoJCWlmKGxzZWVrKGZkLHdwbnQtPnBlLT5wZV9zZWdbaV0uUG9pbnRlclRvUmF3RGF0YSxTRUVLX1NFVCkgPT0gLTEKCQl8fCByZWFkKGZkLGxvYWRfYWRkciArIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzLAoJCQkJd3BudC0+cGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhKSAKCQkJCSE9IHdwbnQtPnBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSkKCQl7CgkJCWZwcmludGYoc3RkZXJyLCJGYWlsZWQgdG8gbG9hZCBzZWN0aW9uICV4XG4iLCBpKTsKCQkJZXhpdCgwKTsKCQl9CgkJcmVzdWx0ID0gbG9hZF9hZGRyICsgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3M7CiNpZiAwCglpZighbG9hZF9hZGRyKSB7CgkJCgkJcmVzdWx0ID0gKGludCl4bW1hcCgoY2hhciAqKTAsIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplLAoJCQl3cG50LT5wZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEsIDcsCgkJCU1BUF9QUklWQVRFLCBmZCwgd3BudC0+cGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SYXdEYXRhKTsKCQlsb2FkX2FkZHIgPSAodW5zaWduZWQgaW50KSByZXN1bHQgLSAgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3M7Cgl9IGVsc2UgewoJCXJlc3VsdCA9IChpbnQpeG1tYXAoKGNoYXIgKikgbG9hZF9hZGRyICsgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3MsIAoJCQkgIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplLAoJCSAgICAgIHdwbnQtPnBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSwgNywgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIAoJCSAgICAgIGZkLCB3cG50LT5wZS0+cGVfc2VnW2ldLlBvaW50ZXJUb1Jhd0RhdGEpOwoJfQoJaWYocmVzdWx0PT0tMSl7CgkJZnByaW50ZihzdGRlcnIsIkNvdWxkIG5vdCBsb2FkIHNlY3Rpb24gJXggdG8gZGVzaXJlZCBhZGRyZXNzICVseFxuIiwKCQkJaSwgbG9hZF9hZGRyK3dwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzKTsKCQlmcHJpbnRmKHN0ZGVyciwiTmVlZCB0byBpbXBsZW1lbnQgcmVsb2NhdGlvbnMgbm93XG4iKTsKCQlleGl0KDApOwoJfQojZW5kaWYKCiAgICAgICAgaWYoc3RyY21wKHdwbnQtPnBlLT5wZV9zZWdbaV0uTmFtZSwgIi5ic3MiKSA9PSAwKQogICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilyZXN1bHQsIDAsIAogICAgICAgICAgICAgICAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX1NpemUgPwogICAgICAgICAgICAgICAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX1NpemUgOgogICAgICAgICAgICAgICAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhKTsKCglpZihzdHJjbXAod3BudC0+cGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmlkYXRhIikgPT0gMCkKCQl3cG50LT5wZS0+cGVfaW1wb3J0ID0gKHN0cnVjdCBQRV9JbXBvcnRfRGlyZWN0b3J5ICopIHJlc3VsdDsKCglpZihzdHJjbXAod3BudC0+cGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmVkYXRhIikgPT0gMCkKCQl3cG50LT5wZS0+cGVfZXhwb3J0ID0gKHN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICopIHJlc3VsdDsKCglpZihzdHJjbXAod3BudC0+cGUtPnBlX3NlZ1tpXS5OYW1lLCAiLnJzcmMiKSA9PSAwKSB7CgkgICAgd3BudC0+cGUtPnBlX3Jlc291cmNlID0gKHN0cnVjdCBQRV9SZXNvdXJjZV9EaXJlY3RvcnkgKikgcmVzdWx0OwojaWYgMAovKiBGSVhNRSBwZS0+cmVzb3VyY2Vfb2Zmc2V0IHNob3VsZCBiZSBkZWxldGVkIGZyb20gc3RydWN0dXJlIGlmIHRoaXMKIGlmZGVmIGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcgKi8KCSAgICAvKiBzYXZlIG9mZnNldCBmb3IgUEVfRmluZFJlc291cmNlICovCgkgICAgd3BudC0+cGUtPnJlc291cmNlX29mZnNldCA9IHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzIC0gCgkJCQkJd3BudC0+cGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SYXdEYXRhOwojZW5kaWYJCgkgICAgfQoJaWYoc3RyY21wKHdwbnQtPnBlLT5wZV9zZWdbaV0uTmFtZSwgIi5yZWxvYyIpID09IDApCgkJd3BudC0+cGUtPnBlX3JlbG9jID0gKHN0cnVjdCBQRV9SZWxvY19CbG9jayAqKSByZXN1bHQ7CgoJfQoKCS8qIFRoZXJlIGlzIHdvcmQgdGhhdCB0aGUgYWN0dWFsIGxvYWRlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQoJICAgc2VjdGlvbiBuYW1lcywgYW5kIG9ubHkgZ29lcyBmb3IgdGhlIERhdGFEaXJlY3RvcnkgKi8KCWRpcj13cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfRVhQT1JUX0RJUkVDVE9SWV07CglpZihkaXIuU2l6ZSkKCXsKCQlpZih3cG50LT5wZS0+cGVfZXhwb3J0ICYmIAoJCQl3cG50LT5wZS0+cGVfZXhwb3J0IT1sb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzcykKCQkJZnByaW50ZihzdGRlcnIsIndyb25nIGV4cG9ydCBkaXJlY3Rvcnk/P1xuIik7CgkJLyogYWx3YXlzIHRydXN0IHRoZSBkaXJlY3RvcnkgKi8KCQl3cG50LT5wZS0+cGVfZXhwb3J0ID0gbG9hZF9hZGRyK2Rpci5WaXJ0dWFsX2FkZHJlc3M7Cgl9CgoJZGlyPXdwbnQtPnBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9JTVBPUlRfRElSRUNUT1JZXTsKCWlmKGRpci5TaXplKQoJewoJCWlmKHdwbnQtPnBlLT5wZV9pbXBvcnQgJiYgCgkJCXdwbnQtPnBlLT5wZV9pbXBvcnQhPWxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzKQoJCQlmcHJpbnRmKHN0ZGVyciwid3JvbmcgaW1wb3J0IGRpcmVjdG9yeT8/XG4iKTsKCQl3cG50LT5wZS0+cGVfaW1wb3J0ID0gbG9hZF9hZGRyK2Rpci5WaXJ0dWFsX2FkZHJlc3M7Cgl9CgoJZGlyPXdwbnQtPnBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9SRVNPVVJDRV9ESVJFQ1RPUlldOwoJaWYoZGlyLlNpemUpCgl7CgkJaWYod3BudC0+cGUtPnBlX3Jlc291cmNlICYmIAoJCQl3cG50LT5wZS0+cGVfcmVzb3VyY2UhPWxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzKQoJCQlmcHJpbnRmKHN0ZGVyciwid3JvbmcgcmVzb3VyY2UgZGlyZWN0b3J5Pz9cbiIpOwoJCXdwbnQtPnBlLT5wZV9yZXNvdXJjZSA9IGxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzOwoJfQoKCWRpcj13cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfQkFTRV9SRUxPQ0FUSU9OX1RBQkxFXTsKCWlmKGRpci5TaXplKQoJewoJCWlmKHdwbnQtPnBlLT5wZV9yZWxvYyAmJiAKCQkJd3BudC0+cGUtPnBlX3JlbG9jIT1sb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzcykKCQkJZnByaW50ZihzdGRlcnIsIndyb25nIHJlbG9jYXRpb24gbGlzdD8/XG4iKTsKCQl3cG50LT5wZS0+cGVfcmVsb2MgPSBsb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzczsKCX0KCglpZih3cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5CgkJW0lNQUdFX0ZJTEVfRVhDRVBUSU9OX0RJUkVDVE9SWV0uU2l6ZSkKCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkV4Y2VwdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CgoJaWYod3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuRGF0YURpcmVjdG9yeQoJCVtJTUFHRV9GSUxFX1NFQ1VSSVRZX0RJUkVDVE9SWV0uU2l6ZSkKCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIlNlY3VyaXR5IGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKCglpZih3cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5CgkJW0lNQUdFX0ZJTEVfREVCVUdfRElSRUNUT1JZXS5TaXplKQoJCWRwcmludGZfd2luMzIoc3RkbmltcCwiRGVidWcgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwoKCWlmKHdwbnQtPnBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKCQlbSU1BR0VfRklMRV9ERVNDUklQVElPTl9TVFJJTkddLlNpemUpCgkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJEZXNjcmlwdGlvbiBzdHJpbmcgaWdub3JlZFxuIik7CgoJaWYod3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuRGF0YURpcmVjdG9yeQoJCVtJTUFHRV9GSUxFX01BQ0hJTkVfVkFMVUVdLlNpemUpCgkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJNYWNoaW5lIFZhbHVlIGlnbm9yZWRcbiIpOwoKCWlmKHdwbnQtPnBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKCQlbSU1BR0VfRklMRV9USFJFQURfTE9DQUxfU1RPUkFHRV0uU2l6ZSkKCQkgZHByaW50Zl93aW4zMihzdGRuaW1wLCJUaHJlYWQgbG9jYWwgc3RvcmFnZSBpZ25vcmVkXG4iKTsKCglpZih3cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5CgkJW0lNQUdFX0ZJTEVfQ0FMTEJBQ0tfRElSRUNUT1JZXS5TaXplKQoJCWRwcmludGZfd2luMzIoc3RkbmltcCwiQ2FsbGJhY2sgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwoKCglpZih3cG50LT5wZS0+cGVfaW1wb3J0KSBmaXh1cF9pbXBvcnRzKHdwbnQpOwoJaWYod3BudC0+cGUtPnBlX2V4cG9ydCkgZHVtcF9leHBvcnRzKHdwbnQtPnBlLT5wZV9leHBvcnQsbG9hZF9hZGRyKTsKCWlmKHdwbnQtPnBlLT5wZV9yZWxvYykgZG9fcmVsb2NhdGlvbnMod3BudCk7CiAgCgl3cG50LT5oaW5zdGFuY2UgPSAoSElOU1RBTkNFKTB4ODAwMDsKCXdwbnQtPmxvYWRfYWRkciA9IGxvYWRfYWRkcjsKCXJldHVybiAod3BudC0+aGluc3RhbmNlKTsKfQoKSElOU1RBTkNFIE1PRFVMRV9DcmVhdGVJbnN0YW5jZShITU9EVUxFIGhNb2R1bGUsTE9BRFBBUkFNUyAqcGFyYW1zKTsKdm9pZCBJbml0VGFzayhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCk7CgpISU5TVEFOQ0UgUEVfTG9hZE1vZHVsZShpbnQgZmQsIE9GU1RSVUNUICpvZnMsIExPQURQQVJBTVMqIHBhcmFtcykKewoJc3RydWN0IHdfZmlsZXMgKndwbnQ7CglpbnQgc2l6ZTsKCU5FX01PRFVMRSAqcE1vZHVsZTsKCUxPQURFREZJTEVJTkZPICpwRmlsZUluZm87CglTRUdUQUJMRUVOVFJZICpwU2VnbWVudDsKCWNoYXIgKnBTdHI7CglEV09SRCBjdHM7CglITU9EVUxFIGhNb2R1bGU7CglISU5TVEFOQ0UgaEluc3RhbmNlOwoKCUFMSUFTX1VzZUFsaWFzZXM9MTsKCgl3cG50PXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3X2ZpbGVzKSk7Cgl3cG50LT5vZnM9Km9mczsKCXdwbnQtPnR5cGU9MDsKCXdwbnQtPmhpbnN0YW5jZT0wOwoJd3BudC0+aE1vZHVsZT0wOwoJd3BudC0+aW5pdGlhbGlzZWQ9MDsKCXdwbnQtPmJ1aWx0aW49MDsKCWxzZWVrKGZkLDAsU0VFS19TRVQpOwoJd3BudC0+bXpfaGVhZGVyPXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtel9oZWFkZXJfcykpOwoJcmVhZChmZCx3cG50LT5tel9oZWFkZXIsc2l6ZW9mKHN0cnVjdCBtel9oZWFkZXJfcykpOwoKCXNpemU9c2l6ZW9mKE5FX01PRFVMRSkgKwoJCS8qIGxvYWRlZCBmaWxlIGluZm8gKi8KCQlzaXplb2YoTE9BREVERklMRUlORk8pICsgc3RybGVuKG9mcy0+c3pQYXRoTmFtZSkgKwoJCS8qIHNlZ21lbnQgdGFibGU6IERTLENTICovCgkJMiAqIHNpemVvZihTRUdUQUJMRUVOVFJZKSArCgkJLyogbmFtZSB0YWJsZSAqLwoJCTkgKwoJCS8qIHNldmVyYWwgZW1wdHkgdGFibGVzICovCgkJODsKCgloTW9kdWxlID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklULCBzaXplICk7Cgl3cG50LT5oTW9kdWxlPWhNb2R1bGU7CglpZiAoIWhNb2R1bGUpIHJldHVybiAoSElOU1RBTkNFKTExOyAgLyogaW52YWxpZCBleGUgKi8KCglGYXJTZXRPd25lciggaE1vZHVsZSwgaE1vZHVsZSApOwoJCglwTW9kdWxlID0gKE5FX01PRFVMRSopR2xvYmFsTG9jayhoTW9kdWxlKTsKCgkvKiBTZXQgYWxsIHVzZWQgZW50cmllcyAqLwoJcE1vZHVsZS0+bWFnaWM9UEVfU0lHTkFUVVJFOwoJcE1vZHVsZS0+Y291bnQ9MTsKCXBNb2R1bGUtPm5leHQ9MDsKCXBNb2R1bGUtPmZsYWdzPTA7CglwTW9kdWxlLT5kZ3JvdXA9MTsKCXBNb2R1bGUtPnNzPTE7CglwTW9kdWxlLT5jcz0yOwoJLyogV2hvIHdhbnRzIHRvIExvY2FsQWxsb2MgZm9yIGEgUEUgTW9kdWxlPyAqLwoJcE1vZHVsZS0+aGVhcF9zaXplPTB4MTAwMDsKCXBNb2R1bGUtPnN0YWNrX3NpemU9MHhGMDAwOwoJcE1vZHVsZS0+c2VnX2NvdW50PTE7CglwTW9kdWxlLT5tb2RyZWZfY291bnQ9MDsKCXBNb2R1bGUtPm5ybmFtZV9zaXplPTA7CglwTW9kdWxlLT5zZWdfdGFibGU9c2l6ZW9mKE5FX01PRFVMRSkrCgkJCXNpemVvZihMT0FERURGSUxFSU5GTykrc3RybGVuKG9mcy0+c3pQYXRoTmFtZSk7CglwTW9kdWxlLT5maWxlaW5mbz1zaXplb2YoTkVfTU9EVUxFKTsKCXBNb2R1bGUtPm9zX2ZsYWdzPU5FX09TRkxBR1NfV0lORE9XUzsKCXBNb2R1bGUtPmV4cGVjdGVkX3ZlcnNpb249MHgzMEE7CgoJcEZpbGVJbmZvPShMT0FERURGSUxFSU5GTyAqKShwTW9kdWxlICsgMSk7CglwRmlsZUluZm8tPmxlbmd0aCA9IHNpemVvZihMT0FERURGSUxFSU5GTykrc3RybGVuKG9mcy0+c3pQYXRoTmFtZSktMTsKCXN0cmNweShwRmlsZUluZm8tPmZpbGVuYW1lLG9mcy0+c3pQYXRoTmFtZSk7CgoJcFNlZ21lbnQ9KFNFR1RBQkxFRU5UUlkqKSgoY2hhciopcEZpbGVJbmZvK3BGaWxlSW5mby0+bGVuZ3RoKzEpOwoJcE1vZHVsZS0+ZGdyb3VwX2VudHJ5PShpbnQpcFNlZ21lbnQtKGludClwTW9kdWxlOwoJcFNlZ21lbnQtPnNpemU9MDsKCXBTZWdtZW50LT5mbGFncz1ORV9TRUdGTEFHU19EQVRBOwoJcFNlZ21lbnQtPm1pbnNpemU9MHgxMDAwOwoJcFNlZ21lbnQrKzsKCgljdHM9KERXT1JEKUdldFduZFByb2NFbnRyeTE2KCJXaW4zMkNhbGxUb1N0YXJ0Iik7CiNpZmRlZiBXSU5FTElCMzIKCXBTZWdtZW50LT5zZWxlY3Rvcj0odm9pZCopY3RzOwoJcE1vZHVsZS0+aXA9MDsKI2Vsc2UKCXBTZWdtZW50LT5zZWxlY3Rvcj1jdHM+PjE2OwoJcE1vZHVsZS0+aXA9Y3RzICYgMHhGRkZGOwojZW5kaWYKCXBTZWdtZW50Kys7CgoJcFN0cj0oY2hhciopcFNlZ21lbnQ7CglwTW9kdWxlLT5uYW1lX3RhYmxlPShpbnQpcFN0ci0oaW50KXBNb2R1bGU7CglzdHJjcHkocFN0ciwiXHgwOFczMlNYWFhYIik7CglwU3RyKz05OwoKCS8qIEFsbCB0YWJsZXMgemVybyB0ZXJtaW5hdGVkICovCglwTW9kdWxlLT5yZXNfdGFibGU9cE1vZHVsZS0+aW1wb3J0X3RhYmxlPXBNb2R1bGUtPmVudHJ5X3RhYmxlPQoJCShpbnQpcFN0ci0oaW50KXBNb2R1bGU7CgogICAgICAgIE1PRFVMRV9SZWdpc3Rlck1vZHVsZShoTW9kdWxlKTsKCglQRV9Mb2FkSW1hZ2UoIGZkLCB3cG50ICk7CgoJcE1vZHVsZS0+aGVhcF9zaXplPTB4MTAwMDsKCXBNb2R1bGUtPnN0YWNrX3NpemU9MHhFMDAwOwoKCS8qIENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlcyBub3cgNjRLQiAqLwoJaEluc3RhbmNlPU1PRFVMRV9DcmVhdGVJbnN0YW5jZShoTW9kdWxlLE5VTEwgLyogRklYOiBOVUxMPyByZWFsbHk/ICovKTsKCXdwbnQtPmhpbnN0YW5jZT1oSW5zdGFuY2U7CgoJaWYgKHdwbnQtPnBlLT5wZV9leHBvcnQpIHsKCQlwU3RyID0gKCh1bnNpZ25lZCBjaGFyICopKHdwbnQtPmxvYWRfYWRkcikpK3dwbnQtPnBlLT5wZV9leHBvcnQtPk5hbWU7CgkJd3BudC0+bmFtZSA9IHhzdHJkdXAocFN0cik7Cgl9IGVsc2UgewoJCXdwbnQtPm5hbWUgPSB4c3RyZHVwKCBvZnMtPnN6UGF0aE5hbWUgKTsKCX0KCgl3cG50LT5uZXh0PXdpbmVfZmlsZXM7Cgl3aW5lX2ZpbGVzPXdwbnQ7CgogICAgICAgIC8qIEZJWE1FOiBJcyB0aGlzIHJlYWxseSB0aGUgY29ycmVjdCBwbGFjZSB0byBpbml0aWFsaXNlIHRoZSBETEw/ICovCglpZiAoKHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpKSB7CiAgICAgICAgICAgIFBFX0luaXRETEwod3BudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVEFTS19DcmVhdGVUYXNrKGhNb2R1bGUsaEluc3RhbmNlLDAsCgkJcGFyYW1zLT5oRW52aXJvbm1lbnQsKExQU1RSKVBUUl9TRUdfVE9fTElOKHBhcmFtcy0+Y21kTGluZSksCgkJKigoV09SRCopUFRSX1NFR19UT19MSU4ocGFyYW1zLT5zaG93Q21kKSsxKSk7Cgl9CglyZXR1cm4gaEluc3RhbmNlOwp9CgppbnQgVVNFUl9Jbml0QXBwKEhJTlNUQU5DRSBoSW5zdGFuY2UpOwp2b2lkIFBFX0luaXRURUIoaW50IGhURUIpOwoKdm9pZCBQRV9XaW4zMkNhbGxUb1N0YXJ0KHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0KQp7CglpbnQgZnM7CglzdHJ1Y3Qgd19maWxlcyAqd3BudD13aW5lX2ZpbGVzOwoJZHByaW50Zl93aW4zMihzdGRkZWIsIkdvaW5nIHRvIHN0YXJ0IFdpbjMyIHByb2dyYW1cbiIpOwkKCUluaXRUYXNrKGNvbnRleHQpOwoJVVNFUl9Jbml0QXBwKHdwbnQtPmhNb2R1bGUpOwogICAgICAgIGZzPShpbnQpR2xvYmFsQWxsb2MoR0hORCwweDEwMDAwKTsKICAgICAgICBQRV9Jbml0VEVCKGZzKTsKCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICV3MCwlJWZzIjo6InIiIChmcykpOwoJKCh2b2lkKCopKCkpKHdwbnQtPmxvYWRfYWRkcit3cG50LT5wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5BZGRyZXNzT2ZFbnRyeVBvaW50KSkoKTsKfQoKaW50IFBFX1VubG9hZEltYWdlKHN0cnVjdCB3X2ZpbGVzICp3cG50KQp7CglwcmludGYoIlBFdW5sb2FkSW1hZ2UoKSBjYWxsZWQhXG4iKTsKCS8qIGZyZWUgcmVzb3VyY2VzLCBpbWFnZSwgdW5tYXAgKi8KCXJldHVybiAxOwp9Cgp2b2lkIFBFX0luaXRETEwoSE1PRFVMRSBoTW9kdWxlKQp7CglzdHJ1Y3Qgd19maWxlcyAqd3BudDsKCWhNb2R1bGUgPSBHZXRFeGVQdHIoaE1vZHVsZSk7Cglmb3Iod3BudCA9IHdpbmVfZmlsZXM7d3BudCAmJiB3cG50LT5oTW9kdWxlICE9IGhNb2R1bGU7CgkJd3BudCA9IHdwbnQtPm5leHQpIC8qbm90aGluZyovOwoJaWYoIXdwbnQgfHwgd3BudC0+aW5pdGlhbGlzZWQpCgkJcmV0dXJuOwogICAgICAgIC8qIEZJWE1FOiBXaGF0IGFyZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnMgMiBhbmQgMz8gKi8KICAgICAgICAKCS8qIElzIHRoaXMgYSBsaWJyYXJ5PyAqLwoJaWYgKHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpIHsKCQkvKiBTaG91bGQgY2FsbCBETExFbnRyeVBvaW50IGhlcmUgKi8KCQlwcmludGYoIkluaXRQRURMTCgpIGNhbGxlZCFcbiIpOwoJCXdwbnQtPmluaXRpYWxpc2VkID0gMTsKICAgICAgICAgICAgICAgICgodm9pZCgqKSgpKSh3cG50LT5sb2FkX2FkZHIrd3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuQWRkcmVzc09mRW50cnlQb2ludCkpKHdwbnQtPmhNb2R1bGUsIDAsIDApOwoJfQp9CgoKLyogRklYTUU6IFRoaXMgc3R1ZmYgaXMgYWxsIG9uIGEgIndlbGwgaXQgd29ya3MiIGJhc2lzLiBBbiBpbXBsZW1lbnRhdGlvbgpiYXNlZCBvbiBzb21lIGtpbmQgb2YgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkIDotKSAqLwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgdm9pZCAgICAgICAgKkV4Y2VwdDsKICAgIHZvaWQgICAgICAgICpzdGFjazsKICAgIGludAkgICAgICAgIGR1bW15MVs0XTsKICAgIHN0cnVjdCBURUIgICpURUJEU0FsaWFzOwogICAgaW50CSAgICAgICAgZHVtbXkyWzJdOwogICAgaW50CSAgICAgICAgdGFza2lkOwp9IFRFQjsKCnZvaWQgUEVfSW5pdFRFQihpbnQgaFRFQikKewogICAgVERCICpwVGFzazsKICAgIFRFQiAqcFRFQjsKCiAgICBwVGFzayA9IChUREIgKikoR2xvYmFsTG9jayhHZXRDdXJyZW50VGFzaygpICYgMHhmZmZmKSk7CiAgICBwVEVCID0gKFRFQiAqKShQVFJfU0VHX09GRl9UT19MSU4oaFRFQiwgMCkpOwogICAgcFRFQi0+c3RhY2sgPSAodm9pZCAqKShHbG9iYWxMb2NrKHBUYXNrLT5oU3RhY2szMikpOwogICAgcFRFQi0+RXhjZXB0ID0gKHZvaWQgKikoLTEpOyAKICAgIHBURUItPlRFQkRTQWxpYXMgPSBwVEVCOwogICAgcFRFQi0+dGFza2lkID0gZ2V0cGlkKCk7Cn0KCnZvaWQgUEVfSW5pdGlhbGl6ZURMTHMoSE1PRFVMRSBoTW9kdWxlKQp7CglORV9NT0RVTEUgKnBNb2R1bGU7CglITU9EVUxFICpwRExMOwoJcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBHZXRFeGVQdHIoaE1vZHVsZSkgKTsKCWlmIChwTW9kdWxlLT5kbGxzX3RvX2luaXQpCgl7CgkJSEFORExFIHRvX2luaXQgPSBwTW9kdWxlLT5kbGxzX3RvX2luaXQ7CgkJcE1vZHVsZS0+ZGxsc190b19pbml0ID0gMDsKCQlmb3IgKHBETEwgPSAoSE1PRFVMRSAqKUdsb2JhbExvY2soIHRvX2luaXQgKTsgKnBETEw7IHBETEwrKykKCQl7CgkJCVBFX0luaXRpYWxpemVETExzKCAqcERMTCApOwoJCQlQRV9Jbml0RExMKCAqcERMTCApOwoJCX0KCQlHbG9iYWxGcmVlKCB0b19pbml0ICk7Cgl9CglQRV9Jbml0RExMKCBoTW9kdWxlICk7Cn0KI2VuZGlmIC8qIFdJTkVMSUIgKi8K