LyogRGlyZWN0M0QgRXhlY3V0ZUJ1ZmZlcgogKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVUxNRVIKICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQ2hyaXN0aWFuIENvc3RhCiAqIENvcHlyaWdodCAoYykgMjAwNiAgICAgIFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBfZHVtcF9leGVjdXRlZGF0YQogKiBfZHVtcF9EM0RFWEVDVVRFQlVGRkVSREVTQwogKgogKiBEZWJ1ZyBmdW5jdGlvbnMgd2hpY2ggd3JpdGUgdGhlIGV4ZWN1dGVidWZmZXIgZGF0YSB0byB0aGUgY29uc29sZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBfZHVtcF9leGVjdXRlZGF0YShjb25zdCBEM0RFWEVDVVRFREFUQSAqbHBEYXRhKSB7CiAgICBUUkFDRSgiZHdTaXplIDogJWRcbiIsIGxwRGF0YS0+ZHdTaXplKTsKICAgIFRSQUNFKCJWZXJ0ZXggICAgICBPZmZzZXQgOiAlZCAgQ291bnQgIDogJWRcbiIsIGxwRGF0YS0+ZHdWZXJ0ZXhPZmZzZXQsIGxwRGF0YS0+ZHdWZXJ0ZXhDb3VudCk7CiAgICBUUkFDRSgiSW5zdHJ1Y3Rpb24gT2Zmc2V0IDogJWQgIExlbmd0aCA6ICVkXG4iLCBscERhdGEtPmR3SW5zdHJ1Y3Rpb25PZmZzZXQsIGxwRGF0YS0+ZHdJbnN0cnVjdGlvbkxlbmd0aCk7CiAgICBUUkFDRSgiSFZlcnRleCAgICAgT2Zmc2V0IDogJWRcbiIsIGxwRGF0YS0+ZHdIVmVydGV4T2Zmc2V0KTsKfQoKc3RhdGljIHZvaWQgX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MoY29uc3QgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykgewogICAgVFJBQ0UoImR3U2l6ZSAgICAgICA6ICVkXG4iLCBscERlc2MtPmR3U2l6ZSk7CiAgICBUUkFDRSgiZHdGbGFncyAgICAgIDogJXhcbiIsIGxwRGVzYy0+ZHdGbGFncyk7CiAgICBUUkFDRSgiZHdDYXBzICAgICAgIDogJXhcbiIsIGxwRGVzYy0+ZHdDYXBzKTsKICAgIFRSQUNFKCJkd0J1ZmZlclNpemUgOiAlZFxuIiwgbHBEZXNjLT5kd0J1ZmZlclNpemUpOwogICAgVFJBQ0UoImxwRGF0YSAgICAgICA6ICVwXG4iLCBscERlc2MtPmxwRGF0YSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlCiAqCiAqIFRoZSBtYWluIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV4ZWN1dGUgYnVmZmVyCiAqIEl0IHRyYW5zZm9ybXMgdGhlIHZlcnRpY2VzIGlmIG5lY2Vzc2FyeSwgYW5kIGNhbGxzIElEaXJlY3QzRERldmljZTcKICogZm9yIGRyYXdpbmcgdGhlIHZlcnRpY2VzLiBJdCBpcyBjYWxsZWQgZnJvbQogKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKICoKICogVE9ETzogUGVyaGFwcyBzb21lIGNvbW1lbnRzIGFib3V0IHRoZSB2YXJpb3VzIG9wY29kZXMgd291bGRuJ3QgaHVydAogKgogKiBEb24ndCBkZWNsYXJlIHRoaXMgc3RhdGljLCBhcyBpdCdzIGNhbGxlZCBmcm9tIGRldmljZS5jLAogKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKICoKICogUGFyYW1zOgogKiAgRGV2aWNlOiAzRCBEZXZpY2UgYXNzb2NpYXRlZCB0byB1c2UgZm9yIGRyYXdpbmcKICogIFZpZXdwb3J0OiBWaWV3cG9ydCBmb3IgdGhpcyBvcGVyYXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqbHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpscFZpZXdwb3J0KQp7CiAgICAvKiBEV09SRCBicyA9IFRoaXMtPmRlc2MuZHdCdWZmZXJTaXplOyAqLwogICAgRFdPUkQgdnMgPSBUaGlzLT5kYXRhLmR3VmVydGV4T2Zmc2V0OwogICAgLyogRFdPUkQgdmMgPSBUaGlzLT5kYXRhLmR3VmVydGV4Q291bnQ7ICovCiAgICBEV09SRCBpcyA9IFRoaXMtPmRhdGEuZHdJbnN0cnVjdGlvbk9mZnNldDsKICAgIC8qIERXT1JEIGlsID0gVGhpcy0+ZGF0YS5kd0luc3RydWN0aW9uTGVuZ3RoOyAqLwoKICAgIGNoYXIgKmluc3RyID0gKGNoYXIgKilUaGlzLT5kZXNjLmxwRGF0YSArIGlzOwoKICAgIC8qIFNob3VsZCBjaGVjayBpZiB0aGUgdmlld3BvcnQgd2FzIGFkZGVkIG9yIG5vdCB0byB0aGUgZGV2aWNlICovCgogICAgLyogQWN0aXZhdGUgdGhlIHZpZXdwb3J0ICovCiAgICBscFZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlID0gbHBEZXZpY2U7CiAgICBscFZpZXdwb3J0LT5hY3RpdmF0ZShscFZpZXdwb3J0LCBGQUxTRSk7CgogICAgVFJBQ0UoIkV4ZWN1dGVEYXRhIDpcbiIpOwogICAgaWYgKFRSQUNFX09OKGQzZDcpKQogICAgICBfZHVtcF9leGVjdXRlZGF0YSgmKFRoaXMtPmRhdGEpKTsKCiAgICB3aGlsZSAoMSkgewogICAgICAgIExQRDNESU5TVFJVQ1RJT04gY3VycmVudCA9IChMUEQzRElOU1RSVUNUSU9OKSBpbnN0cjsKCUJZVEUgc2l6ZTsKCVdPUkQgY291bnQ7CgkKCWNvdW50ID0gY3VycmVudC0+d0NvdW50OwoJc2l6ZSA9IGN1cnJlbnQtPmJTaXplOwoJaW5zdHIgKz0gc2l6ZW9mKEQzRElOU1RSVUNUSU9OKTsKCQoJc3dpdGNoIChjdXJyZW50LT5iT3Bjb2RlKSB7CgkgICAgY2FzZSBEM0RPUF9QT0lOVDogewoJICAgICAgICBXQVJOKCJQT0lOVC1zICAgICAgICAgICglZClcbiIsIGNvdW50KTsKCQlpbnN0ciArPSBjb3VudCAqIHNpemU7CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9MSU5FOiB7CgkgICAgICAgIFdBUk4oIkxJTkUtcyAgICAgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1RSSUFOR0xFOiB7CgkgICAgICAgIGludCBpOwoJCUQzRFRMVkVSVEVYICp0bF92eCA9IChEM0RUTFZFUlRFWCAqKSBUaGlzLT52ZXJ0ZXhfZGF0YTsKCQlUUkFDRSgiVFJJQU5HTEUgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJCgkJaWYgKGNvdW50KjM+VGhpcy0+bmJfaW5kaWNlcykgewoJCSAgICBUaGlzLT5uYl9pbmRpY2VzID0gY291bnQgKiAzOwogICAgICAgICAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzLT5pbmRpY2VzKTsKCQkgICAgVGhpcy0+aW5kaWNlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKFdPUkQpKlRoaXMtPm5iX2luZGljZXMpOwoJCX0KCQkJCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBMUEQzRFRSSUFOR0xFIGNpID0gKExQRDNEVFJJQU5HTEUpIGluc3RyOwoJCSAgICBUUkFDRV8oZDNkNykoIiAgdjE6ICVkICB2MjogJWQgIHYzOiAlZFxuIixjaS0+dTEudjEsIGNpLT51Mi52MiwgY2ktPnUzLnYzKTsKCQkgICAgVFJBQ0VfKGQzZDcpKCIgIEZsYWdzIDogIik7CgkJICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewoJCQkvKiBXaXJlZnJhbWUgKi8KCQkJaWYgKGNpLT53RmxhZ3MgJiBEM0RUUklGTEFHX0VER0VFTkFCTEUxKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRURHRUVOQUJMRTEgIik7CgkgICAgCQlpZiAoY2ktPndGbGFncyAmIEQzRFRSSUZMQUdfRURHRUVOQUJMRTIpCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJFREdFRU5BQkxFMiAiKTsKCSAgICAJCWlmIChjaS0+d0ZsYWdzICYgRDNEVFJJRkxBR19FREdFRU5BQkxFMSkKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIkVER0VFTkFCTEUzICIpOwoJICAgIAkJLyogU3RyaXBzIC8gRmFucyAqLwoJICAgIAkJaWYgKGNpLT53RmxhZ3MgPT0gRDNEVFJJRkxBR19FVkVOKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRVZFTiAiKTsKCSAgICAJCWlmIChjaS0+d0ZsYWdzID09IEQzRFRSSUZMQUdfT0REKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiT0REICIpOwoJICAgIAkJaWYgKGNpLT53RmxhZ3MgPT0gRDNEVFJJRkxBR19TVEFSVCkKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIlNUQVJUICIpOwoJICAgIAkJaWYgKChjaS0+d0ZsYWdzID4gMCkgJiYgKGNpLT53RmxhZ3MgPCAzMCkpCgkgICAgICAgCQkgICAgVFJBQ0VfKGQzZDcpKCJTVEFSVEZMQVQoJWQpICIsIGNpLT53RmxhZ3MpOwoJICAgIAkJVFJBQ0VfKGQzZDcpKCJcbiIpOwogICAgICAgIAkgICAgfQoJCSAgICBUaGlzLT5pbmRpY2VzWyhpICogMykgICAgXSA9IGNpLT51MS52MTsKCQkgICAgVGhpcy0+aW5kaWNlc1soaSAqIDMpICsgMV0gPSBjaS0+dTIudjI7CgkJICAgIFRoaXMtPmluZGljZXNbKGkgKiAzKSArIDJdID0gY2ktPnUzLnYzOwogICAgICAgICAgICAgICAgICAgIGluc3RyICs9IHNpemU7CgkJfQogICAgICAgICAgICAgICAgLyogSURpcmVjdDNERGV2aWNlcyBoYXZlIGNvbG9yIGtleWluZyBhbHdheXMgZW5hYmxlZCAtCiAgICAgICAgICAgICAgICAgKiBlbmFibGUgaXQgYmVmb3JlIGRyYXdpbmcuIFRoaXMgb3ZlcndyaXRlcyBhbnkgQUxQSEEqCiAgICAgICAgICAgICAgICAgKiByZW5kZXIgc3RhdGUKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUobHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTdfRHJhd0luZGV4ZWRQcmltaXRpdmUoSUNPTV9JTlRFUkZBQ0UobHBEZXZpY2UsSURpcmVjdDNERGV2aWNlNyksCgkJCQkgICAgICAgICAgICAgICAgICAgICAgRDNEUFRfVFJJQU5HTEVMSVNULEQzREZWRl9UTFZFUlRFWCx0bF92eCwwLFRoaXMtPmluZGljZXMsY291bnQqMywwKTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX01BVFJJWExPQUQ6CgkgICAgICAgIFdBUk4oIk1BVFJJWExPQUQtcyAgICAgKCVkKVxuIiwgY291bnQpOwoJICAgICAgICBpbnN0ciArPSBjb3VudCAqIHNpemU7CgkgICAgICAgIGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX01BVFJJWE1VTFRJUExZOiB7CgkgICAgICAgIGludCBpOwoJCVRSQUNFKCJNQVRSSVhNVUxUSVBMWSAgICglZClcbiIsIGNvdW50KTsKCQkKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCSAgICBMUEQzRE1BVFJJWE1VTFRJUExZIGNpID0gKExQRDNETUFUUklYTVVMVElQTFkpIGluc3RyOwogICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGEsIGIsIGM7CgogICAgICAgICAgICAgICAgICAgIGlmKCFjaS0+aERlc3RNYXRyaXggfHwgY2ktPmhEZXN0TWF0cml4ID4gbHBEZXZpY2UtPm51bUhhbmRsZXMgfHwKICAgICAgICAgICAgICAgICAgICAgICAhY2ktPmhTcmNNYXRyaXgxIHx8IGNpLT5oU3JjTWF0cml4MSA+IGxwRGV2aWNlLT5udW1IYW5kbGVzIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIWNpLT5oU3JjTWF0cml4MiB8fCBjaS0+aFNyY01hdHJpeDIgPiBscERldmljZS0+bnVtSGFuZGxlcykgewogICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkhhbmRsZXMgb3V0IG9mIGJvdW5kc1xuIik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChscERldmljZS0+SGFuZGxlc1tjaS0+aERlc3RNYXRyaXggLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdHJpeCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhTcmNNYXRyaXgxIC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRyaXggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oU3JjTWF0cml4MiAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiSGFuZGxlIHR5cGVzIGludmFsaWRcbiIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAoTFBEM0RNQVRSSVgpIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oRGVzdE1hdHJpeCAtIDFdLnB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChMUEQzRE1BVFJJWCkgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhTcmNNYXRyaXgxIC0gMV0ucHRyOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gKExQRDNETUFUUklYKSBscERldmljZS0+SGFuZGxlc1tjaS0+aFNyY01hdHJpeDIgLSAxXS5wdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKCIgIERlc3QgOiAlcCAgU3JjMSA6ICVwICBTcmMyIDogJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbHlfbWF0cml4KGEsYyxiKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfU1RBVEVUUkFOU0ZPUk06IHsKCSAgICAgICAgaW50IGk7CgkJVFJBQ0UoIlNUQVRFVFJBTlNGT1JNICAgKCVkKVxuIiwgY291bnQpOwoJCQoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEU1RBVEUgY2kgPSAoTFBEM0RTVEFURSkgaW5zdHI7CgogICAgICAgICAgICAgICAgICAgIGlmKCFjaS0+dTIuZHdBcmdbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJTZXR0aW5nIGEgTlVMTCBtYXRyaXggaGFuZGxlLCB3aGF0IHNob3VsZCBJIGRvP1xuIik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNpLT51Mi5kd0FyZ1swXSA+IGxwRGV2aWNlLT5udW1IYW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiSGFuZGxlICVkIGlzIG91dCBvZiBib3VuZHNcbiIsIGNpLT51Mi5kd0FyZ1swXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGxwRGV2aWNlLT5IYW5kbGVzW2NpLT51Mi5kd0FyZ1swXSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiSGFuZGxlICVkIGlzIG5vdCBhIG1hdHJpeCBoYW5kbGVcbiIsIGNpLT51Mi5kd0FyZ1swXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUgPT0gRDNEVFJBTlNGT1JNU1RBVEVfV09STEQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscERldmljZS0+d29ybGQgPSBjaS0+dTIuZHdBcmdbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNpLT51MS5kcnN0UmVuZGVyU3RhdGVUeXBlID09IEQzRFRSQU5TRk9STVNUQVRFX1ZJRVcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscERldmljZS0+dmlldyA9IGNpLT51Mi5kd0FyZ1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUgPT0gRDNEVFJBTlNGT1JNU1RBVEVfUFJPSkVDVElPTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGV2aWNlLT5wcm9qID0gY2ktPnUyLmR3QXJnWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShscERldmljZSwgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT51MS5kcnN0UmVuZGVyU3RhdGVUeXBlLCAoTFBEM0RNQVRSSVgpIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT51Mi5kd0FyZ1swXSAtIDFdLnB0cik7CiAgICAgICAgICAgICAgICAgICAgfQoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NUQVRFTElHSFQ6IHsKCSAgICAgICAgaW50IGk7CgkJVFJBQ0UoIlNUQVRFTElHSFQgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCQoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEU1RBVEUgY2kgPSAoTFBEM0RTVEFURSkgaW5zdHI7CgogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIoJTA4eCwlMDh4KVxuIixjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlLCBjaS0+dTIuZHdBcmdbMF0pOwoKCQkgICAgaWYgKCFjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlICYmIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlID4gRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWCkpCgkJCUVSUigiVW5leHBlY3RlZCBMaWdodCBTdGF0ZSBUeXBlXG4iKTsKCQkgICAgZWxzZSBpZiAoY2ktPnUxLmRsc3RMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIC8qIDEgKi8pIHsKICAgICAgICAgICAgRFdPUkQgbWF0SGFuZGxlID0gY2ktPnUyLmR3QXJnWzBdOwoKICAgICAgICAgICAgaWYoIW1hdEhhbmRsZSkgewogICAgICAgICAgICAgICAgRklYTUUoIiBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIGNhbGxlZCB3aXRoIE5VTEwgbWF0ZXJpYWwgISEhXG4iKTsKICAgICAgICAgICAgfSBlbHNlIGlmKG1hdEhhbmRsZSA+PSBscERldmljZS0+bnVtSGFuZGxlcykgewogICAgICAgICAgICAgICAgV0FSTigiTWF0ZXJpYWwgaGFuZGxlICVkIGlzIGludmFsaWRcbiIsIG1hdEhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZihscERldmljZS0+SGFuZGxlc1ttYXRIYW5kbGUgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdGVyaWFsKSB7CiAgICAgICAgICAgICAgICBXQVJOKCJIYW5kbGUgJWQgaXMgbm90IGEgbWF0ZXJpYWwgaGFuZGxlXG4iLCBtYXRIYW5kbGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICptYXQgPSAoSURpcmVjdDNETWF0ZXJpYWxJbXBsICopIGxwRGV2aWNlLT5IYW5kbGVzW21hdEhhbmRsZSAtIDFdLnB0cjsKICAgICAgICAgICAgICAgIG1hdC0+YWN0aXZhdGUobWF0KTsKCQkgICAgfQogICAgICAgICAgICB9CgkJICAgZWxzZSBpZiAoY2ktPnUxLmRsc3RMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX0NPTE9STU9ERUwgLyogMyAqLykgewoJCQlzd2l0Y2ggKGNpLT51Mi5kd0FyZ1swXSkgewoJCQkgICAgY2FzZSBEM0RDT0xPUl9NT05POgoJCQkgICAgICAgRVJSKCJERENPTE9SX01PTk8gc2hvdWxkIG5vdCBoYXBwZW4hXG4iKTsKCQkJICAgICAgIGJyZWFrOwoJCQkgICAgY2FzZSBEM0RDT0xPUl9SR0I6CgkJCSAgICAgICAvKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGlzIG1vZGUgKi8KCQkJICAgICAgIGJyZWFrOwoJCQkgICAgZGVmYXVsdDoKCQkgICAgICAgICAgICAgICBFUlIoIlVua25vd24gY29sb3IgbW9kZWwhXG4iKTsKCQkJfQoJCSAgICB9IGVsc2UgewoJCSAgICAJRDNEUkVOREVSU1RBVEVUWVBFIHJzID0gMDsKCQkgICAgCXN3aXRjaCAoY2ktPnUxLmRsc3RMaWdodFN0YXRlVHlwZSkgewoKCQkgICAgCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfQU1CSUVOVDogICAgICAgLyogMiAqLwoJCQkJcnMgPSBEM0RSRU5ERVJTVEFURV9BTUJJRU5UOwoJCQkJYnJlYWs7CQkKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dNT0RFOiAgICAgICAvKiA0ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1ZFUlRFWE1PREU7CgkJCQlicmVhazsKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dTVEFSVDogICAgICAvKiA1ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1NUQVJUOwoJCQkJYnJlYWs7CgkJCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HRU5EOiAgICAgICAgLyogNiAqLwoJCQkJcnMgPSBEM0RSRU5ERVJTVEFURV9GT0dFTkQ7CgkJCQlicmVhazsKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dERU5TSVRZOiAgICAvKiA3ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0RFTlNJVFk7CgkJCQlicmVhazsKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWDogICAvKiA4ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0NPTE9SVkVSVEVYOwoJCQkJYnJlYWs7CgkJCSAgICBkZWZhdWx0OgoJCQkJYnJlYWs7CgkJCX0KCQkJCgkJICAgICAgICBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlycyxjaS0+dTIuZHdBcmdbMF0pOwoJCSAgIH0KCgkJICAgaW5zdHIgKz0gc2l6ZTsKCQl9CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9TVEFURVJFTkRFUjogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU1RBVEVSRU5ERVIgICAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEU1RBVEUgY2kgPSAoTFBEM0RTVEFURSkgaW5zdHI7CgkJICAgIAoJCSAgICBJRGlyZWN0M0REZXZpY2UyX1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLCBJRGlyZWN0M0REZXZpY2UyKSwKCQkJCQkJICAgIGNpLT51MS5kcnN0UmVuZGVyU3RhdGVUeXBlLCBjaS0+dTIuZHdBcmdbMF0pOwoKCQkgICAgaW5zdHIgKz0gc2l6ZTsKCQl9CgkgICAgfSBicmVhazsKCiAgICAgICAgICAgIGNhc2UgRDNET1BfUFJPQ0VTU1ZFUlRJQ0VTOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBUT0RPOiBTaGFyZSBjb2RlIHdpdGggSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgYW5kIC8gb3IKICAgICAgICAgICAgICAgICAqIElXaW5lRDNERGV2aWNlOjpQcm9jZXNzVmVydGljZXMKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICBEM0RNQVRSSVggdmlld19tYXQsIHdvcmxkX21hdCwgcHJval9tYXQ7CiAgICAgICAgICAgICAgICBUUkFDRSgiUFJPQ0VTU1ZFUlRJQ0VTICAoJWQpXG4iLCBjb3VudCk7CgogICAgICAgICAgICAgICAgLyogR2V0IHRoZSB0cmFuc2Zvcm0gYW5kIHdvcmxkIG1hdHJpeCAqLwogICAgICAgICAgICAgICAgLyogTm90ZTogRDNETUFUUklYIGlzIGNvbXBhdGlibGUgd2l0aCBXSU5FRDNETUFUUklYICovCgogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKGxwRGV2aWNlLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1ZJRVcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTkVEM0RNQVRSSVgqKSAmdmlld19tYXQpOwoKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX0dldFRyYW5zZm9ybShscERldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgJnByb2pfbWF0KTsKCiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRTX1dPUkxETUFUUklYKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5FRDNETUFUUklYKikgJndvcmxkX21hdCk7CgoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEUFJPQ0VTU1ZFUlRJQ0VTIGNpID0gKExQRDNEUFJPQ0VTU1ZFUlRJQ0VTKSBpbnN0cjsKCiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiAgU3RhcnQgOiAlZCBEZXN0IDogJWQgQ291bnQgOiAlZFxuIiwKCQkJICBjaS0+d1N0YXJ0LCBjaS0+d0Rlc3QsIGNpLT5kd0NvdW50KTsKCQkgICAgVFJBQ0UoIiAgRmxhZ3MgOiAiKTsKCQkgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CgkJICAgICAgICBpZiAoY2ktPmR3RmxhZ3MgJiBEM0RQUk9DRVNTVkVSVElDRVNfQ09QWSkKCQkJICAgIFRSQUNFKCJDT1BZICIpOwoJCQlpZiAoY2ktPmR3RmxhZ3MgJiBEM0RQUk9DRVNTVkVSVElDRVNfTk9DT0xPUikKCQkJICAgIFRSQUNFKCJOT0NPTE9SICIpOwoJCQlpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX09QTUFTSykKCQkJICAgIFRSQUNFKCJPUE1BU0sgIik7CgkJCWlmIChjaS0+ZHdGbGFncyAmIEQzRFBST0NFU1NWRVJUSUNFU19UUkFOU0ZPUk0pCgkJCSAgICBUUkFDRSgiVFJBTlNGT1JNICIpOwoJCQlpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX1RSQU5TRk9STUxJR0hUKQoJCQkgICAgVFJBQ0UoIlRSQU5TRk9STUxJR0hUICIpOwoJCQlpZiAoY2ktPmR3RmxhZ3MgJiBEM0RQUk9DRVNTVkVSVElDRVNfVVBEQVRFRVhURU5UUykKCQkJICAgIFRSQUNFKCJVUERBVEVFWFRFTlRTICIpOwoJCQlUUkFDRSgiXG4iKTsKCQkgICAgfQoJCSAgICAKCQkgICAgLyogVGhpcyBpcyB3aGVyZSBkb2luZyBEaXJlY3QzRCBvbiB0b3Agb24gT3BlbkdMIGlzIHF1aXRlIGRpZmZpY3VsdC4KCQkgICAgICAgVGhpcyBtZXRob2QgdHJhbnNmb3JtcyBhIHNldCBvZiB2ZXJ0aWNlcyB1c2luZyB0aGUgQ1VSUkVOVCBzdGF0ZQoJCSAgICAgICAobGlnaHRpbmcsIHByb2plY3Rpb24sIC4uLikgYnV0IGRvZXMgbm90IHJhc3Rlcml6ZSB0aGVtLgoJCSAgICAgICBUaGV5IHdpbGwgb25seSBiZSBwdXQgb24gc2NyZWVuIGxhdGVyICh3aXRoIHRoZSBQT0lOVCAvIExJTkUgYW5kCgkJICAgICAgIFRSSUFOR0xFIG9wLWNvZGVzKS4gVGhlIHByb2JsZW0gaXMgdGhhdCB5b3UgY2FuIGhhdmUgYSB0cmlhbmdsZQoJCSAgICAgICB3aXRoIGVhY2ggcG9pbnQgaGF2aW5nIGJlZW4gdHJhbnNmb3JtZWQgdXNpbmcgYW5vdGhlciBzdGF0ZS4uLgoJCSAgICAgICAKCQkgICAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgSSB3aWxsIGVtdWxhdGUgb25seSBPTkUgdGhpbmcgOiBlYWNoCgkJICAgICAgIHZlcnRleCBjYW4gaGF2ZSBpdHMgb3duICJXT1JMRCIgdHJhbnNmb3JtYXRpb24gKHRoaXMgaXMgdXNlZCBpbiB0aGUKCQkgICAgICAgVFdJU1QuRVhFIGRlbW8gb2YgdGhlIDUuMiBTREspLiBJIHN1cHBvc2UgdGhhdCBhbGwgdmVydGljZXMgb2YgdGhlCgkJICAgICAgIGV4ZWN1dGUgYnVmZmVyIHVzZSB0aGUgc2FtZSBzdGF0ZS4KCQkgICAgICAgCgkJICAgICAgIElmIEkgZmluZCBhcHBsaWNhdGlvbnMgdGhhdCBjaGFuZ2Ugb3RoZXIgc3RhdGVzLCBJIHdpbGwgdHJ5IHRvIGRvIGEKCQkgICAgICAgbW9yZSAnZmluZS10dW5lZCcgc3RhdGUgZW11bGF0aW9uIChidXQgSSBtYXkgYmVjb21lIHF1aXRlIHRyaWNreSBpZgoJCSAgICAgICBpdCBjaGFuZ2VzIGEgbGlnaHQgcG9zaXRpb24gaW4gdGhlIG1pZGRsZSBvZiBhIHRyaWFuZ2xlKS4KCQkgICAgICAgCgkJICAgICAgIEluIHRoaXMgY2FzZSwgYSAnZGlyZWN0JyBhcHByb2FjaCAoaS5lLiB3aXRob3V0IHVzaW5nIE9wZW5HTCwgYnV0CgkJICAgICAgIHdyaXRpbmcgb3VyIG93biAzRCByYXN0ZXJpemVyKSB3b3VsZCBiZSBlYXNpZXIuICovCgkJICAgIAoJCSAgICAvKiBUaGUgY3VycmVudCBtZXRob2QgKHdpdGggdGhlIGh5cG90aGVzaXMgdGhhdCBvbmx5IHRoZSBXT1JMRCBtYXRyaXgKCQkgICAgICAgd2lsbCBjaGFuZ2UgYmV0d2VlbiB0d28gcG9pbnRzKSBpcyBsaWtlIHRoaXMgOgoJCSAgICAgICAtIEkgdHJhbnNmb3JtICdtYW51YWxseScgYWxsIHRoZSB2ZXJ0aWNlcyB3aXRoIHRoZSBjdXJyZW50IFdPUkxECgkJICAgICAgICAgbWF0cml4IGFuZCBzdG9yZSB0aGVtIGluIHRoZSB2ZXJ0ZXggYnVmZmVyCgkJICAgICAgIC0gZHVyaW5nIHRoZSByYXN0ZXJpemF0aW9uIHBoYXNlLCB0aGUgV09STEQgbWF0cml4IHdpbGwgYmUgc2V0IHRvCgkJICAgICAgICAgdGhlIElkZW50aXR5IG1hdHJpeCAqLwoJCSAgICAKCQkgICAgLyogRW5vdWdoIGZvciB0aGUgbW9tZW50ICovCgkJICAgIGlmIChjaS0+ZHdGbGFncyA9PSBEM0RQUk9DRVNTVkVSVElDRVNfVFJBTlNGT1JNTElHSFQpIHsKCQkgICAgICAgIHVuc2lnbmVkIGludCBuYjsKCQkJRDNEVkVSVEVYICAqc3JjID0gKChMUEQzRFZFUlRFWCkgICgoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgdnMpKSArIGNpLT53U3RhcnQ7CgkJCUQzRFRMVkVSVEVYICpkc3QgPSAoKExQRDNEVExWRVJURVgpIChUaGlzLT52ZXJ0ZXhfZGF0YSkpICsgY2ktPndEZXN0OwoJCQlEM0RNQVRSSVggbWF0OwoJCQlEM0RWSUVXUE9SVCogVmlld3BvcnQgPSAmbHBWaWV3cG9ydC0+dmlld3BvcnRzLnZwMTsKCQkJCgkJCWlmIChUUkFDRV9PTihkM2Q3KSkgewoJCQkgICAgVFJBQ0UoIiAgUHJvamVjdGlvbiBNYXRyaXggOiAoJXApXG4iLCAmcHJval9tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnByb2pfbWF0KTsKCQkJICAgIFRSQUNFKCIgIFZpZXcgICAgICAgTWF0cml4IDogKCVwKVxuIiwgJnZpZXdfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZ2aWV3X21hdCk7CgkJCSAgICBUUkFDRSgiICBXb3JsZCBNYXRyaXggOiAoJXApXG4iLCAmd29ybGRfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZ3b3JsZF9tYXQpOwoJCQl9CgogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmdmlld19tYXQsJndvcmxkX21hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5X21hdHJpeCgmbWF0LCZwcm9qX21hdCwmbWF0KTsKCgkJCWZvciAobmIgPSAwOyBuYiA8IGNpLT5kd0NvdW50OyBuYisrKSB7CgkJCSAgICAvKiBObyBsaWdodGluZyB5ZXQgKi8KCQkJICAgIGRzdC0+dTUuY29sb3IgPSAweEZGRkZGRkZGOyAvKiBPcGFxdWUgd2hpdGUgKi8KCQkJICAgIGRzdC0+dTYuc3BlY3VsYXIgPSAweEZGMDAwMDAwOyAvKiBObyBzcGVjdWxhciBhbmQgbm8gZm9nIGZhY3RvciAqLwoKCQkJICAgIGRzdC0+dTcudHUgID0gc3JjLT51Ny50dTsKCQkJICAgIGRzdC0+dTgudHYgID0gc3JjLT51OC50djsKCgkJCSAgICAvKiBOb3csIHRoZSBtYXRyaXggbXVsdGlwbGljYXRpb24gKi8KCQkJICAgIGRzdC0+dTEuc3ggPSAoc3JjLT51MS54ICogbWF0Ll8xMSkgKyAoc3JjLT51Mi55ICogbWF0Ll8yMSkgKyAoc3JjLT51My56ICogbWF0Ll8zMSkgKyAoMS4wICogbWF0Ll80MSk7CgkJCSAgICBkc3QtPnUyLnN5ID0gKHNyYy0+dTEueCAqIG1hdC5fMTIpICsgKHNyYy0+dTIueSAqIG1hdC5fMjIpICsgKHNyYy0+dTMueiAqIG1hdC5fMzIpICsgKDEuMCAqIG1hdC5fNDIpOwoJCQkgICAgZHN0LT51My5zeiA9IChzcmMtPnUxLnggKiBtYXQuXzEzKSArIChzcmMtPnUyLnkgKiBtYXQuXzIzKSArIChzcmMtPnUzLnogKiBtYXQuXzMzKSArICgxLjAgKiBtYXQuXzQzKTsKCQkJICAgIGRzdC0+dTQucmh3ID0gKHNyYy0+dTEueCAqIG1hdC5fMTQpICsgKHNyYy0+dTIueSAqIG1hdC5fMjQpICsgKHNyYy0+dTMueiAqIG1hdC5fMzQpICsgKDEuMCAqIG1hdC5fNDQpOwoKCQkJICAgIGRzdC0+dTEuc3ggPSBkc3QtPnUxLnN4IC8gZHN0LT51NC5yaHcgKiBWaWV3cG9ydC0+ZHZTY2FsZVgKCQkJCSAgICAgICArIFZpZXdwb3J0LT5kd1ggKyBWaWV3cG9ydC0+ZHdXaWR0aCAvIDI7CgkJCSAgICBkc3QtPnUyLnN5ID0gKC1kc3QtPnUyLnN5KSAvIGRzdC0+dTQucmh3ICogVmlld3BvcnQtPmR2U2NhbGVZCgkJCQkgICAgICAgKyBWaWV3cG9ydC0+ZHdZICsgVmlld3BvcnQtPmR3SGVpZ2h0IC8gMjsKCQkJICAgIGRzdC0+dTMuc3ogLz0gZHN0LT51NC5yaHc7CgkJCSAgICBkc3QtPnU0LnJodyA9IDEgLyBkc3QtPnU0LnJodzsKCgkJCSAgICBzcmMrKzsKCQkJICAgIGRzdCsrOwoJCQkgICAgCgkJCX0KCQkgICAgfSBlbHNlIGlmIChjaS0+ZHdGbGFncyA9PSBEM0RQUk9DRVNTVkVSVElDRVNfVFJBTlNGT1JNKSB7CgkJICAgICAgICB1bnNpZ25lZCBpbnQgbmI7CgkJCUQzRExWRVJURVggKnNyYyAgPSAoKExQRDNETFZFUlRFWCkgKChjaGFyICopVGhpcy0+ZGVzYy5scERhdGEgKyB2cykpICsgY2ktPndTdGFydDsKCQkJRDNEVExWRVJURVggKmRzdCA9ICgoTFBEM0RUTFZFUlRFWCkgKFRoaXMtPnZlcnRleF9kYXRhKSkgKyBjaS0+d0Rlc3Q7CgkJCUQzRE1BVFJJWCBtYXQ7CgkJCUQzRFZJRVdQT1JUKiBWaWV3cG9ydCA9ICZscFZpZXdwb3J0LT52aWV3cG9ydHMudnAxOwoJCQkKCQkJaWYgKFRSQUNFX09OKGQzZDcpKSB7CgkJCSAgICBUUkFDRSgiICBQcm9qZWN0aW9uIE1hdHJpeCA6ICglcClcbiIsICZwcm9qX21hdCk7CgkJCSAgICBkdW1wX0QzRE1BVFJJWCgmcHJval9tYXQpOwoJCQkgICAgVFJBQ0UoIiAgVmlldyAgICAgICBNYXRyaXggOiAoJXApXG4iLCZ2aWV3X21hdCk7CgkJCSAgICBkdW1wX0QzRE1BVFJJWCgmdmlld19tYXQpOwoJCQkgICAgVFJBQ0UoIiAgV29ybGQgTWF0cml4IDogKCVwKVxuIiwgJndvcmxkX21hdCk7CgkJCSAgICBkdW1wX0QzRE1BVFJJWCgmd29ybGRfbWF0KTsKCQkJfQoKCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsJnZpZXdfbWF0LCZ3b3JsZF9tYXQpOwoJCQltdWx0aXBseV9tYXRyaXgoJm1hdCwmcHJval9tYXQsJm1hdCk7CgoJCQlmb3IgKG5iID0gMDsgbmIgPCBjaS0+ZHdDb3VudDsgbmIrKykgewoJCQkgICAgZHN0LT51NS5jb2xvciA9IHNyYy0+dTQuY29sb3I7CgkJCSAgICBkc3QtPnU2LnNwZWN1bGFyID0gc3JjLT51NS5zcGVjdWxhcjsKCQkJICAgIGRzdC0+dTcudHUgPSBzcmMtPnU2LnR1OwoJCQkgICAgZHN0LT51OC50diA9IHNyYy0+dTcudHY7CgkJCSAgICAKCQkJICAgIC8qIE5vdywgdGhlIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiAqLwoJCQkgICAgZHN0LT51MS5zeCA9IChzcmMtPnUxLnggKiBtYXQuXzExKSArIChzcmMtPnUyLnkgKiBtYXQuXzIxKSArIChzcmMtPnUzLnogKiBtYXQuXzMxKSArICgxLjAgKiBtYXQuXzQxKTsKCQkJICAgIGRzdC0+dTIuc3kgPSAoc3JjLT51MS54ICogbWF0Ll8xMikgKyAoc3JjLT51Mi55ICogbWF0Ll8yMikgKyAoc3JjLT51My56ICogbWF0Ll8zMikgKyAoMS4wICogbWF0Ll80Mik7CgkJCSAgICBkc3QtPnUzLnN6ID0gKHNyYy0+dTEueCAqIG1hdC5fMTMpICsgKHNyYy0+dTIueSAqIG1hdC5fMjMpICsgKHNyYy0+dTMueiAqIG1hdC5fMzMpICsgKDEuMCAqIG1hdC5fNDMpOwoJCQkgICAgZHN0LT51NC5yaHcgPSAoc3JjLT51MS54ICogbWF0Ll8xNCkgKyAoc3JjLT51Mi55ICogbWF0Ll8yNCkgKyAoc3JjLT51My56ICogbWF0Ll8zNCkgKyAoMS4wICogbWF0Ll80NCk7CgoJCQkgICAgZHN0LT51MS5zeCA9IGRzdC0+dTEuc3ggLyBkc3QtPnU0LnJodyAqIFZpZXdwb3J0LT5kdlNjYWxlWAoJCQkJICAgICAgICsgVmlld3BvcnQtPmR3WCArIFZpZXdwb3J0LT5kd1dpZHRoIC8gMjsKCQkJICAgIGRzdC0+dTIuc3kgPSAoLWRzdC0+dTIuc3kpIC8gZHN0LT51NC5yaHcgKiBWaWV3cG9ydC0+ZHZTY2FsZVkKCQkJCSAgICAgICArIFZpZXdwb3J0LT5kd1kgKyBWaWV3cG9ydC0+ZHdIZWlnaHQgLyAyOwoKCQkJICAgIGRzdC0+dTMuc3ogLz0gZHN0LT51NC5yaHc7CgkJCSAgICBkc3QtPnU0LnJodyA9IDEgLyBkc3QtPnU0LnJodzsKCgkJCSAgICBzcmMrKzsKCQkJICAgIGRzdCsrOwoJCQl9CgkJICAgIH0gZWxzZSBpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX0NPUFkpIHsKCQkgICAgICAgIEQzRFRMVkVSVEVYICpzcmMgPSAoKExQRDNEVExWRVJURVgpICgoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgdnMpKSArIGNpLT53U3RhcnQ7CgkJCUQzRFRMVkVSVEVYICpkc3QgPSAoKExQRDNEVExWRVJURVgpIChUaGlzLT52ZXJ0ZXhfZGF0YSkpICsgY2ktPndEZXN0OwoJCQkKCQkJbWVtY3B5KGRzdCwgc3JjLCBjaS0+ZHdDb3VudCAqIHNpemVvZihEM0RUTFZFUlRFWCkpOwoJCSAgICB9IGVsc2UgewoJCSAgICAgICAgRVJSKCJVbmhhbmRsZWQgdmVydGV4IHByb2Nlc3NpbmcgIVxuIik7CgkJICAgIH0KCgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfVEVYVFVSRUxPQUQ6IHsKCSAgICAgICAgV0FSTigiVEVYVFVSRUxPQUQtcyAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX0VYSVQ6IHsKCSAgICAgICAgVFJBQ0UoIkVYSVQgICAgICAgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCS8qIFdlIGRpZCB0aGlzIGluc3RydWN0aW9uICovCgkJaW5zdHIgKz0gc2l6ZTsKCQkvKiBFeGl0IHRoaXMgbG9vcCAqLwoJCWdvdG8gZW5kX29mX2J1ZmZlcjsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX0JSQU5DSEZPUldBUkQ6IHsKCSAgICAgICAgaW50IGk7CgkJVFJBQ0UoIkJSQU5DSEZPUldBUkQgICAgKCVkKVxuIiwgY291bnQpOwoKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCSAgICBMUEQzREJSQU5DSCBjaSA9IChMUEQzREJSQU5DSCkgaW5zdHI7CgoJCSAgICBpZiAoKFRoaXMtPmRhdGEuZHNTdGF0dXMuZHdTdGF0dXMgJiBjaS0+ZHdNYXNrKSA9PSBjaS0+ZHdWYWx1ZSkgewoJCSAgICAgICAgaWYgKCFjaS0+Yk5lZ2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiBCcmFuY2ggdG8gJWRcbiIsIGNpLT5kd09mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ktPmR3T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHIgPSAoY2hhciopY3VycmVudCArIGNpLT5kd09mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJfQoJCSAgICB9IGVsc2UgewoJCSAgICAgICAgaWYgKGNpLT5iTmVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiIEJyYW5jaCB0byAlZFxuIiwgY2ktPmR3T2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaS0+ZHdPZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ciA9IChjaGFyKiljdXJyZW50ICsgY2ktPmR3T2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQl9CgkJICAgIH0KCgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfU1BBTjogewoJICAgICAgICBXQVJOKCJTUEFOLXMgICAgICAgICAgICglZClcbiIsIGNvdW50KTsKCgkJaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfU0VUU1RBVFVTOiB7CgkgICAgICAgIGludCBpOwoJCVRSQUNFKCJTRVRTVEFUVVMgICAgICAgICglZClcbiIsIGNvdW50KTsKCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFUVVMgY2kgPSAoTFBEM0RTVEFUVVMpIGluc3RyOwoJCSAgICAKCQkgICAgVGhpcy0+ZGF0YS5kc1N0YXR1cyA9ICpjaTsKCgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGRlZmF1bHQ6CgkgICAgICAgIEVSUigiVW5oYW5kbGVkIE9wQ29kZSAlZCAhISFcbiIsY3VycmVudC0+Yk9wY29kZSk7CgkgICAgICAgIC8qIFRyeSB0byBzYXZlIC4uLiAqLwoJICAgICAgICBpbnN0ciArPSBjb3VudCAqIHNpemU7CgkgICAgICAgIGJyZWFrOwoJfQogICAgfQoKZW5kX29mX2J1ZmZlcjoKICAgIDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlF1ZXJ5SW50ZXJmYWNlCiAqCiAqIFdlbGwsIGEgdXN1YWwgUXVlcnlJbnRlcmZhY2UgZnVuY3Rpb24uIERvbid0IGtub3cgZnVyIHN1cmUgd2hpY2gKICogaW50ZXJmYWNlcyBpdCBjYW4gUXVlcnkuCiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IFRoZSBpbnRlcmZhY2UgSUQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgaW4gY2FzZSBvZiBhIHN1Y2Nlc3MgKFNfT0s/IFRoaW5rIGl0J3MgdGhlIHNhbWUpCiAqICBPTEVfRV9FTlVNX05PTU9SRSBpZiB0aGUgaW50ZXJmYWNlIHdhc24ndCBmb3VuZC4KICogICAoRV9OT0lOVEVSRkFDRT8/IERvbid0IGtub3cgd2hhdCBJIHJlYWxseSBuZWVkKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwLyVwKS0+KCVzLCVwKVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CgogICAgKm9iaiA9IE5VTEw7CgogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKSk7Cgkqb2JqID0gaWZhY2U7CglUUkFDRSgiICBDcmVhdGluZyBJVW5rbm93biBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKCXJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbCwgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpKTsKICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7CglUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGludGVyZmFjZSAlcFxuIiwgKm9iaik7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkFkZFJlZgogKgogKiBBIG5vcm1hbCBBZGRSZWYgbWV0aG9kLCBub3RoaW5nIHNwZWNpYWwKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0FkZFJlZihJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIEZJWE1FKCIoJXApLT4oKWluY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmIC0gMSk7CgogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlJlbGVhc2UKICoKICogQSBub3JtYWwgUmVsZWFzZSBtZXRob2QsIG5vdGhpbmcgc3BlY2lhbAogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUmVsZWFzZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApLT4oKWRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpIHsKICAgICAgICBpZiAoVGhpcy0+bmVlZF9mcmVlKQoJICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzLT5kZXNjLmxwRGF0YSk7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPnZlcnRleF9kYXRhKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+aW5kaWNlcyk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7CglyZXR1cm4gMDsKICAgIH0KCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6SW5pdGlhbGl6ZQogKgogKiBJbml0aWFsaXplcyB0aGUgRXhlY3V0ZSBCdWZmZXIuIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgQ09NIGNvbXBsaWFuY2UKICogTm90aGluZyB0byBkbyBoZXJlLgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0luaXRpYWxpemUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UgKmxwRGlyZWN0M0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RFWEVDVVRFQlVGRkVSREVTQyAqbHBEZXNjKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgbm8tb3AuLi4uXG4iLCBUaGlzLCBscERpcmVjdDNERGV2aWNlLCBscERlc2MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkxvY2sKICoKICogTG9ja3MgdGhlIGJ1ZmZlciwgc28gdGhlIGFwcCBjYW4gd3JpdGUgaW50byBpdC4KICoKICogUGFyYW1zOgogKiAgRGVzYzogUG9pbnRlciB0byByZXR1cm4gdGhlIGJ1ZmZlciBkZXNjcmlwdGlvbi4gVGhpcyBEZXNjcmlwdGlvbiBjb250YWlucwogKiAgICAgICAgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZGF0YS4KICoKICogUmV0dXJuczoKICogIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0xvY2soSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERlc2MpOwoKICAgIGR3U2l6ZSA9IGxwRGVzYy0+ZHdTaXplOwogICAgbWVtc2V0KGxwRGVzYywgMCwgZHdTaXplKTsKICAgIG1lbWNweShscERlc2MsICZUaGlzLT5kZXNjLCBkd1NpemUpOwogICAgCiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiICBSZXR1cm5pbmcgZGVzY3JpcHRpb24gOlxuIik7CglfZHVtcF9EM0RFWEVDVVRFQlVGRkVSREVTQyhscERlc2MpOwogICAgfQogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlVubG9jawogKgogKiBVbmxvY2tzIHRoZSBidWZmZXIuIFdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gaGVyZQogKgogKiBSZXR1cm5zOgogKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBEM0RfT0sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVW5sb2NrKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIG5vLW9wLi4uXG4iLCBUaGlzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpTZXRFeGVjdXRlRGF0YQogKgogKiBTZXRzIHRoZSBleGVjdXRlIGRhdGEuIFRoaXMgZGF0YSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBidWZmZXIncyBjb250ZW50CiAqCiAqIFBhcmFtczoKICogIERhdGE6IFBvaW50ZXIgdG8gYSBEM0RFWEVDVVRFREFUQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGF0YSB0bwogKiAgYXNzaWduCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgdGhlIHZlcnRleCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfU2V0RXhlY3V0ZURhdGEoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVEQVRBICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBEV09SRCBuYnZlcnQ7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEYXRhKTsKCiAgICBtZW1jcHkoJlRoaXMtPmRhdGEsIGxwRGF0YSwgbHBEYXRhLT5kd1NpemUpOwoKICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGluIHRoZSBleGVjdXRlIGJ1ZmZlciAqLwogICAgbmJ2ZXJ0ID0gVGhpcy0+ZGF0YS5kd1ZlcnRleENvdW50OwogICAgCiAgICAvKiBQcmVwYXJlcyB0aGUgdHJhbnNmb3JtZWQgdmVydGV4IGJ1ZmZlciAqLwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dmVydGV4X2RhdGEpOwogICAgVGhpcy0+dmVydGV4X2RhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbmJ2ZXJ0ICogc2l6ZW9mKEQzRFRMVkVSVEVYKSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgX2R1bXBfZXhlY3V0ZWRhdGEobHBEYXRhKTsKICAgIH0KCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6R2V0RXhlY3V0ZURhdGEKICoKICogUmV0dXJucyB0aGUgZGF0YSBpbiB0aGUgZXhlY3V0ZSBidWZmZXIKICoKICogUGFyYW1zOgogKiAgRGF0YTogUG9pbnRlciB0byBhIEQzREVYRUNVVEVEQVRBIHN0cnVjdHVyZSB1c2VkIHRvIHJldHVybiBkYXRhCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9HZXRFeGVjdXRlRGF0YShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURURBVEEgKmxwRGF0YSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApOiBzdHViIVxuIiwgVGhpcywgbHBEYXRhKTsKCiAgICBkd1NpemUgPSBscERhdGEtPmR3U2l6ZTsKICAgIG1lbXNldChscERhdGEsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBEYXRhLCAmVGhpcy0+ZGF0YSwgZHdTaXplKTsKCiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiUmV0dXJuaW5nIGRhdGEgOlxuIik7CglfZHVtcF9leGVjdXRlZGF0YShscERhdGEpOwogICAgfQoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlZhbGlkYXRlCiAqCiAqIERpcmVjdFggNSBTREs6ICJUaGUgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6VmFsaWRhdGUgbWV0aG9kIGlzIG5vdAogKiBjdXJyZW50bHkgaW1wbGVtZW50ZWQiCiAqCiAqIFBhcmFtczoKICogID8KICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVELCBiZWNhdXNlIGl0J3Mgbm90IGltcGxlbWVudGVkIGluIFdpbmRvd3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1ZhbGlkYXRlKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZBTElEQVRFQ0FMTEJBQ0sgRnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVXNlckFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgUmVzZXJ2ZWQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCUwOHgpOiBVbmltcGxlbWVudGVkIVxuIiwgVGhpcywgT2Zmc2V0LCBGdW5jLCBVc2VyQXJnLCBSZXNlcnZlZCk7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIFVuY2hlY2tlZCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6T3B0aW1pemUKICoKICogRGlyZWN0WDUgU0RLOiAiVGhlIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6Ok9wdGltaXplIG1ldGhvZCBpcyBub3QKICogY3VycmVudGx5IHN1cHBvcnRlZCIKICoKICogUGFyYW1zOgogKiAgRHVtbXk6IFNlZW1zIHRvIGJlIGFuIHVudXNlZCBkdW1teSA7KQogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfVU5TVVBQT1JURUQsIGJlY2F1c2UgaXQncyBub3QgaW1wbGVtZW50ZWQgaW4gV2luZG93cy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfT3B0aW1pemUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIER1bW15KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDh4KTogVW5pbXBsZW1lbnRlZFxuIiwgVGhpcywgRHVtbXkpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiBVbmNoZWNrZWQgKi8KfQoKY29uc3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlclZ0YmwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcl9WdGJsID0KewogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9SZWxlYXNlLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfSW5pdGlhbGl6ZSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0xvY2ssCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9VbmxvY2ssCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9TZXRFeGVjdXRlRGF0YSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0dldEV4ZWN1dGVEYXRhLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVmFsaWRhdGUsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9PcHRpbWl6ZSwKfTsK