I2lmbmRlZiBXSU5FTElCCi8qIAogKiAgQ29weXJpZ2h0CTE5OTQJRXJpYyBZb3VuZGFsZSAmIEVyaWsgQm9zCiAqICBDb3B5cmlnaHQJMTk5NQlNYXJ0aW4gdm9uIEz2d2lzCiAqCiAqCWJhc2VkIG9uIEVyaWMgWW91bmRhbGUncyBwZS10ZXN0IGFuZDoKICoKICoJZnRwLm1pY3Jvc29mdC5jb206L3B1Yi9kZXZlbG9wZXIvTVNETi9DRDgvUEVGSUxFLlpJUAogKiBtYWtlIHRoYXQ6CiAqCWZ0cC5taWNyb3NvZnQuY29tOi9kZXZlbG9wci9NU0ROL09jdENEL1BFRklMRS5aSVAKICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJkbGxzLmgiCiNpbmNsdWRlICJuZWV4ZS5oIgojaW5jbHVkZSAicGVleGUuaCIKI2luY2x1ZGUgInBlX2ltYWdlLmgiCiNpbmNsdWRlICJyZWxheTMyLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgImFsaWFzLmgiCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgInRhc2suaCIKI2luY2x1ZGUgImxkdC5oIgojaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiNpbmNsdWRlICJzdGRkZWJ1Zy5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgInhtYWxsb2MuaCIKCnN0cnVjdCB3X2ZpbGVzICp3aW5lX2ZpbGVzID0gTlVMTDsKCnZvaWQgbXlfd2NzdG9tYnMoY2hhciAqIHJlc3VsdCwgdV9zaG9ydCAqIHNvdXJjZSwgaW50IGxlbikKewogIHdoaWxlKGxlbi0tKSB7CiAgICAvKiB0aGlzIHVzZWQgdG8gYmUgaXNhc2NpaSwgYnV0IHNlZSBpc2FzY2lpIGltcGxlbWVudGF0aW9uIGluIExpbnV4JwoJICAgY3R5cGUuaCAqLwogICAgaWYoKnNvdXJjZTwyNTUpICpyZXN1bHQrKyA9ICpzb3VyY2UrKzsKICAgIGVsc2UgewogICAgICBwcmludGYoIlVuYWJsZSB0byBoYW5kbGUgdW5pY29kZSByaWdodCBub3dcbiIpOwogICAgICBleGl0KDApOwogICAgfQogIH07Cn0KCiNpZiAwCmNoYXIgKiB4bW1hcChjaGFyICogdmFkZHIsIHVuc2lnbmVkIGludCB2X3NpemUsIHVuc2lnbmVkIGludCByX3NpemUsCglpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIHVuc2lnbmVkIGludCBmaWxlX29mZnNldCkKewogIGNoYXIgKiByZXN1bHQ7CiAgLyogLmJzcyBoYXMgbm8gYXNzb2NpYXRlZCBzdG9yYWdlIGluIHRoZSBQRSBmaWxlICovCiAgaWYocl9zaXplKQogICAgdl9zaXplPXJfc2l6ZTsKICBlbHNlCiNpZmRlZiBfX3N2cjRfXwogICAgZnByaW50ZihzdGRlcnIsInhtbWFwOiAlcyBsaW5lICVkIGRvZXNuJ3Qgc3VwcG9ydCBNQVBfQU5PTlxuIixfX0ZJTEVfXywgX19MSU5FX18pOwojZWxzZQogICAgZmxhZ3MgfD0gTUFQX0FOT047CiNlbmRpZgogIHJlc3VsdCA9IG1tYXAodmFkZHIsIHZfc2l6ZSwgcHJvdCwgZmxhZ3MsIGZkLCBmaWxlX29mZnNldCk7CiAgaWYoKHVuc2lnbmVkIGludCkgcmVzdWx0ICE9IDB4ZmZmZmZmZmYpIHJldHVybiByZXN1bHQ7CgogIC8qIFNpZ2guICBBbGlnbm1lbnQgbXVzdCBiZSB3cm9uZyBmb3IgbW1hcC4gIERvIHRoaXMgdGhlIGhhcmQgd2F5LiAqLwogIGlmKCEoZmxhZ3MgJiBNQVBfRklYRUQpKSB7CiAgICB2YWRkciA9IChjaGFyICopMHg0MDAwMDAwMDsKICAgIGZsYWdzIHw9IE1BUF9GSVhFRDsKICB9OwoKICBtbWFwKHZhZGRyLCB2X3NpemUsIHByb3QsIE1BUF9BTk9OWU1PVVMgfCBmbGFncywgMCwgMCk7CiAgbHNlZWsoZmQsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCk7CiAgcmVhZChmZCwgdmFkZHIsIHZfc2l6ZSk7CiAgcmV0dXJuIHZhZGRyOwp9OwojZW5kaWYKCnZvaWQgZHVtcF9leHBvcnRzKHN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICogcGVfZXhwb3J0cywgdW5zaWduZWQgaW50IGxvYWRfYWRkcikKeyAKICBjaGFyICogTW9kdWxlOwogIGludCBpOwogIHVfc2hvcnQgKiBvcmRpbmFsOwogIHVfbG9uZyAqIGZ1bmN0aW9uOwogIHVfY2hhciAqKiBuYW1lLCAqZW5hbWU7CgogIE1vZHVsZSA9ICgoY2hhciAqKSBsb2FkX2FkZHIpICsgcGVfZXhwb3J0cy0+TmFtZTsKICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiXG4qKioqKioqRVhQT1JUIERBVEEqKioqKioqXG5Nb2R1bGUgbmFtZSBpcyAlcywgJWxkIGZ1bmN0aW9ucywgJWxkIG5hbWVzXG4iLCAKCSBNb2R1bGUsCgkgcGVfZXhwb3J0cy0+TnVtYmVyX09mX0Z1bmN0aW9ucywKCSBwZV9leHBvcnRzLT5OdW1iZXJfT2ZfTmFtZXMpOwoKICBvcmRpbmFsID0gKHVfc2hvcnQgKikgKCgoY2hhciAqKSBsb2FkX2FkZHIpICsgKGludCkgcGVfZXhwb3J0cy0+QWRkcmVzc19PZl9OYW1lX09yZGluYWxzKTsKICBmdW5jdGlvbiA9ICh1X2xvbmcgKikgICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpIHBlX2V4cG9ydHMtPkFkZHJlc3NPZkZ1bmN0aW9ucyk7CiAgbmFtZSA9ICh1X2NoYXIgKiopICAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSBwZV9leHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7CgogIGRwcmludGZfd2luMzIoc3RkZGViLCIlLTMycyBPcmRpbmFsIFZpcnQgQWRkclxuIiwgIkZ1bmN0aW9uIE5hbWUiKTsKICBmb3IoaT0wOyBpPCBwZV9leHBvcnRzLT5OdW1iZXJfT2ZfRnVuY3Rpb25zOyBpKyspCiAgICB7CiAgICAgIGVuYW1lID0gIChjaGFyICopICgoKGNoYXIgKikgbG9hZF9hZGRyKSArIChpbnQpICpuYW1lKyspOwogICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiJS0zMnMgJTRkICAgICU4LjhseFxuIiwgZW5hbWUsICpvcmRpbmFsKyssICpmdW5jdGlvbisrKTsKICAgIH0KfQoKRFdPUkQgUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oc3RydWN0IHdfZmlsZXMqIHdwbnQsIGNoYXIqIGZ1bmNOYW1lKQp7CglzdHJ1Y3QgUEVfRXhwb3J0X0RpcmVjdG9yeSAqIGV4cG9ydHMgPSB3cG50LT5wZS0+cGVfZXhwb3J0OwoJdW5zaWduZWQgbG9hZF9hZGRyID0gd3BudC0+cGUtPmxvYWRfYWRkcjsKCXVfc2hvcnQgKiBvcmRpbmFsOwoJdV9sb25nICogZnVuY3Rpb247Cgl1X2NoYXIgKiogbmFtZSwgKmVuYW1lOwoJaW50IGk7CglpZighZXhwb3J0cylyZXR1cm4gMDsKCW9yZGluYWwgPSAodV9zaG9ydCAqKSAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSBleHBvcnRzLT5BZGRyZXNzX09mX05hbWVfT3JkaW5hbHMpOwoJZnVuY3Rpb24gPSAodV9sb25nICopICAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSBleHBvcnRzLT5BZGRyZXNzT2ZGdW5jdGlvbnMpOwoJbmFtZSA9ICh1X2NoYXIgKiopICAoKChjaGFyICopIGxvYWRfYWRkcikgKyAoaW50KSBleHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7Cglmb3IoaT0wOyBpPGV4cG9ydHMtPk51bWJlcl9PZl9GdW5jdGlvbnM7IGkrKykKCXsKCQlpZihISVdPUkQoZnVuY05hbWUpKQoJCXsKCQkJZW5hbWUgPSAgKGNoYXIgKikgKCgoY2hhciAqKSBsb2FkX2FkZHIpICsgKGludCkgKm5hbWUpOwoJCQlpZihzdHJjbXAoZW5hbWUsZnVuY05hbWUpPT0wKQoJCQkJcmV0dXJuIGxvYWRfYWRkcisqZnVuY3Rpb247CgkJfWVsc2V7CgkJCWlmKGZ1bmNOYW1lID09IChpbnQpKm9yZGluYWwgKyBleHBvcnRzLT5CYXNlKQoJCQkJcmV0dXJuIGxvYWRfYWRkcisqZnVuY3Rpb247CgkJfQoJCWZ1bmN0aW9uKys7CgkJb3JkaW5hbCsrOwoJCW5hbWUrKzsKCX0KCXJldHVybiAwOwp9CgpEV09SRCBQRV9HZXRQcm9jQWRkcmVzcyhITU9EVUxFIGhNb2R1bGUsIGNoYXIqIGZ1bmN0aW9uKQp7CglzdHJ1Y3Qgd19maWxlcyAqd3BudDsKCWZvcih3cG50PXdpbmVfZmlsZXM7d3BudDt3cG50PXdwbnQtPm5leHQpCgkJaWYod3BudC0+aE1vZHVsZT09aE1vZHVsZSkgYnJlYWs7CglpZighd3BudClyZXR1cm4gMDsKCWlmKHdwbnQtPmJ1aWx0aW4pCgl7CgkJaWYoSElXT1JEKGZ1bmN0aW9uKSkKCQkJcmV0dXJuIFJFTEFZMzJfR2V0RW50cnlQb2ludCh3cG50LT5idWlsdGluLGZ1bmN0aW9uLDApOwoJCWVsc2UKCQkJcmV0dXJuIFJFTEFZMzJfR2V0RW50cnlQb2ludCh3cG50LT5idWlsdGluLDAsKGludClmdW5jdGlvbik7Cgl9CglyZXR1cm4gUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24od3BudCxmdW5jdGlvbik7Cn0KCnZvaWQgZml4dXBfaW1wb3J0cyhzdHJ1Y3Qgd19maWxlcyogd3BudCkKeyAKICBzdHJ1Y3QgUEVfSW1wb3J0X0RpcmVjdG9yeSAqIHBlX2ltcDsKICBpbnQgZml4dXBfZmFpbGVkPTA7CiAgdW5zaWduZWQgaW50IGxvYWRfYWRkciA9IHdwbnQtPnBlLT5sb2FkX2FkZHI7CiAgaW50IGk7CiAgTkVfTU9EVUxFICpuZV9tb2Q7CiAgSE1PRFVMRSAqbW9kX3B0cjsKCiAvKiBPSywgbm93IGR1bXAgdGhlIGltcG9ydCBsaXN0ICovCiAgZHByaW50Zl93aW4zMihzdGRkZWIsICJcbkR1bXBpbmcgaW1wb3J0cyBsaXN0XG4iKTsKCiAgLyogZmlyc3QsIGNvdW50IHRoZSBudW1iZXIgb2YgaW1wb3J0ZWQgbm9uLWludGVybmFsIG1vZHVsZXMgKi8KICBwZV9pbXAgPSB3cG50LT5wZS0+cGVfaW1wb3J0OwogIGZvcihpPTA7cGVfaW1wLT5Nb2R1bGVOYW1lO3BlX2ltcCsrKQogIAlpKys7CgogIC8qIE5vdywgYWxsb2NhdGUgbWVtb3J5IGZvciBkbGxzX3RvX2luaXQgKi8KICBuZV9tb2QgPSBHbG9iYWxMb2NrKHdwbnQtPmhNb2R1bGUpOwogIG5lX21vZC0+ZGxsc190b19pbml0ID0gR0xPQkFMX0FsbG9jKEdNRU1fWkVST0lOSVQsKGkrMSkgKiBzaXplb2YoSE1PRFVMRSksCiAgCQkJCQl3cG50LT5oTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICk7CiAgbW9kX3B0ciA9IEdsb2JhbExvY2sobmVfbW9kLT5kbGxzX3RvX2luaXQpOwogIC8qIGxvYWQgdGhlIG1vZHVsZXMgYW5kIHB1dCB0aGVpciBoYW5kbGVzIGludG8gdGhlIGxpc3QgKi8KICBmb3IoaT0wLHBlX2ltcCA9IHdwbnQtPnBlLT5wZV9pbXBvcnQ7cGVfaW1wLT5Nb2R1bGVOYW1lO3BlX2ltcCsrKQogIHsKICAJY2hhciAqbmFtZSA9IChjaGFyKilsb2FkX2FkZHIrcGVfaW1wLT5Nb2R1bGVOYW1lOwogIAlpZihSRUxBWTMyX0dldEJ1aWx0aW5ETEwobmFtZSkpCgkJY29udGludWU7Cgltb2RfcHRyW2ldID0gTG9hZE1vZHVsZShuYW1lLChMUFZPSUQpLTEpOwoJaWYobW9kX3B0cltpXTw9KEhNT0RVTEUpMzIpCgl7CgkJZnByaW50ZihzdGRlcnIsIk1vZHVsZSAlcyBub3QgZm91bmRcbiIsbmFtZSk7CgkJZXhpdCgwKTsKCX0KCWkrKzsKICB9CiAgcGVfaW1wID0gd3BudC0+cGUtPnBlX2ltcG9ydDsKICB3aGlsZSAocGVfaW1wLT5Nb2R1bGVOYW1lKQogICAgewogICAgICBjaGFyICogTW9kdWxlOwogICAgICBzdHJ1Y3QgcGVfaW1wb3J0X25hbWUgKiBwZV9uYW1lOwogICAgICB1bnNpZ25lZCBpbnQgKiBpbXBvcnRfbGlzdCwgKnRodW5rX2xpc3Q7CgogICAgICBNb2R1bGUgPSAoKGNoYXIgKikgbG9hZF9hZGRyKSArIHBlX2ltcC0+TW9kdWxlTmFtZTsKICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICIlc1xuIiwgTW9kdWxlKTsKCiAgIGlmKHBlX2ltcC0+SW1wb3J0X0xpc3QgIT0gMCkgeyAvKiBvcmlnaW5hbCBtaWNyb3NvZnQgc3R5bGUgKi8KICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJNaWNyb3NvZnQgc3R5bGUgaW1wb3J0cyB1c2VkXG4iKTsKICAgICAgaW1wb3J0X2xpc3QgPSAodW5zaWduZWQgaW50ICopIAoJKCgodW5zaWduZWQgaW50KSBsb2FkX2FkZHIpICsgcGVfaW1wLT5JbXBvcnRfTGlzdCk7CgkgIHRodW5rX2xpc3QgPSAodW5zaWduZWQgaW50ICopCgkgICgoKHVuc2lnbmVkIGludCkgbG9hZF9hZGRyKSArIHBlX2ltcC0+VGh1bmtfTGlzdCk7CgoKICAgIHdoaWxlKCppbXBvcnRfbGlzdCkKCXsKCSAgcGVfbmFtZSA9IChzdHJ1Y3QgcGVfaW1wb3J0X25hbWUgKikgKChpbnQpIGxvYWRfYWRkciArICgodW5zaWduZWQpKmltcG9ydF9saXN0ICYgfjB4ODAwMDAwMDApKTsKCSAgaWYoKHVuc2lnbmVkKSppbXBvcnRfbGlzdCAmIDB4ODAwMDAwMDApCgkgIHsKCQlpbnQgb3JkaW5hbD0qaW1wb3J0X2xpc3QgJiAoMHg4MDAwMDAwMC0xKTsKCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiLS0tIE9yZGluYWwgJXMsJWRcbiIsIE1vZHVsZSwgb3JkaW5hbCk7CgkJKnRodW5rX2xpc3QgPSBXSU4zMl9HZXRQcm9jQWRkcmVzcyhNT0RVTEVfRmluZE1vZHVsZShNb2R1bGUpLAoJCQlvcmRpbmFsKTsKCSAgfWVsc2V7IC8qIGltcG9ydCBieSBuYW1lICovCgkgIGRwcmludGZfd2luMzIoc3RkZGViLCAiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwojaWZuZGVmIFdJTkVMSUIgLyogRklYTUU6IEpCUDogU2hvdWxkIHRoaXMgaGFwcGVuIGluIGxpYndpbmUuYT8gKi8KCSAgCSp0aHVua19saXN0ID0gV0lOMzJfR2V0UHJvY0FkZHJlc3MoTU9EVUxFX0ZpbmRNb2R1bGUoTW9kdWxlKSwKCQkJCXBlX25hbWUtPk5hbWUpOwoKI2Vsc2UKCSAgZnByaW50ZihzdGRlcnIsIkpCUDogQ2FsbCB0byBSRUxBWTMyX0dldEVudHJ5UG9pbnQgYmVpbmcgaWdub3JlZC5cbiIpOwojZW5kaWYKCQl9CgkgIGlmKCEqdGh1bmtfbGlzdCkKCSAgewoJICAJZnByaW50ZihzdGRlcnIsIk5vIGltcGxlbWVudGF0aW9uIGZvciAlcy4lZCglcylcbiIsTW9kdWxlLCAKCQkJcGVfbmFtZS0+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+aGluc3RhbmNlKTsKfQoKSElOU1RBTkNFIE1PRFVMRV9DcmVhdGVJbnN0YW5jZShITU9EVUxFIGhNb2R1bGUsTE9BRFBBUkFNUyAqcGFyYW1zKTsKdm9pZCBJbml0VGFzayhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCk7CgpISU5TVEFOQ0UgUEVfTG9hZE1vZHVsZSggaW50IGZkLCBPRlNUUlVDVCAqb2ZzLCBMT0FEUEFSQU1TKiBwYXJhbXMgKQp7CglzdHJ1Y3Qgd19maWxlcyAqd3BudDsKCWludCBzaXplLCBvZl9zaXplOwoJTkVfTU9EVUxFICpwTW9kdWxlOwoJU0VHVEFCTEVFTlRSWSAqcFNlZ21lbnQ7CgljaGFyICpwU3RyOwoJRFdPUkQgY3RzOwoJSE1PRFVMRSBoTW9kdWxlOwoJSElOU1RBTkNFIGhJbnN0YW5jZTsKCglBTElBU19Vc2VBbGlhc2VzPTE7CgoJd3BudD14bWFsbG9jKHNpemVvZihzdHJ1Y3Qgd19maWxlcykpOwoJd3BudC0+b2ZzPSpvZnM7Cgl3cG50LT50eXBlPTA7Cgl3cG50LT5oaW5zdGFuY2U9MDsKCXdwbnQtPmhNb2R1bGU9MDsKCXdwbnQtPmluaXRpYWxpc2VkPTA7Cgl3cG50LT5idWlsdGluPTA7Cglsc2VlayhmZCwwLFNFRUtfU0VUKTsKCXdwbnQtPm16X2hlYWRlcj14bWFsbG9jKHNpemVvZihzdHJ1Y3QgbXpfaGVhZGVyX3MpKTsKCXJlYWQoZmQsd3BudC0+bXpfaGVhZGVyLHNpemVvZihzdHJ1Y3QgbXpfaGVhZGVyX3MpKTsKCiAgICAgICAgb2Zfc2l6ZSA9IHNpemVvZihPRlNUUlVDVCkgLSBzaXplb2Yob2ZzLT5zelBhdGhOYW1lKQogICAgICAgICAgICAgICAgICArIHN0cmxlbihvZnMtPnN6UGF0aE5hbWUpICsgMTsKCXNpemUgPSBzaXplb2YoTkVfTU9EVUxFKSArCiAgICAgICAgICAgICAgIC8qIGxvYWRlZCBmaWxlIGluZm8gKi8KICAgICAgICAgICAgICAgb2Zfc2l6ZSArCiAgICAgICAgICAgICAgIC8qIHNlZ21lbnQgdGFibGU6IERTLENTICovCiAgICAgICAgICAgICAgIDIgKiBzaXplb2YoU0VHVEFCTEVFTlRSWSkgKwogICAgICAgICAgICAgICAvKiBuYW1lIHRhYmxlICovCiAgICAgICAgICAgICAgIDkgKwogICAgICAgICAgICAgICAvKiBzZXZlcmFsIGVtcHR5IHRhYmxlcyAqLwogICAgICAgICAgICAgICA4OwoKCWhNb2R1bGUgPSBHbG9iYWxBbGxvYyggR01FTV9NT1ZFQUJMRSB8IEdNRU1fWkVST0lOSVQsIHNpemUgKTsKCXdwbnQtPmhNb2R1bGU9aE1vZHVsZTsKCWlmICghaE1vZHVsZSkgcmV0dXJuIChISU5TVEFOQ0UpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLwoKCUZhclNldE93bmVyKCBoTW9kdWxlLCBoTW9kdWxlICk7CgkKCXBNb2R1bGUgPSAoTkVfTU9EVUxFKilHbG9iYWxMb2NrKGhNb2R1bGUpOwoKCS8qIFNldCBhbGwgdXNlZCBlbnRyaWVzICovCglwTW9kdWxlLT5tYWdpYz1ORV9TSUdOQVRVUkU7CglwTW9kdWxlLT5jb3VudD0xOwoJcE1vZHVsZS0+bmV4dD0wOwoJcE1vZHVsZS0+ZmxhZ3M9TkVfRkZMQUdTX1dJTjMyOwoJcE1vZHVsZS0+ZGdyb3VwPTE7CglwTW9kdWxlLT5zcz0xOwoJcE1vZHVsZS0+Y3M9MjsKCS8qIFdobyB3YW50cyB0byBMb2NhbEFsbG9jIGZvciBhIFBFIE1vZHVsZT8gKi8KCXBNb2R1bGUtPmhlYXBfc2l6ZT0weDEwMDA7CglwTW9kdWxlLT5zdGFja19zaXplPTB4RjAwMDsKCXBNb2R1bGUtPnNlZ19jb3VudD0xOwoJcE1vZHVsZS0+bW9kcmVmX2NvdW50PTA7CglwTW9kdWxlLT5ucm5hbWVfc2l6ZT0wOwoJcE1vZHVsZS0+c2VnX3RhYmxlPXNpemVvZihORV9NT0RVTEUpICsgb2Zfc2l6ZTsKCXBNb2R1bGUtPmZpbGVpbmZvPXNpemVvZihORV9NT0RVTEUpOwoJcE1vZHVsZS0+b3NfZmxhZ3M9TkVfT1NGTEFHU19XSU5ET1dTOwoJcE1vZHVsZS0+ZXhwZWN0ZWRfdmVyc2lvbj0weDMwQTsKCiAgICAgICAgLyogU2V0IGxvYWRlZCBmaWxlIGluZm9ybWF0aW9uICovCiAgICAgICAgbWVtY3B5KCBwTW9kdWxlICsgMSwgb2ZzLCBvZl9zaXplICk7CiAgICAgICAgKChPRlNUUlVDVCAqKShwTW9kdWxlKzEpKS0+Y0J5dGVzID0gb2Zfc2l6ZSAtIDE7CgoJcFNlZ21lbnQ9KFNFR1RBQkxFRU5UUlkqKSgoY2hhciopKHBNb2R1bGUgKyAxKSArIG9mX3NpemUpOwoJcE1vZHVsZS0+ZGdyb3VwX2VudHJ5PShpbnQpcFNlZ21lbnQtKGludClwTW9kdWxlOwoJcFNlZ21lbnQtPnNpemU9MDsKCXBTZWdtZW50LT5mbGFncz1ORV9TRUdGTEFHU19EQVRBOwoJcFNlZ21lbnQtPm1pbnNpemU9MHgxMDAwOwoJcFNlZ21lbnQrKzsKCgljdHM9KERXT1JEKU1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiV2luMzJDYWxsVG9TdGFydCIpOwojaWZkZWYgV0lORUxJQjMyCglwU2VnbWVudC0+c2VsZWN0b3I9KHZvaWQqKWN0czsKCXBNb2R1bGUtPmlwPTA7CiNlbHNlCglwU2VnbWVudC0+c2VsZWN0b3I9Y3RzPj4xNjsKCXBNb2R1bGUtPmlwPWN0cyAmIDB4RkZGRjsKI2VuZGlmCglwU2VnbWVudCsrOwoKCXBTdHI9KGNoYXIqKXBTZWdtZW50OwoJcE1vZHVsZS0+bmFtZV90YWJsZT0oaW50KXBTdHItKGludClwTW9kdWxlOwoJc3RyY3B5KHBTdHIsIlx4MDhXMzJTWFhYWCIpOwoJcFN0cis9OTsKCgkvKiBBbGwgdGFibGVzIHplcm8gdGVybWluYXRlZCAqLwoJcE1vZHVsZS0+cmVzX3RhYmxlPXBNb2R1bGUtPmltcG9ydF90YWJsZT1wTW9kdWxlLT5lbnRyeV90YWJsZT0KCQkoaW50KXBTdHItKGludClwTW9kdWxlOwoKICAgICAgICBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUoaE1vZHVsZSk7CgoJUEVfTG9hZEltYWdlKCBmZCwgd3BudCApOwoKCXBNb2R1bGUtPmhlYXBfc2l6ZT0weDEwMDA7CglwTW9kdWxlLT5zdGFja19zaXplPTB4RTAwMDsKCgkvKiBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZXMgbm93IDY0S0IgKi8KCWhJbnN0YW5jZT1NT0RVTEVfQ3JlYXRlSW5zdGFuY2UoaE1vZHVsZSxOVUxMIC8qIEZJWDogTlVMTD8gcmVhbGx5PyAqLyk7Cgl3cG50LT5oaW5zdGFuY2U9aEluc3RhbmNlOwoKCWlmICh3cG50LT5wZS0+cGVfZXhwb3J0KSB7CgkJcFN0ciA9ICgodW5zaWduZWQgY2hhciAqKSh3cG50LT5sb2FkX2FkZHIpKSt3cG50LT5wZS0+cGVfZXhwb3J0LT5OYW1lOwoJCXdwbnQtPm5hbWUgPSB4c3RyZHVwKHBTdHIpOwoJfSBlbHNlIHsKCQl3cG50LT5uYW1lID0geHN0cmR1cCggb2ZzLT5zelBhdGhOYW1lICk7Cgl9CgoJd3BudC0+bmV4dD13aW5lX2ZpbGVzOwoJd2luZV9maWxlcz13cG50OwoKICAgICAgICAvKiBGSVhNRTogSXMgdGhpcyByZWFsbHkgdGhlIGNvcnJlY3QgcGxhY2UgdG8gaW5pdGlhbGlzZSB0aGUgRExMPyAqLwoJaWYgKCh3cG50LT5wZS0+cGVfaGVhZGVyLT5jb2ZmLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKSkgewogICAgICAgICAgICBQRV9Jbml0RExMKGhNb2R1bGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRBU0tfQ3JlYXRlVGFzayhoTW9kdWxlLGhJbnN0YW5jZSwwLAoJCXBhcmFtcy0+aEVudmlyb25tZW50LChMUFNUUilQVFJfU0VHX1RPX0xJTihwYXJhbXMtPmNtZExpbmUpLAoJCSooKFdPUkQqKVBUUl9TRUdfVE9fTElOKHBhcmFtcy0+c2hvd0NtZCkrMSkpOwoJfQoJcmV0dXJuIGhJbnN0YW5jZTsKfQoKaW50IFVTRVJfSW5pdEFwcChISU5TVEFOQ0UgaEluc3RhbmNlKTsKdm9pZCBQRV9Jbml0VEVCKGludCBoVEVCKTsKCnZvaWQgUEVfV2luMzJDYWxsVG9TdGFydChzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCkKewoJaW50IGZzOwoJc3RydWN0IHdfZmlsZXMgKndwbnQ9d2luZV9maWxlczsKCWRwcmludGZfd2luMzIoc3RkZGViLCJHb2luZyB0byBzdGFydCBXaW4zMiBwcm9ncmFtXG4iKTsJCglJbml0VGFzayhjb250ZXh0KTsKCVVTRVJfSW5pdEFwcCh3cG50LT5oTW9kdWxlKTsKICAgICAgICBmcz0oaW50KUdsb2JhbEFsbG9jKEdITkQsMHgxMDAwMCk7CiAgICAgICAgUEVfSW5pdFRFQihmcyk7CglfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAldzAsJSVmcyI6OiJyIiAoZnMpKTsKCSgodm9pZCgqKSgpKSh3cG50LT5sb2FkX2FkZHIrd3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuQWRkcmVzc09mRW50cnlQb2ludCkpKCk7Cn0KCmludCBQRV9VbmxvYWRJbWFnZShzdHJ1Y3Qgd19maWxlcyAqd3BudCkKewoJcHJpbnRmKCJQRXVubG9hZEltYWdlKCkgY2FsbGVkIVxuIik7CgkvKiBmcmVlIHJlc291cmNlcywgaW1hZ2UsIHVubWFwICovCglyZXR1cm4gMTsKfQoKdm9pZCBQRV9Jbml0RExMKEhNT0RVTEUgaE1vZHVsZSkKewoJc3RydWN0IHdfZmlsZXMgKndwbnQ7CgloTW9kdWxlID0gR2V0RXhlUHRyKGhNb2R1bGUpOwoJZm9yKHdwbnQgPSB3aW5lX2ZpbGVzO3dwbnQgJiYgd3BudC0+aE1vZHVsZSAhPSBoTW9kdWxlOwoJCXdwbnQgPSB3cG50LT5uZXh0KSAvKm5vdGhpbmcqLzsKCWlmKCF3cG50IHx8IHdwbnQtPmluaXRpYWxpc2VkKQoJCXJldHVybjsKICAgICAgICAvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciBwYXJhbWV0ZXJzIDIgYW5kIDM/ICovCiAgICAgICAgCgkvKiBJcyB0aGlzIGEgbGlicmFyeT8gKi8KCWlmICh3cG50LT5wZS0+cGVfaGVhZGVyLT5jb2ZmLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKSB7CgkJLyogU2hvdWxkIGNhbGwgRExMRW50cnlQb2ludCBoZXJlICovCgkJcHJpbnRmKCJJbml0UEVETEwoKSBjYWxsZWQhXG4iKTsKCQl3cG50LT5pbml0aWFsaXNlZCA9IDE7CiAgICAgICAgICAgICAgICAoKHZvaWQoKikoKSkod3BudC0+bG9hZF9hZGRyK3dwbnQtPnBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkFkZHJlc3NPZkVudHJ5UG9pbnQpKSh3cG50LT5oTW9kdWxlLCAwLCAwKTsKCX0KfQoKCi8qIEZJWE1FOiBUaGlzIHN0dWZmIGlzIGFsbCBvbiBhICJ3ZWxsIGl0IHdvcmtzIiBiYXNpcy4gQW4gaW1wbGVtZW50YXRpb24KYmFzZWQgb24gc29tZSBraW5kIG9mIGRvY3VtZW50YXRpb24gd291bGQgYmUgZ3JlYXRseSBhcHByZWNpYXRlZCA6LSkgKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIHZvaWQgICAgICAgICpFeGNlcHQ7CiAgICB2b2lkICAgICAgICAqc3RhY2s7CiAgICBpbnQJICAgICAgICBkdW1teTFbNF07CiAgICBzdHJ1Y3QgVEVCICAqVEVCRFNBbGlhczsKICAgIGludAkgICAgICAgIGR1bW15MlsyXTsKICAgIGludAkgICAgICAgIHRhc2tpZDsKfSBURUI7Cgp2b2lkIFBFX0luaXRURUIoaW50IGhURUIpCnsKICAgIFREQiAqcFRhc2s7CiAgICBURUIgKnBURUI7CgogICAgcFRhc2sgPSAoVERCICopKEdsb2JhbExvY2soR2V0Q3VycmVudFRhc2soKSAmIDB4ZmZmZikpOwogICAgcFRFQiA9IChURUIgKikoUFRSX1NFR19PRkZfVE9fTElOKGhURUIsIDApKTsKICAgIHBURUItPnN0YWNrID0gKHZvaWQgKikoR2xvYmFsTG9jayhwVGFzay0+aFN0YWNrMzIpKTsKICAgIHBURUItPkV4Y2VwdCA9ICh2b2lkICopKC0xKTsgCiAgICBwVEVCLT5URUJEU0FsaWFzID0gcFRFQjsKICAgIHBURUItPnRhc2tpZCA9IGdldHBpZCgpOwp9Cgp2b2lkIFBFX0luaXRpYWxpemVETExzKEhNT0RVTEUgaE1vZHVsZSkKewoJTkVfTU9EVUxFICpwTW9kdWxlOwoJSE1PRFVMRSAqcERMTDsKCXBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggR2V0RXhlUHRyKGhNb2R1bGUpICk7CglpZiAocE1vZHVsZS0+ZGxsc190b19pbml0KQoJewoJCUhBTkRMRSB0b19pbml0ID0gcE1vZHVsZS0+ZGxsc190b19pbml0OwoJCXBNb2R1bGUtPmRsbHNfdG9faW5pdCA9IDA7CgkJZm9yIChwRExMID0gKEhNT0RVTEUgKilHbG9iYWxMb2NrKCB0b19pbml0ICk7ICpwRExMOyBwRExMKyspCgkJewoJCQlQRV9Jbml0aWFsaXplRExMcyggKnBETEwgKTsKCQkJUEVfSW5pdERMTCggKnBETEwgKTsKCQl9CgkJR2xvYmFsRnJlZSggdG9faW5pdCApOwoJfQoJUEVfSW5pdERMTCggaE1vZHVsZSApOwp9CiNlbmRpZiAvKiBXSU5FTElCICovCg==