LyoKICogV2luZWZpbGUKICogR2VybWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU4KCi8qIE1lbnUgKi8KCklETV9XSU5FRklMRSBNRU5VIEZJWEVEIElNUFVSRQp7CglQT1BVUCAiJkRhdGVpIiAgewoJCU1FTlVJVEVNICLWJmZmbmVuXHRFaW5nYWJldGFzdGUiICwJCTEwMQoJCU1FTlVJVEVNICImVmVyc2NoaWViZW4uLi5cdEY3IiAsIAkJSURfRklMRV9NT1ZFCgkJTUVOVUlURU0gIiZLb3BpZXJlbi4uLlx0RjgiICwJCQkxMDcKCQlNRU5VSVRFTSAiJkluIFp3aXNjaGVuYWJsYWdlLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZM9nNjaGVuXHRFbnRmIiAsCQkJMTA4CgkJTUVOVUlURU0gIiZVbWJlbmVubmVuLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIiZFaWdlbnNjaGFmdGVuLi4uXHRBbHQrRWluZ2FiZXRhc3RlIiAsIElEX0VESVRfUFJPUEVSVElFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJLJm9tcHJpbWllcmVuLi4uIiAsCQkxMTkKCQlNRU5VSVRFTSAiRGVrbyZtcHJpbWllcmVuLi4uIiAsCQkxMjAKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkF1c2b8aHJlbi4uLiIgLAkJCUlEX0VYRUNVVEUKCQlNRU5VSVRFTSAiJkRydWNrZW4uLi4iICwgCQkJMTAyCgkJTUVOVUlURU0gIlp1b3JkJm5lbi4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlZlciZ6ZWljaG5pcyBlcnN0ZWxsZW4uLi4iICwJCQkxMTEKCQlNRU5VSVRFTSAiJlN1Y2hlbi4uLiIgLAkJCTEwNAoJCU1FTlVJVEVNICJEYXRlaWVuIGF1cyZ35GhsZW4uLi4iICwJCQkxMTYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICImQmVlbmRlblx0QWx0K1giICwgCQkJSURfRklMRV9FWElUCiNlbHNlCgkJTUVOVUlURU0gIiZCZWVuZGVuIiAsIAkJCUlEX0ZJTEVfRVhJVAojZW5kaWYKCX0KCglQT1BVUCAiRGEmdGVudHLkZ2VyIiAgewoJCU1FTlVJVEVNICJEYXRlbnRy5GdlciAma29waWVyZW4uLi4iICwJCQkyMDEKCQlNRU5VSVRFTSAiRGF0ZW50cuRnZXIgJmJlbmVubmVuLi4uIiAsCQkJMjAyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkRhdGVudHLkZ2VyICZmb3JtYXRpZXJlbi4uLiIgLAkJCTIwMwojaWZkZWYgX1dJTjk1CgkJTUVOVUlURU0gIi4uLiIsCQkJLTEJLypAQCAqLwojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiTmV0endlcmtsYXVmd2VyayAmdmVyYmluZGVuLi4uIiAsCQkJMjUyCgkJTUVOVUlURU0gIk5ldHp3ZXJrbGF1ZndlcmsgJnRyZW5uZW4uLi4iICwJCTI1MwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJGJnJlaWdlYmVuIGFscy4uLiIgLAkJCTI1NAoJCU1FTlVJVEVNICJGcmVpZ2FiZSBiZWVuJmRlbi4uLiIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJMYXVmd2VyayBhdXMmd+RobGVuLi4uIiAsCQkJMjUxCgl9CgoKCVBPUFVQICImVmVyemVpY2huaXNzZSIgIHsKCQlNRU5VSVRFTSAiJk7kY2hzdGUgRWJlbmUgZWluYmxlbmRlblx0KyIgLAkJCTMwMQoJCU1FTlVJVEVNICImWndlaWcgZWluYmxlbmRlblx0KiIgLAkJMzAyCgkJTUVOVUlURU0gIkFsbGUgJkViZW5lbiBlaW5ibGVuZGVuXHRTdHJnKyoiICwJCTMwMwoJCU1FTlVJVEVNICJad2VpZyAmYXVzYmxlbmRlblx0LSIgLAkJCTMwNAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVmVyendlaWd1bmdlbiBrZW5uemVpY2huZW4iICwJCQkJNTA1Cgl9CgoJUE9QVVAgIiZBbnNpY2h0IiAgewoJCU1FTlVJVEVNICJTdHJ1a3R1ciAmdW5kIFZlcnplaWNobmlzIiAsCQkJNDEzCgkJTUVOVUlURU0gIk51ciBTdCZydWt0dXIiICwJCQk0MTEKCQlNRU5VSVRFTSAiTnVyICZWZXJ6ZWljaG5pcyIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVGVpbGVuIiAsCQkJNDE0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZOYW1lIiAsCQkJSURfVklFV19OQU1FCgkJTUVOVUlURU0gIkEmbGxlIERhdGVpYW5nYWJlbiIgLAkJCQlJRF9WSUVXX0FMTF9BVFRSSUJVVEVTLCBDSEVDS0VECgkJTUVOVUlURU0gIiZCZXN0aW1tdGUgRGF0ZWlhbmdhYmVuLi4uIiAsCQkJSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk5hY2ggTiZhbWUiICwJCTQwNAoJCU1FTlVJVEVNICJOYWNoIFQmeXAiICwJCTQwNQoJCU1FTlVJVEVNICJOYWNoICZHcvbfZSIgLCAJCTQwNgoJCU1FTlVJVEVNICJOYWNoICZEYXR1bSIgLCAJCTQwNwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJBbmdhYmVuIGF1c3cm5GhsZW4uLi4iICwJCQk0MDkKCX0KCglQT1BVUCAiJk9wdGlvbmVuIiAgewoJCU1FTlVJVEVNICImQmVzdOR0aWdlbi4uLiIgLAkJLTEKCQlNRU5VSVRFTSAiU2NocmlmdCZhcnQuLi4iICwgICAJCUlEX1NFTEVDVF9GT05UCgkJTUVOVUlURU0gIlN5bWJvbGxlaXN0ZSAmZGVmaW5pZXJlbi4uLiIgLCAtMQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJTeSZtYm9sbGVpc3RlIiAsCQlJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIkxhdWYmd2Vya2xlaXN0ZSIgLAkJSURfVklFV19EUklWRV9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiJlN0YXR1c2xlaXN0ZSIgLAlJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIlZvbGxiJmlsZFx0U3RyZytVbXNjaGFsdCtTIiAsIAlJRF9WSUVXX0ZVTExTQ1JFRU4KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZTeW1ib2wgbmFjaCBQcm9ncmFtbXN0YXJ0IiAsCQktMQoJCU1FTlVJVEVNICImRWluc3RlbGx1bmdlbiBiZWltIEJlZW5kZW4gc3BlaWNoZXJuIiAsCQkJNTExCgl9CgoJUE9QVVAgIiZTaWNoZXJoZWl0IiAgewoJCU1FTlVJVEVNICImQmVyZWNodGlndW5nZW4uLi4iICwJCTYwNQoJCU1FTlVJVEVNICLcYmVyJndhY2hlbi4uLiIgLAkJCTYwNgoJCU1FTlVJVEVNICJCZXNpJnR6ZXIuLi4iICwJCTYwNwoJfQoKCVBPUFVQICImRmVuc3RlciIgIHsKCQlNRU5VSVRFTSAiTmV1ZXMgJkZlbnN0ZXIiICwJCQlJRF9XSU5ET1dfTkVXCgkJTUVOVUlURU0gItxiZXImbGFwcGVuZFx0VW1zY2hhbHQrRjUiICwJCUlEX1dJTkRPV19DQVNDQURFCgkJTUVOVUlURU0gIiZVbnRlcmVpbmFuZGVyIiAsCQlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIiZOZWJlbmVpbmFuZGVyXHRVbXNjaGFsdCtGNCIgLAkJSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gImF1JnRvbWF0aXNjaCBhbm9yZG5lbiIgLAkJSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgoJCU1FTlVJVEVNICImU3ltYm9sZSBhbm9yZG5lbiIgLAkJSURfV0lORE9XX0FSUkFOR0UKCQlNRU5VSVRFTSAiJkFrdHVhbGlzaWVyZW5cdEY1IiAsCQlJRF9SRUZSRVNICgl9CgoJUE9QVVAgIiY/IiAgewoJCU1FTlVJVEVNICImSGlsZmV0aGVtZW5cdEYxIiAsCQkJSURfSEVMUAoJCU1FTlVJVEVNICImU3VjaGVuLi4uXHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiSGlsZmUgJnZlcndlbmRlblx0RjEiICwJCQlJRF9IRUxQX1VTSU5HCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJUE9QVVAgIkluZiZvLi4uIiAgewoJCSAgTUVOVUlURU0gIkluZm8g/GJlciAmV2luZS4uLiIgLAkJCUlEX0FCT1VUX1dJTkUKLyoKICoJCSAgTUVOVUlURU0gIiZMaXplbnoiCQlJRF9MSUNFTlNFCiAqCQkgIE1FTlVJVEVNICImS0VJTkUgR0FSQU5USUUiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJBdXNm/GhyZW4iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJQ09OVFJPTCAJCSIiLCAxMDEsICJTdGF0aWMiLCBTU19TSU1QTEV8U1NfTk9QUkVGSVgsIDMsIDYsIDE2MiwgMTAKCUNPTlRST0wgCQkiQmVmZWhscyZ6ZWlsZToiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglDT05UUk9MIAkJIkFscyAmU3ltYm9sIiAsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKCURFRlBVU0hCVVRUT04JIk9LIiAsIDEsIDE1OCwgNiwgNDcsIDE0CglQVVNIQlVUVE9OCQkiQWJicmVjaGVuIiAsIDIsIDE1OCwgMjMsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIiZIaWxmZSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpJRERfU0VMRUNUX0RFU1RJTkFUSU9OIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlppZWwgYXVzd+RobGVuIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIiZWZXJ6ZWljaG5pczoiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglERUZQVVNIQlVUVE9OCQkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJBYmJyZWNoZW4iICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJkR1cmNoc3VjaGVuIiAsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0KClNUUklOR1RBQkxFCnsKCUlEU19GT05UX1NFTF9ETEdfTkFNRQkiQW53ZW5kZW4gZGVyIFNjaHJpZnRhcnRlaW5zdGVsbHVuZyIKCUlEU19GT05UX1NFTF9FUlJPUgkiRmVobGVyIHfkaHJlbmQgZGVyIFNjaHJpZnRhcnQtQXVzd2FobC4iCn0KClNUUklOR1RBQkxFCnsKIElEU19XSU5FRklMRSAiV2luZWZpbGUiCiBJRFNfRVJST1IgICJGZWhsZXIiCiBJRFNfUk9PVF9GUyAgInJvb3QgZnMiCiBJRFNfVU5JWEZTICAidW5peGZzIgogSURTX0RFU0tUT1AgICJEZXNrdG9wIgogSURTX1NIRUxMICAiU2hlbGwiCiBJRFNfVElUTEVGTVQgIiVzIC0gJXMiCiBJRFNfTk9fSU1QTCAgIk5vY2ggbmljaHQgaW1wbGVtZW50aWVydCIKIElEU19XSU5FICAiV0lORSIKIElEU19XSU5FX0ZJTEUgIldpbmUgRmlsZSIKfQoKU1RSSU5HVEFCTEUKewogSURTX0NPTF9OQU1FICJOYW1lIgogSURTX0NPTF9TSVpFICJHcvbfZSIKIElEU19DT0xfQ0RBVEUgIkNEYXR1bSIKIElEU19DT0xfQURBVEUgIlpEYXR1bSIKIElEU19DT0xfTURBVEUgIsREYXR1bSIKIElEU19DT0xfSURYICAiSW5kZXgvSW5vZGUiCiBJRFNfQ09MX0xJTktTICJMaW5rcyIKIElEU19DT0xfQVRUUiAiQXR0cmlidXRlIgogSURTX0NPTF9TRUMgICJTaWNoZXJoZWl0Igp9Cg==