ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9tc2diLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9tc2diLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yc2wuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS5wYy5pbiBiL2xpYm9zbW9jb3JlL2xpYm9zbW9jb3JlLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJvc21vY29yZS5wYy5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4KZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3NyYy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3NyYy9iaXR2ZWMuYyBiL2xpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2JpdHZlYy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvYml0dmVjLmMKZGlmZiAtLWdpdCBhL3NyYy9jb21wMTI4LmMgYi9saWJvc21vY29yZS9zcmMvY29tcDEyOC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29tcDEyOC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvY29tcDEyOC5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtNDguYyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZ3NtNDguYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKZGlmZiAtLWdpdCBhL3NyYy9nc200OF9pZS5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4X2llLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc200OF9pZS5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbV91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZ3NtX3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYwpkaWZmIC0tZ2l0IGEvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9tc2diLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9tc2diLmMKZGlmZiAtLWdpdCBhL3NyYy9yc2wuYyBiL2xpYm9zbW9jb3JlL3NyYy9yc2wuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3JzbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnNsLmMKZGlmZiAtLWdpdCBhL3NyYy9yeGxldl9zdGF0LmMgYi9saWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnhsZXZfc3RhdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCmRpZmYgLS1naXQgYS9zcmMvc2VsZWN0LmMgYi9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zZWxlY3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jCmRpZmYgLS1naXQgYS9zcmMvc2lnbmFsLmMgYi9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zaWduYWwuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCmRpZmYgLS1naXQgYS9zcmMvc3RhdGlzdGljcy5jIGIvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXRpc3RpY3MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGFsbG9jLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90YWxsb2MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RpbWVyLmMgYi9saWJvc21vY29yZS9zcmMvdGltZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RpbWVyLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90aW1lci5jCmRpZmYgLS1naXQgYS9zcmMvdGx2X3BhcnNlci5jIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3Rsdl9wYXJzZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvd3JpdGVfcXVldWUuYyBiL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvd3JpdGVfcXVldWUuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL3Ntc190ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL3Ntc190ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCkBAIC0wLDAgKzEsMTQ0IEBACitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEyLTIzIDE2OjE2OjI5LjAwMDAwMDAwMCArMDEwMAorQEAgLTk0LDggKzk0LDEwIEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAl2YV9saXN0IHZhOworIAorKyNpZiAwCisgCWlmICghKCpkZWJ1ZyAmIERFQlVHX0wyX0ZTTSkpCisgCQlyZXR1cm47CisrI2VuZGlmCisgCXZhX3N0YXJ0KHZhLCBmbXQpOworIAlwcmludGsoS0VSTl9ERUJVRyAibDIgKHRlaSAlZCk6ICIsIGwyLT50ZWkpOworIAl2cHJpbnRrKGZtdCwgdmEpOworQEAgLTg4Miw2ICs4ODQsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCWNsZWFyX2V4Y2VwdGlvbihsMik7CisgCXNlbmRfdWZyYW1lKGwyLCBOVUxMLCBVQSB8IGdldF9Qb2xsRmxhZyhsMiwgc2tiKSwgUlNQKTsKKyAJbUlTRE5fRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOworQEAgLTg5OCw2ICs5MDIsNyBAQAorIAlzdHJ1Y3QgbGF5ZXIyICpsMiA9IGZpLT51c2VyZGF0YTsKKyAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFyZzsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgImwyX3NlbmRfVUEoKVxuIik7CisgCXNlbmRfdWZyYW1lKGwyLCBza2IsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIH0KKyAKK0BAIC05MzEsNiArOTM2LDggQEAKKyAJbDItPnZhID0gMDsKKyAJbDItPnZyID0gMDsKKyAJbDItPnNvdyA9IDA7CisrCWwyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCXNldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CisgCXN0b3BfdDIwMChsMiwgMyk7CisgCW1JU0ROX0ZzbVJlc3RhcnRUaW1lcigmbDItPnQyMDMsIGwyLT5UMjAzLCBFVl9MMl9UMjAzLCBOVUxMLCAzKTsKK0BAIC05ODIsNiArOTg5LDggQEAKKyAJfSBlbHNlIGlmIChsMi0+dnMgIT0gbDItPnZhKSB7CisgCQlza2JfcXVldWVfcHVyZ2UoJmwyLT5pX3F1ZXVlKTsKKyAJCXByID0gRExfRVNUQUJMSVNIX0lORDsKKysJCS8vbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJCS8vc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCX0KKyAJc3RvcF90MjAwKGwyLCA1KTsKKyAJbDItPnZyID0gMDsKK0BAIC0xODQxLDExICsxODUwLDE0IEBACisgCXVfaW50CWw7CisgCWludAljID0gMDsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgInBoX2RhdGFfaW5kaWNhdGlvbiAweCV4IDB4JXggMHgleFxuIiwgZGF0YXBbMF0sIGRhdGFwWzFdLCBkYXRhcFsyXSk7CisrCisgCWwgPSBsMmFkZHJzaXplKGwyKTsKKyAJaWYgKHNrYi0+bGVuIDw9IGwpIHsKKyAJCW1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9GUkFNRV9FUlJPUiwgKHZvaWQgKikgJ04nKTsKKyAJCXJldHVybiByZXQ7CisgCX0KKysjaWYgMAorIAlpZiAodGVzdF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZykpIHsgLyogTWF5YmUgbm90IG5lZWRlZCAqLworIAkJcHNhcGkgPSAqZGF0YXArKzsKKyAJCXB0ZWkgPSAqZGF0YXArKzsKK0BAIC0xODc1LDYgKzE4ODcsNyBAQAorIAkJCXJldHVybiAwOworIAkJfQorIAl9IGVsc2UKKysjZW5kaWYKKyAJCWRhdGFwICs9IGw7CisgCWlmICghKCpkYXRhcCAmIDEpKSB7CS8qIEktRnJhbWUgKi8KKyAJCWMgPSBpZnJhbWVfZXJyb3IobDIsIHNrYik7CitAQCAtMTg5MCw2ICsxOTAzLDcgQEAKKyAJCQlyZXQgPSBtSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfVUksIHNrYik7CisgCX0gZWxzZSBpZiAoSXNTQUJNRShkYXRhcCwgbDIpKSB7CisgCQljID0gdW5udW1fZXJyb3IobDIsIHNrYiwgQ01EKTsKKysJCXByaW50ayhLRVJOX0RFQlVHICJJc1NBQk1FKCkgcmV0dXJuZWQgdHJ1ZSwgdW5udW1fZXJyb3I9JWRcbiIsIGMpOworIAkJaWYgKCFjKQorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9TQUJNRSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1VBKGRhdGFwKSkgeworQEAgLTIwODcsNyArMjEwMSw3IEBACisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBELCAmbDItPmZsYWcpOworIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTEFQRF9ORVQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19NT0QxMjgsICZsMi0+ZmxhZyk7CistCQlsMi0+c2FwaSA9IDA7CisrCQlsMi0+c2FwaSA9IDYyOworIAkJbDItPm1heGxlbiA9IE1BWF9ERlJBTUVfTEVOOworIAkJaWYgKHRlc3RfYml0KE9QVElPTl9MMl9QTVgsICZvcHRpb25zKSkKKyAJCQlsMi0+d2luZG93ID0gNzsKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTItMjMgMTY6MzI6NTkuMDAwMDAwMDAwICswMTAwCitAQCAtODMwLDE4ICs4MzAsMjkgQEAKKyAJaW50CQl0ZWksIHJpOworIAlzdHJ1Y3QgbGF5ZXIyCSpsMjsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgIm5ldyB0ZWkgcmVxdWVzdDogdGVpPSVkXG4iLCBkcFszXSA+PiAxKTsKKysKKyAJcmkgPSBkcFswXSA8PCA4OworIAlyaSArPSBkcFsxXTsKKy0JaWYgKCFtZ3ItPnVwKQorLQkJZ290byBkZW5pZWQ7CistCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworLQlpZiAodGVpIDwgMCkgeworLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJaWYgKCFtZ3ItPnVwKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAibWdyLT51cCA9PSBOVUxMXG4iKTsKKyAJCWdvdG8gZGVuaWVkOworIAl9CisrCWlmIChkcFszXSAhPSAweGZmKSB7CisrCQkvKiBUaGlzIGlzIGEgVEVJIHJlcXVlc3QgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMDguNTYgNi4xLjExLjIgKi8KKysJCXRlaSA9IGRwWzNdID4+IDE7CisrCX0gZWxzZSB7CisrCQl0ZWkgPSBnZXRfZnJlZV90ZWkobWdyKTsKKysJCWlmICh0ZWkgPCAwKSB7CisrCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJCQlnb3RvIGRlbmllZDsKKysJCX0KKysJfQorIAlsMiA9IGNyZWF0ZV9uZXdfdGVpKG1nciwgdGVpKTsKKy0JaWYgKCFsMikKKysJaWYgKCFsMikgeworKwkJcHJpbnRrKEtFUk5fREVCVUcgImNyZWF0ZV9uZXdfdGVpID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisrCX0KKyAJZWxzZQorIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT50bS0+dGVpX20sIEVWX0FTU0lHTl9SRVEsIGRwKTsKKyAJcmV0dXJuOworQEAgLTExNTksMTIgKzExNzAsMTQgQEAKKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmIChza2ItPmxlbiAhPSAzKQorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKysjaWYgMAorIAlpZiAoc2tiLT5kYXRhWzBdICE9IDApCisgCQkvKiBvbmx5IFNBUEkgMCBjb21tYW5kICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNlbmRpZgorIAlpZiAoIShza2ItPmRhdGFbMV0gJiAxKSkgLyogaW52YWxpZCBFQTEgKi8KKyAJCXJldHVybiAtRUlOVkFMOworLQl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMDsKKysJdGVpID0gc2tiLT5kYXRhWzFdID4+IDE7CisgCWlmICh0ZWkgPiA2MykgLyogbm90IGEgZml4ZWQgdGVpICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworIAlpZiAoKHNrYi0+ZGF0YVsyXSAmIH4weDEwKSAhPSBTQUJNRSkKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2ggYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCkBAIC0wLDAgKzEsNDg2IEBACitUaGlzIGV4cGVyaW1lbnRhbCBwYXRjaCBzcGxpdHMgb25lIEUxIGNhcmQgaW50byB0aHJlZSB2aXJ0dWFsIGNhcmRzLAorCitUUyAxLDIsMyw0LDUgaXMgY2FyZCAwCitUUyA2LDcsOCw5LDEwIGlzIGNhcmQgMQorVFMgMTEsMTIsMTMsMTQgaXMgY2FyZCAyCisKK1RoaXMgYWxsb3dzIHlvdSB0byBydW4gb25lIEwyIFRFSSBoYW5kbGVyIG9uIGVhY2ggb2YgdGhlIHZpcnR1YWwgY2FyZHMsCit3aGljaCBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBydW4gbXVsdGlwbGUgQlRTIG9uIGEgc2luZ2xlIEUxIGxpbmsuCisKK1RoYW5rcyB0byBBbmRyZWFzIEV2ZXJzYmVyZyBmb3IgdGhpcyBwYXRjaC4KKworZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAoraW5kZXggMGM3NzM4Ni4uMDJkZDRhMSAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAorKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitAQCAtMjA5LDE0ICsyMDksMTcgQEAgc3RydWN0IGhmY19tdWx0aSB7CisgCXVfbG9uZwkJbGVkc3RhdGU7IC8qIHNhdmUgbGFzdCBzdGF0ZSBvZiBsZWRzICovCisgCWludAkJb3B0aWNhbHN1cHBvcnQ7IC8qIGhhcyB0aGUgZTEgYm9hcmQgKi8KKyAJCQkJCS8qIGFuIG9wdGljYWwgSW50ZXJmYWNlICovCistCWludAkJZHNsb3Q7CS8qIGNoYW5uZWwgIyBvZiBkLWNoYW5uZWwgKEUxKSBkZWZhdWx0IDE2ICovCisrCisrCXVfaW50CQlibWFza1szMl07IC8qIGJpdG1hc2sgb2YgYmNoYW5uZWxzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJZG51bVszMl07IC8qIGFycmF5IG9mIHVzZWQgZGNoYW5uZWwgbnVtYmVycyBmb3IgcG9ydCAqLworKwl1X2NoYXIJCWNyZWF0ZWRbMzJdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworKwl1X2ludAkJYWN0aXZpdHlbMzJdOyAJLyogaWYgdGhlcmUgaXMgYW55IGFjdGlvbiBvbiB0aGlzICovCisrCQkJCQkvKiBwb3J0ICh3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgKi8KKysJCQkJCS8qIHNob3dpbmcgbGVkLXN0YXRlcykgKi8KKyAKKyAJdV9sb25nCQl3ZGNvdW50OyAJLyogZXZlcnkgNTAwIG1zIHdlIG5lZWQgdG8gKi8KKyAJCQkJCS8qIHNlbmQgdGhlIHdhdGNoZG9nIGEgc2lnbmFsICovCisgCXVfY2hhcgkJd2RieXRlOyAvKiB3YXRjaGRvZyB0b2dnbGUgYnl0ZSAqLworLQl1X2ludAkJYWN0aXZpdHlbOF07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKy0JCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworLQkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAlpbnQJCWUxX3N0YXRlOyAvKiBrZWVwIHRyYWNrIG9mIGxhc3Qgc3RhdGUgKi8KKyAJaW50CQllMV9nZXRjbG9jazsgLyogaWYgc3luYyBpcyByZXRyaWV2ZWQgZnJvbSBpbnRlcmZhY2UgKi8KKyAJaW50CQlzeW5jcm9uaXplZDsgLyoga2VlcCB0cmFjayBvZiBleGlzdGluZyBzeW5jIGludGVyZmFjZSAqLworQEAgLTIzMyw3ICsyMzYsNiBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJICogdGhlIGJjaC0+Y2hhbm5lbCBpcyBlcXV2YWxlbnQgdG8gdGhlIGhmYy1jaGFubmVsCisgCSAqLworIAlzdHJ1Y3QgaGZjX2NoYW4JY2hhblszMl07CistCXVfY2hhcgkJY3JlYXRlZFs4XTsgLyogd2hhdCBwb3J0IGlzIGNyZWF0ZWQgKi8KKyAJc2lnbmVkIGNoYXIJc2xvdF9vd25lclsyNTZdOyAvKiBvd25lciBjaGFubmVsIG9mIHNsb3QgKi8KKyB9OworIAorZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK2luZGV4IGUxZGFiMzAuLjRmZTJkMjcgMTAwNjQ0CistLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK0BAIC0xNjE5LDggKzE2MTksOCBAQCBoZmNtdWx0aV9sZWRzKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJICogbGVmdCByZWQ6ICAgICAgIGZyYW1lIHN5bmMsIGJ1dCBubyBMMQorIAkJICogcmlnaHQgZ3JlZW46ICAgIEwyIGFjdGl2ZQorIAkJICovCistCQlpZiAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworLQkJCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaC0+ZGV2LkQucHJvdG9jb2wKKysJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyAhPSAyKSB7IC8qIG5vIGZyYW1lIHN5bmMgKi8KKysJCQlpZiAoaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaC0+ZGV2LkQucHJvdG9jb2wKKyAJCQkJIT0gSVNETl9QX05UX0UxKSB7CisgCQkJCWxlZFswXSA9IDE7CisgCQkJCWxlZFsxXSA9IDE7CitAQCAtMjQyOCw1NSArMjQyOCw1NiBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCX0KKyAJCX0KKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSAmJiBoYy0+Y3JlYXRlZFswXSkgeworLQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbzogcHV0IGludGVyZmFjZSBwYXJhbWV0ZXJzIHRvIGhjCisrCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogTE9TICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSkgJiBWX1NJR19MT1M7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09OLAorIAkJCQkgICAgIkxPUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0xPU19PRkYsCisgCQkJCSAgICAiTE9TIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBBSVMgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfQUlTOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PTiwKKyAJCQkJICAgICJBSVMgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5haXMpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9BSVNfT0ZGLAorIAkJCQkgICAgIkFJUyBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5haXMgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMgPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBTTElQICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TTElQKSAmIFZfRk9TTElQX1JYOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcngpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4KQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfU0xJUF9SWCwKKyAJCQkJICAgICIgYml0IFNMSVAgZGV0ZWN0ZWQgUlgiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcnggPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4ID0gdGVtcDsKKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfVFg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHgpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1RYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBUWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHggPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogUkRJICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9SWF9TTDBfMCkgJiBWX0E7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09OLAorIAkJCQkgICAgIlJESSBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSkKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1JESV9PRkYsCisgCQkJCSAgICAiUkRJIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSA9IHRlbXA7CisgCQl9CisgCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0pBVFRfRElSKTsKKy0JCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jKSB7CisrCQlzd2l0Y2ggKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jKSB7CisgCQljYXNlIDA6CisgCQkJaWYgKCh0ZW1wICYgMHg2MCkgPT0gMHg2MCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9TWU5DKQorQEAgLTI0ODUsMTAgKzI0ODYsMTAgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQkJCSAgICAiaW4gY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfUlhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisgCQkJCUhGQ19vdXRiKGhjLCBSX1RYX09GRiwKKy0JCQkJICAgIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyIHwgVl9SWF9JTklUKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJICAgIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDE7CisgCQkJCWdvdG8gY2hlY2tfZnJhbWVzeW5jOworIAkJCX0KKyAJCQlicmVhazsKK0BAIC0yNDk5LDcgKzI1MDAsNyBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgY2hlY2tfZnJhbWVzeW5jOgorQEAgLTI1MTAsNyArMjUxMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJub3cgaW4gZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMjsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAyOworIAkJCX0KKyAJCQlicmVhazsKKyAJCWNhc2UgMjoKK0BAIC0yNTIwLDcgKzI1MjEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxIGxvc3QgIgorIAkJCQkJICAgICJjbG9jayAmIGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDA7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMDsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworQEAgLTI1MzAsNyArMjUzMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJsb3N0IGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDE7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQl9CisgCQkJYnJlYWs7CisgCQl9CitAQCAtMjc0Niw3ICsyNzQ3LDggQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJaWYgKHJfaXJxX21pc2MgJiBWX1NUQV9JUlEpIHsKKyAJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisgCQkJCS8qIHN0YXRlIG1hY2hpbmUgKi8KKy0JCQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CisrI3dhcm5pbmcgdG9kbworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQllMV9zeW5jc3RhID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKTsKKyAJCQkJaWYgKHRlc3RfYml0KEhGQ19DSElQX1BMWFNELCAmaGMtPmNoaXApCisgCQkJCSAmJiBoYy0+ZTFfZ2V0Y2xvY2spIHsKK0BAIC0yNzY4LDcgKzI3NzAsMTUgQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJCQl9CisgCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorIAkJCQkJJiAweDc7CisrI3dhcm5pbmcgdG9kbyBoYWNrISEhIGJyb2FkY2FzdCBzdGF0ZSBjaGFuZ2UhISEKKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKyAJCQkJc2NoZWR1bGVfZXZlbnQoZGNoLCBGTEdfUEhDSEFOR0UpOworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVsxXV0uZGNoOworKwkJCQlkY2gtPnN0YXRlID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0UxX1JEX1NUQSkKKysJCQkJCSYgMHg3OworKwkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCisrCisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NUQVRFKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkJCSAgICAiJXM6IEUxIChpZD0lZCkgbmV3c3RhdGUgJXhcbiIsCitAQCAtMzg1MSwzMSArMzg2MSwzNSBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOworIAorKwlpID0gZGNoLT5zbG90OworKwlwdCA9IGhjLT5jaGFuW2ldLnBvcnQ7CisgCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xvdF90eCA9IC0xOworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3J4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmNvbmYgPSAtMTsKKy0JCWlmIChoYy0+ZHNsb3QpIHsKKy0JCQltb2RlX2hmY211bHRpKGhjLCBoYy0+ZHNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisrCQkvKiBFMSAqLworKyN3YXJuaW5nIHRvZG86IGRvbicndCBkbyBpdCBpZiBkbnVtID09IDAKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uc2xvdF90eCA9IC0xOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3J4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNvbmYgPSAtMTsKKysJCWlmIChoYy0+ZG51bVtwdF0pIHsKKysJCQltb2RlX2hmY211bHRpKGhjLCBkY2gtPnNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisgCQkJCS0xLCAwLCAtMSwgMCk7CisgCQkJZGNoLT50aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGhmY211bHRpX2RidXN5X3RpbWVyOworIAkJCWRjaC0+dGltZXIuZGF0YSA9IChsb25nKSBkY2g7CisgCQkJaW5pdF90aW1lcigmZGNoLT50aW1lcik7CisgCQl9CisgCQlmb3IgKGkgPSAxOyBpIDw9IDMxOyBpKyspIHsKKy0JCQlpZiAoaSA9PSBoYy0+ZHNsb3QpCisrCQkJaWYgKCEoKDEgPDwgaSkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCQljb250aW51ZTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3R4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKKyAJCQltb2RlX2hmY211bHRpKGhjLCBpLCBJU0ROX1BfTk9ORSwgLTEsIDAsIC0xLCAwKTsKKyAJCX0KKy0JCS8qIEUxICovCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbyAoZ2xvYmFsKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzAsIDI1NSk7IC8qIDIgbXMgKi8KKyAJCQlIRkNfb3V0YihoYywgUl9MT1MxLCAyNTUpOyAvKiA1MTIgbXMgKi8KKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpIHsKKyAJCQlIRkNfb3V0YihoYywgUl9SWDAsIDApOworIAkJCWhjLT5ody5yX3R4MCA9IDAgfCBWX09VVF9FTjsKKyAJCX0gZWxzZSB7CitAQCAtMzg4OCwxMiArMzkwMiwxMiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMCwgMHgwMCk7CisgCQlIRkNfb3V0YihoYywgUl9UWF9GUjEsIDB4ZjgpOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfVFhfRlIyLCBWX1RYX01GIHwgVl9UWF9FIHwgVl9ORUdfRSk7CisgCisgCQlIRkNfb3V0YihoYywgUl9SWF9GUjAsIFZfQVVUT19SRVNZTkMgfCBWX0FVVE9fUkVDTyB8IDApOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfUlhfRlIxLCBWX1JYX01GIHwgVl9SWF9NRl9TWU5DKTsKKyAKKyAJCWlmIChkY2gtPmRldi5ELnByb3RvY29sID09IElTRE5fUF9OVF9FMSkgeworQEAgLTM5NTcsNyArMzk3MSw3IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJCXBseHNkX2NoZWNrc3luYyhoYywgMCk7CisgCQl9CisgCX0gZWxzZSB7CistCQlpID0gZGNoLT5zbG90OworKwkJLyogU1QgKi8KKyAJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKK0BAIC0zOTczLDggKzM5ODcsNiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCWhjLT5jaGFuW2kgLSAxXS5zbG90X3J4ID0gLTE7CisgCQloYy0+Y2hhbltpIC0gMV0uY29uZiA9IC0xOworIAkJbW9kZV9oZmNtdWx0aShoYywgaSAtIDEsIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworLQkJLyogU1QgKi8KKy0JCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJCS8qIHNlbGVjdCBpbnRlcmZhY2UgKi8KKyAJCUhGQ19vdXRiKGhjLCBSX1NUX1NFTCwgcHQpOworIAkJLyogdW5kb2N1bWVudGVkOiBkZWxheSBhZnRlciBSX1NUX1NFTCAqLworQEAgLTQ1NTcsNiArNDU2OSw4IEBAIHJlbGVhc2VfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQl9CisgCQkvKiBmcmVlIGNoYW5uZWxzICovCisgCQlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisrCQkJCWNvbnRpbnVlOworIAkJCWlmIChoYy0+Y2hhbltpXS5iY2gpIHsKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQkJCXByaW50ayhLRVJOX0RFQlVHCitAQCAtNDY4MCwxMiArNDY5NCwxMyBAQCByZWxlYXNlX2NhcmQoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgfQorIAorIHN0YXRpYyBpbnQKKy1pbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisraW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptLCBpbnQgcHQpCisgeworIAlzdHJ1Y3QgZGNoYW5uZWwJKmRjaDsKKyAJc3RydWN0IGJjaGFubmVsCSpiY2g7CisgCWludAkJY2gsIHJldCA9IDA7CisgCWNoYXIJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKKysJaW50CQliY291bnQgPSAwOworIAorIAlkY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJaWYgKCFkY2gpCitAQCAtNDY5OCwxMyArNDcxMywxMiBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCSAgICAoMSA8PCAoSVNETl9QX0JfSERMQyAmIElTRE5fUF9CX01BU0spKTsKKyAJZGNoLT5kZXYuRC5zZW5kID0gaGFuZGxlX2Rtc2c7CisgCWRjaC0+ZGV2LkQuY3RybCA9IGhmY21fZGN0cmw7CistCWRjaC0+ZGV2Lm5yYmNoYW4gPSAoaGMtPmRzbG90KSA/IDMwIDogMzE7CistCWRjaC0+c2xvdCA9IGhjLT5kc2xvdDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5kY2ggPSBkY2g7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ucG9ydCA9IDA7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ubnRfdGltZXIgPSAtMTsKKysJZGNoLT5zbG90ID0gaGMtPmRudW1bcHRdOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCA9IGRjaDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5wb3J0ID0gcHQ7CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0ubnRfdGltZXIgPSAtMTsKKyAJZm9yIChjaCA9IDE7IGNoIDw9IDMxOyBjaCsrKSB7CistCQlpZiAoY2ggPT0gaGMtPmRzbG90KSAvKiBza2lwIGRjaGFubmVsICovCisrCQlpZiAoISgoMSA8PCBjaCkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCWNvbnRpbnVlOworIAkJYmNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisgCQlpZiAoIWJjaCkgeworQEAgLTQ3MzMsNyArNDc0NywxMCBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQloYy0+Y2hhbltjaF0uYmNoID0gYmNoOworIAkJaGMtPmNoYW5bY2hdLnBvcnQgPSAwOworIAkJc2V0X2NoYW5uZWxtYXAoYmNoLT5uciwgZGNoLT5kZXYuY2hhbm5lbG1hcCk7CisrCQliY291bnQrKzsKKyAJfQorKwlkY2gtPmRldi5ucmJjaGFuID0gYmNvdW50OworKyN3YXJuaW5nIHRvZG86IG11c3QgYmUgc2V0IGdsb2JhbGx5LCBhbmQgbXVzdCBiZSBhIHNlcGVyYXRlIGZ1bmN0aW9uCisgCS8qIHNldCBvcHRpY2FsIGxpbmUgdHlwZSAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAwMSkgeworIAkJaWYgKCFtLT5vcHRpY2Fsc3VwcG9ydCkgIHsKK0BAIC00NzQ5LDcgKzQ3NjYsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSAgICBfX2Z1bmNfXywKKyAJCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfT1BUSUNBTCwKKy0JCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJCX0KKyAJfQorIAkvKiBzZXQgTE9TIHJlcG9ydCAqLworQEAgLTQ3NTksNyArNDc3Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgIkxPUyByZXBvcnQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBBSVMgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDA4KSB7CitAQCAtNDc2OCw3ICs0Nzg1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiQUlTIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFNMSVAgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDEwKSB7CitAQCAtNDc3OCw3ICs0Nzk1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBSREkgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDIwKSB7CitAQCAtNDc4OCw3ICs0ODA1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IENSQy00IE1vZGUgKi8KKyAJaWYgKCEocG9ydFtQb3J0X2NudF0gJiAweDEwMCkpIHsKK0BAIC00Nzk3LDcgKzQ4MTQsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSIgY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJCV9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfQ1JDNCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0gZWxzZSB7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE9SVCB0dXJuIG9mZiBDUkM0IgorQEAgLTQ4MjksMjAgKzQ4NDYsMjMgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAl9CisgCS8qIHNldCBlbGFzdGljIGppdHRlciBidWZmZXIgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgzMDAwKSB7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIgPSAocG9ydFtQb3J0X2NudF0+PjEyKSAmIDB4MzsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkgICAgIiVzOiBQT1JUIHNldCBlbGFzdGljICIKKyAJCQkgICAgImJ1ZmZlciB0byAlZDogY2FyZCglZCkgcG9ydCglZClcbiIsCistCQkJICAgIF9fZnVuY19fLCBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciwKKysJCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyLAorIAkJCSAgICBIRkNfY250ICsgMSwgMSk7CisgCX0gZWxzZQorLQkJaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgPSAyOyAvKiBkZWZhdWx0ICovCistCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKysJaWYgKGhjLT5wb3J0cyA+IDEpCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkLSVkIiwgSEZDX2NudCArIDEsIHB0KzEpOworKwllbHNlCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkIiwgSEZDX2NudCArIDEpOworIAlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCAmaGMtPnBjaV9kZXYtPmRldiwgbmFtZSk7CisgCWlmIChyZXQpCisgCQlnb3RvIGZyZWVfY2hhbjsKKy0JaGMtPmNyZWF0ZWRbMF0gPSAxOworKwloYy0+Y3JlYXRlZFtwdF0gPSAxOworIAlyZXR1cm4gcmV0OworIGZyZWVfY2hhbjoKKyAJcmVsZWFzZV9wb3J0KGhjLCBkY2gpOworQEAgLTUwMDksMTggKzUwMjksMzAgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJaGMtPmlkID0gSEZDX2NudDsKKyAJaGMtPnBjbSA9IHBjbVtIRkNfY250XTsKKyAJaGMtPmlvX21vZGUgPSBpb21vZGVbSEZDX2NudF07CisrI3dhcm5pbmcgdG9kbzogcmV3b3JrIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciBjdXN0b21pemluZyBlMSBmcmFnbWVudHMuLi4uIHllYSwgbGV0JydzIGNhbGwgaXQ6IGZyYWdtZW50cworIAlpZiAoZHNsb3RbSEZDX2NudF0gPCAwICYmIGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmRzbG90ID0gMDsKKysJCWhjLT5kbnVtWzBdID0gMDsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBkaXNhYmxlZCBELWNoYW5uZWwsIGJ1dCAiCisgCQkJIjMxIEItY2hhbm5lbHNcbiIpOworIAl9CisgCWlmIChkc2xvdFtIRkNfY250XSA+IDAgJiYgZHNsb3RbSEZDX2NudF0gPCAzMgorIAkgICAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSBkc2xvdFtIRkNfY250XTsKKysJCWhjLT5kbnVtWzBdID0gZHNsb3RbSEZDX2NudF07CisgCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgYWx0ZXJuYXRpbmcgRC1jaGFubmVsIG9uICIKKyAJCQkidGltZSBzbG90ICVkXG4iLCBkc2xvdFtIRkNfY250XSk7CisgCX0gZWxzZQorLQkJaGMtPmRzbG90ID0gMTY7CisrCQloYy0+ZG51bVswXSA9IDE2OworKworKyN3YXJuaW5nIHRvZG8gSEFDSyEhISBqdXN0IGEgc21hbGwgbWFwIG9mIHR3byAiZnJhZ21lbnRzIgorKwlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisrCQloYy0+ZG51bVswXSA9IDE7CisrCQloYy0+Ym1hc2tbMF0gPSAweDAwMDAwMDNjOworKwkJaGMtPmRudW1bMV0gPSA2OworKwkJaGMtPmJtYXNrWzFdID0gMHgwMDAwMDc4MDsKKysJCWhjLT5kbnVtWzJdID0gMTE7CisrCQloYy0+Ym1hc2tbMl0gPSAweDAwMDA3ODAwOworKwkJaGMtPnBvcnRzID0gMzsKKysJfQorIAorIAkvKiBzZXQgY2hpcCBzcGVjaWZpYyBmZWF0dXJlcyAqLworIAloYy0+bWFzdGVyY2xrID0gLTE7CitAQCAtNTEwMyw3ICs1MTM1LDcgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKyAJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCistCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSk7CisrCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSwgcHQpOworIAkJZWxzZQorIAkJCXJldF9lcnIgPSBpbml0X211bHRpX3BvcnQoaGMsIHB0KTsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCitAQCAtNTExNSwxMCArNTE0NywxNCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJaWYgKHJldF9lcnIpIHsKKyAJCQl3aGlsZSAocHQpIHsgLyogcmVsZWFzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgcG9ydHMgKi8KKyAJCQkJcHQtLTsKKy0JCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworKwkJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCk7CisrCQkJCWVsc2UKKysJCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5bKHB0IDw8IDIpICsgMl0uZGNoKTsKKyAJCQl9CisgCQkJZ290byBmcmVlX2NhcmQ7CisgCQl9CisrI3dhcm5pbmcgdG9kbzogY291bnQgaXQgcmlnaHQsIGFkZCBhZGRpdGlvbmFsICJmcmFnbWVudCIgY291bnRlci4uLgorIAkJUG9ydF9jbnQrKzsKKyAJfQorIApkaWZmIC0tZ2l0IGEvb3BlbmJzYy8uZ2l0aWdub3JlIGIvb3BlbmJzYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0OCBAQAorKi5vCisqLmEKKy5kZXBzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2JzY2NvbmZpZy5oCitic2Njb25maWcuaC5pbgorb3BlbmJzYy5wYworYnNjX2hhY2sKK2JzY19tc2NfaXAKK2JzY19tZ2NwCisqLip+CisqLnN3PworCisjY29uZmlndXJlCithY2xvY2FsLm00CithdXRvbTR0ZS5jYWNoZS8KK2NvbmZpZy5sb2cKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZQorZGVwY29tcAoraW5zdGFsbC1zaAorbWlzc2luZworc3RhbXAtaDEKKworIyBnaXQtdmVyc2lvbi1nZW4gbWFnaWMKKy50YXJiYWxsLXZlcnNpb24KKy52ZXJzaW9uCisKKworIyBhcHBzIGFuZCBhcHAgZGF0YQoraGxyLnNxbGl0ZTMKK2JzMTFfY29uZmlnCitpcGFjY2Vzcy1jb25maWcKK2lwYWNjZXNzLWZpbmQKK2lwYWNjZXNzLWZpcm13YXJlCitpcGFjY2Vzcy1wcm94eQoraXNkbnN5bmMKKworI3Rlc3RzCit0ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdAordGVzdHMvZGIvZGJfdGVzdAordGVzdHMvZGVidWcvZGVidWdfdGVzdAordGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QKK3Rlc3RzL3NjY3Avc2NjcF90ZXN0Cit0ZXN0cy9zbXMvc21zX3Rlc3QKK3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9BVVRIT1JTIGIvb3BlbmJzYy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjYwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL0FVVEhPUlMKQEAgLTAsMCArMSw3IEBACitIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorSG9sZ2VyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0phbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KK1N0ZWZhbiBTY2htaWR0IDxzdGVmYW5AZGF0ZW5mcmVpaGFmZW4ub3JnPgorRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CitBbmRyZWFzIEV2ZXJzYmVyZyA8QW5kcmVhcy5FdmVyc2JlcmdAdmVyc2F0ZWwuZGU+CitTeWx2YWluIE11bmF1dCA8MjQ2dG50QGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9vcGVuYnNjL0NPUFlJTkcKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBDT1BZSU5HCmNvcHkgdG8gb3BlbmJzYy9DT1BZSU5HCmRpZmYgLS1naXQgYS9vcGVuYnNjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2UxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBkaXN0LWJ6aXAyIDEuNgorCitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorU1VCRElSUyA9IGluY2x1ZGUgc3JjIHRlc3RzCisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gb3BlbmJzYy5wYyBsaWJzY2NwLnBjCisKK0JVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCiskKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAorZGlzdC1ob29rOgorCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9SRUFETUUgYi9vcGVuYnNjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwN2JiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorQWJvdXQgT3BlbkJTQworPT09PT09PT09PT09PQorCitPcGVuQlNDIGlzIGEgbWluaW1hbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHU00gTmV0d29yaywgd2l0aAorcGFydGljdWxhciBlbXBoYXNpcyBvbiB0aGUgZnVuY3Rpb25hbGl0eSB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlIEJTQywKK01TQywgSExSLCBWTFIgYW5kIFNNU0MuCisKK0l0cyBjdXJyZW50bHkgc3VwcG9ydGVkIGludGVyZmFjZXMgdG93YXJkcyB0aGUgQlRTIGFyZToKKworICogQ2xhc3NpYyBBLWJpcyBvdmVyIEUxIHVzaW5nIGEgbUlTRE4gYmFzZWQgRTEgaW50ZXJmYWNlLiBJbiBvdGhlcgorICAgd29yZHMsIHlvdSBjYW4gY29ubmVjdCBleGlzdGluZyBHU00gQmFzZSBUcmFuc2NlaXZlciBTdGF0aW9uIChCVFMpCisgICB0aHJvdWdoIEUxIHRvIE9wZW5CU0MuICBTbyBmYXIsIHdlIGhhdmUgb25seSB0ZXN0ZWQgdGhlIFNpZW1lbnMgQlMtMTEKKyAgIFRlc3QgcmVwb3J0cyB3aXRoIG90aGVyIEJUUyBhcmUgbXVjaCBhcHByZWNpYXRlZCEKKworICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQorCitUaGlzIHByb2plY3QgaXMgc3RpbGwgaW4gaXRzIGVhcmx5IGRheXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBhcmVhcyB3aGVyZSBpdAorZG9lc24ndCBiZWhhdmUgYXMgcGVyIEdTTSBzcGVjLgorCisJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKworCitsaWJvc21vY29yZQorPT09PT09PT09PT0KKworUGxlYXNlIG5vdGUgdGhhdCBhcyBvZiBNYXJjaCAyMDEwLCBPcGVuQlNDIGhhcyBhIGRlcGVuZGVuY3kgdG8gYSBsaWJyYXJ5CitjYWxsZWQgImxpYm9zbW9jb3JlIi4gIFlvdSBjYW4gb2J0YWluIHRoYXQgbGlicmFyeSBmcm9tCisKKwlnaXQ6Ly9naXQub3Ntb2NvbS5vcmcvbGlib3Ntb2NvcmUuZ2l0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29uZmlndXJlLmluIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzYzQ4NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNTcgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0CitBQ19JTklUKFtvcGVuYnNjXSwKKwltNF9lc3lzY21kKFsuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCisJW29wZW5ic2MtZGV2ZWxAbGlzdHMub3BlbmJzYy5vcmddKQorCitBTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKKworZG5sIGtlcm5lbCBzdHlsZSBjb21waWxlIG1lc3NhZ2VzCittNF9pZmRlZihbQU1fU0lMRU5UX1JVTEVTXSwgW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitkbmwgY2hlY2tzIGZvciBwcm9ncmFtcworQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX1JBTkxJQgorCitkbmwgY2hlY2tzIGZvciBsaWJyYXJpZXMKK0FDX1NFQVJDSF9MSUJTKGNyeXB0LCBjcnlwdCwKKyAgICBbTElCQ1JZUFQ9Ii1sY3J5cHQiOyBBQ19ERUZJTkUoW1ZUWV9DUllQVF9QV10sIFtdLCBbVXNlIGNyeXB0IGZ1bmN0aW9uYWxpdHkgb2YgdnR5Ll0pXSkKKworUEtHX0NIRUNLX01PRFVMRVMoTElCT1NNT0NPUkUsIGxpYm9zbW9jb3JlKQorCitkbmwgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKK0FDX0hFQURFUl9TVERDCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MKKworIyBUaGUgZm9sbG93aW5nIHRlc3QgaXMgdGFrZW4gZnJvbSBXZWJLaXQncyB3ZWJraXQubTQKK3NhdmVkX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0iJENGTEFHUyAtZnZpc2liaWxpdHk9aGlkZGVuICIKK0FDX01TR19DSEVDS0lORyhbaWYgJHtDQ30gc3VwcG9ydHMgLWZ2aXNpYmlsaXR5PWhpZGRlbl0pCitBQ19DT01QSUxFX0lGRUxTRShbY2hhciBmb287XSwKKyAgICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgU1lNQk9MX1ZJU0lCSUxJVFk9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iXSwKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKSkKK0NGTEFHUz0iJHNhdmVkX0NGTEFHUyIKK0FDX1NVQlNUKFNZTUJPTF9WSVNJQklMSVRZKQorCisKK2RubCBHZW5lcmF0ZSB0aGUgb3V0cHV0CitBTV9DT05GSUdfSEVBREVSKGJzY2NvbmZpZy5oKQorCitBQ19PVVRQVVQoCisgICAgb3BlbmJzYy5wYworICAgIGxpYnNjY3AucGMKKyAgICBpbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUKKyAgICBpbmNsdWRlL3Z0eS9NYWtlZmlsZQorICAgIGluY2x1ZGUvc2NjcC9NYWtlZmlsZQorICAgIGluY2x1ZGUvTWFrZWZpbGUKKyAgICBzcmMvTWFrZWZpbGUKKyAgICB0ZXN0cy9NYWtlZmlsZQorICAgIHRlc3RzL2RlYnVnL01ha2VmaWxlCisgICAgdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZQorICAgIHRlc3RzL2RiL01ha2VmaWxlCisgICAgdGVzdHMvY2hhbm5lbC9NYWtlZmlsZQorICAgIHRlc3RzL3NjY3AvTWFrZWZpbGUKKyAgICBNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9idC5weSBiL29wZW5ic2MvY29udHJpYi9idC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYjExMWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL2J0LnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKKworZiA9IG9wZW4oInVuYmFsYW5jZWQiKQorbGluZXMgPSBbXQorZm9yIGxpbmUgaW4gZjoKKyAgICBsaW5lcy5hcHBlbmQobGluZSkKKworZmlsZW5hbWVzID0ge30KKworb3V0cHV0ID0gW10KK2ZvciBsaW5lIGluIGxpbmVzOgorICAgIGlmICJbMHgiIGluIGxpbmU6CisgICAgICAgIHN0YXJ0ID0gbGluZS5maW5kKCJbIikKKyAgICAgICAgZW5kID0gbGluZS5maW5kKCJdIikKKyAgICAgICAgYWRkciA9IGxpbmVbc3RhcnQrMTplbmRdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBmaWxlbmFtZXNbYWRkcl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgciA9IG9zLnBvcGVuKCJhZGRyMmxpbmUgLWZzIC1lIC4vYnNjX2hhY2sgJXMiICUgYWRkcikKKyAgICAgICAgICAgIGFsbCA9IHIucmVhZCgpLnJlcGxhY2UoIlxuIiwgIiwiKQorICAgICAgICAgICAgZmlsZSA9IGFsbAorICAgICAgICAgICAgZmlsZW5hbWVzW2FkZHJdID0gZmlsZQorCisgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoYWRkciwgZmlsZSkKKyAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisKK2cgPSBvcGVuKCJ1bmJhbGFuY2VkLjIiLCAidyIpCitnLndyaXRlKCIiLmpvaW4ob3V0cHV0KSkKKworCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkgYi9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjZDZmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIENvbnZlcnQgRVRTSSBkb2N1bWVudHMgdG8gYW4gZW51bQorIworCitpbXBvcnQgcmUsIHN5cworCitkZWYgY29udmVydChzdHJpbmcpOgorICAgIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpLnJlcGxhY2UoIiAiLCAiIikucmp1c3QoOCwgIjAiKQorICAgIHZhciA9IDAKKyAgICBvZmZzZXQgPSA3CisgICAgZm9yIGNoYXIgaW4gc3RyaW5nOgorICAgICAgICBhc3NlcnQgb2Zmc2V0ID49IDAKKyAgICAgICAgdmFyID0gdmFyIHwgKGludChjaGFyKSA8PCBvZmZzZXQpCisgICAgICAgIG9mZnNldCA9IG9mZnNldCAtIDEKKworICAgIHJldHVybiB2YXIKKworZGVmIHN0cmluZyhuYW1lKToKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCIgIiwgIl8iKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyInLCAiIikKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgJ18nKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJygnLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKScsICdfJykKKyAgICByZXR1cm4gIiVzXyVzIiAlIChzeXMuYXJndlsyXSwgbmFtZS51cHBlcigpKQorCitmaWxlID0gb3BlbihzeXMuYXJndlsxXSkKKworCitmb3IgbGluZSBpbiBmaWxlOgorICAgIG0gPSByZS5tYXRjaChyIlsgXHRdKig/UDx2YWx1ZT5bMDEgXSspWyBdKyg/UDxuYW1lPlthLXpBLVogLzAtOSgpXSspIiwgbGluZVs6LTFdKQorCisgICAgaWYgbToKKyAgICAgICAgcHJpbnQgIlx0JXNcdFx0PSAlZCwiICUgKHN0cmluZyhtLmdyb3VwZGljdCgpWyJuYW1lIl0pLCBjb252ZXJ0KG0uZ3JvdXBkaWN0KClbInZhbHVlIl0pKQorICAgIGVsc2U6CisgICAgICAgIHByaW50IGxpbmVbOi0xXQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5IGIvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmM2VmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKQEAgLTAsMCArMSw1NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIFNpbXBsZSBzZXJ2ZXIgZm9yIG1nY3AuLi4gc2VuZCBhdWRpdCwgcmVjZWl2ZSByZXNwb25zZS4uCisKK2ltcG9ydCBzb2NrZXQsIHRpbWUKKworTUdDUF9HQVRFV0FZX1BPUlQgPSAyNDI3CitNR0NQX0NBTExBR0VOVF9QT1JUID0gMjcyNworCityc2lwX3Jlc3AgPSAiIiIyMDAgMzIxMzIxMzMyXHJcbiIiIgorYXVkaXRfcGFja2V0ID0gIiIiQVVFUCAlZCAxM0BtZ3cgTUdDUCAxLjBcclxuIiIiCitjcmN4X3BhY2tldCA9ICIiIkNSQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuIiIiCitkbGN4X3BhY2tldCA9ICIiIkRMQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbiIiIgorbWRjeF9wYWNrZXQgPSAiIiJNRENYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5JOiAlZFxyXG5MOiBwOjIwLCBhOkdTTS1FRlIsIG50OklOXHJcbk06IHJlY3Zvbmx5XHJcblxyXG52PTBcclxubz0tIDI1ODY5NjQ3NyAwIElOIElQNCAxNzIuMTYuMS4xMDdcclxucz0tXHJcbmM9SU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG50PTAgMFxyXG5tPWF1ZGlvIDQ0MDAgUlRQL0FWUCAxMjdcclxuYT1ydHBtYXA6MTI3IEdTTS1FRlIvODAwMC8xXHJcbmE9cHRpbWU6MjBcclxuYT1yZWN2b25seVxyXG5tPWltYWdlIDQ0MDIgdWRwdGwgdDM4XHJcbmE9VDM4RmF4VmVyc2lvbjowXHJcbmE9VDM4TWF4Qml0UmF0ZToxNDQwMFxyXG4iIiIKKworZGVmIGhleGR1bXAoc3JjLCBsZW5ndGg9OCk6CisgICAgIiIiUmVjaXBlIGlzIGZyb20gaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvMTQyODEyLyIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgZGlnaXRzID0gNCBpZiBpc2luc3RhbmNlKHNyYywgdW5pY29kZSkgZWxzZSAyCisgICAgZm9yIGkgaW4geHJhbmdlKDAsIGxlbihzcmMpLCBsZW5ndGgpOgorICAgICAgIHMgPSBzcmNbaTppK2xlbmd0aF0KKyAgICAgICBoZXhhID0gYicgJy5qb2luKFsiJTAqWCIgJSAoZGlnaXRzLCBvcmQoeCkpICBmb3IgeCBpbiBzXSkKKyAgICAgICB0ZXh0ID0gYicnLmpvaW4oW3ggaWYgMHgyMCA8PSBvcmQoeCkgPCAweDdGIGVsc2UgYicuJyAgZm9yIHggaW4gc10pCisgICAgICAgcmVzdWx0LmFwcGVuZCggYiIlMDRYICAgJS0qcyAgICVzIiAlIChpLCBsZW5ndGgqKGRpZ2l0cyArIDEpLCBoZXhhLCB0ZXh0KSApCisgICAgcmV0dXJuIGInXG4nLmpvaW4ocmVzdWx0KQorCitzZXJ2ZXJfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCitzZXJ2ZXJfc29ja2V0LmJpbmQoKCIxMjcuMC4wLjEiLCBNR0NQX0NBTExBR0VOVF9QT1JUKSkKK3NlcnZlcl9zb2NrZXQuc2V0YmxvY2tpbmcoMCkKKworCitkZWYgc2VuZF9yZWNlaXZlKHBhY2tldCk6CisgICAgc2VydmVyX3NvY2tldC5zZW5kdG8ocGFja2V0LCAoIjEyNy4wLjAuMSIsIE1HQ1BfR0FURVdBWV9QT1JUKSkKKyAgICB0cnk6CisgICAgICAgIGRhdGEsIGFkZHIgPSBzZXJ2ZXJfc29ja2V0LnJlY3Zmcm9tKDQwOTYpCisgICAgICAgIHByaW50IGhleGR1bXAoZGF0YSksIGFkZHIKKyAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICBwYXNzCisKK2RlZiBnZW5lcmF0ZV90aWQoKToKKyAgICBpbXBvcnQgcmFuZG9tCisgICAgcmV0dXJuIHJhbmRvbS5yYW5kaW50KDAsIDY1MTIzKQorCisKKworaSA9IDEKK3doaWxlIFRydWU6CisgICAgc2VuZF9yZWNlaXZlKHJzaXBfcmVzcCkKKyAgICBzZW5kX3JlY2VpdmUoYXVkaXRfcGFja2V0KQorICAgIHNlbmRfcmVjZWl2ZShjcmN4X3BhY2tldCAlIGdlbmVyYXRlX3RpZCgpICkKKyAgICBzZW5kX3JlY2VpdmUobWRjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGkpKQorICAgIHNlbmRfcmVjZWl2ZShkbGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgaSkpCisgICAgaSA9IGkgKyAxCisKKyAgICB0aW1lLnNsZWVwKDMpCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQgYi9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMzI5OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApAQCAtMCwwICsxLDMxIEBACitUaGUgU2llbWVucyBCUy0xMSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgR1NNIDEyLjIxIE9NTCBvcGVyYXRpb25zOgorCisKK0NSRUFURSBPQkpFQ1QKKworYWJpc19vbV9mb21faGRyLm9ial9jbGFzcyBjYW4gYmUgCitBMzoKK0E1OiBBTENPLCBCQlNJRywgQ0NMSywgR1BTVSwgTEksIFBBCitBODogRW52YUJUU0UKK0E5OiBCUE9SVAorCit0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgZmllbGQgaW5kaWNhdGVzIHRoZSBpbmRleCBvZiBvYmplY3QsIHdoZXJlYXMgdGhlCithYmlzX29tX2ZvbV9oZHIuYnRzX25yIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCitlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKwlCUzExX09CSl9BTENPCQk9IDB4MDEsCisJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisJQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAorCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKwlCUzExX09CSl9MSQkJPSAweDA3LAorCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCit9OworCitJbiBjYXNlIG9mIENSRUFURSBFTlZBQlRTRSwgdGhlIGFiaXNfb21fb2JqX2luc3QudHJ4X25yIGluZGljYXRlcyB0aGUgRW52YUJUU0V4CitudW1iZXIuCisKK0luIGNhc2Ugb2YgQTkgKENSRUFFVEUgQlBPUlQpLCB0aGUgYWJpc19vbV9vYmpfaW5zdC5idHNfbnIgaW5kaWNhdGVzIHdoaWNoIEJQT1JUCitzaGFsbCBiZSB1c2VkLgorCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQgYi9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0CkBAIC0wLDAgKzEsMjUgQEAKK0NhbGwgcm91dGluZyBpbiBPcGVuQlNDCisKK0Zsb3cgb2YgZXZlbnRzOgorCisgIyBNTyBjYWxsIGluaXRpYXRlZCBieSBNUywgQ0hBTk5FTCBSUUQsIElNTUVESUFURSBBU1NJR04KKyAjIE1TIHNlbmRzIENDIFNFVFVQIG1lc3NhZ2UsIHdlIGFzc3VtZSBhbHJlYWR5IG9uIFRDSC9IIEZBQ0NICisgIyBPcGVuQlNDIGRvZXMgYSBzdWJzY3JpYmVyIGxvb2t1cCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGV4dGVuc2lvbgorICAqIElmIGEgc3Vic2NyaWJlciBpcyBmb3VuZDoKKyAgICMgc2VuZCBDQUxMIFBST0NFRURJTkcgbWVzc2FnZSB0byBNTworICAgIyBwYWdlIHRoZSBNVCBzdWJzY3JpYmVyIGFuZCBhc2sgaXRJIHRvIGFzayBmb3IgVENIL0gKKyAgICMgb25jZSBwYWdpbmcgY29tcGxldGVzLCB3ZSBoYXZlIHRoZSBUQ0gvSCBmb3IgdGhlIE1UIGVuZAorICAgIyBzZW5kIFNFVFVQIHRvIE1UCisgICAjIHJlY2VpdmUgQ0FMTCBDT05GSVJNRUQgZnJvbSBNVAorICAgIyBzZXQtdXAgdGhlIFRSQVUgbXV4IG1hcHBpbmcgYmV0d2VlbiB0aGUgRTEgc3Vic2xvdHMgZm9yIGJvdGggVENIL0gKKyAgICMgcmVjZWl2ZSBBTEVSVElORyBmcm9tIE1ULCByb3V0ZSBBTEVSVElORyB0byBNTworICAgIyByZWNlaXZlIENPTk5FQ1QgZnJvbSBNVCwgY29uZmlybSB0byBNVCB3aXRoIENPTk5FQ1RfQUNLCisgICAjIHNlbmQgYSBDT05ORUNUIG1lc3NhZ2UgdG8gTU8sIHJlY2VpdmUgQ09OTkVDVF9BQ0sgZnJvbSBNTworICogSWYgc3Vic2NyaWJlciBpcyBub3QgZm91bmQ6CisgICMgc2VuZCBSRUxFQVNFIENPTVBMRVRFIHdpdGggYXByb3ByaWF0ZSBjYXVzZSB0byBNTyAoMTogdW5hbGxvYWNhdGVkIDM6IG5vIHJvdXRlKQorICAKKworCitUaG91Z2h0cyBhYm91dCBSUi9NTToKKworKiB3ZSBhbGxvY2F0ZSBSUi9NTSBlbnRpdGllcyBvbiBkZW1hbmQsIHdoZW4gd2UgbmVlZCB0aGVtCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0IGIvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNmMDljCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dApAQCAtMCwwICsxLDc0IEBACisKK0dTTSAwNC4wOCA3LjEuNyAvIDkuMS43CQlSUiBDSEFOTkVMIFJFTEVTRQorCitSU0wgMDguNTggMy40IC8gPwkJUkxMIExpbmsgUmVsZWFzZSBSZXF1ZXN0CisKK1JTTCAwOC41OCA0LjYgLyA4LjQuNQkJREVBQ1RpdmF0ZSBTQUNDSAorCSogRGVhY3RpdmF0ZSBTQUNDSCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBSZWxlYXNlIFByb2MgMDQuMDgKKwkqIHRvIGJlIHNlbnQgYWZ0ZXIgUlIgQ0hBTk5FTCBSRUxFQVNFIGlzIHNlbnQgdG8gTVMKKworUlNMIDA4LjU4IDQuNyAvIDguNC4xNAkJUkYgQ0hBTm5lbCBSRUxlYXNlCisJKiB0ZWxscyB0aGUgQlRTIHRvIHJlbGVhc2UgYSByYWRpbyBjaGFubmVsCisJKiAid2hlbiBhbiBhY3RpdmF0ZWQgcmFkaW8gY2hhbm5lbCBpcyBubyBsb25nZXIgbmVlZGVkIgorCSogQlRTIHJlc3BvbmRzIHdpdGggUkYgQ0hBTm5lbCBSRUxlYXNlIEFDS25vd2xlZGdlCisKKworR1NNIDA0LjA4IDMuNC4xMzogUlIgY29ubmVjdGlvbiByZWxlYXNlIHByb2NlZHVyZQorCisqIG5ldHdvcmsgc2VuZHMgUlIgQ0hBTk5FTCBSRUxFQVNFIHRvIE1TIG9uIHRoZSBEQ0NICisgICogc3RhcnQgVDMxMDkKKyAgKiBkZWFjdGl2YXRlIFNBQ0NICisqIE1TIGRpc2Nvbm5lY3RzIG1haW4gc2lnbmFsbGluZyBsaW5rIChieSBzZW5kaW5nIERJU0MpCisgICogYWxsIG90aGVyIGRhdGEgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZCBieSBsb2NhbCBlbmQgbGluayByZWxlYXNlCisqIG5ldHdvcmsgcmVjZWl2ZXMgRElTQyAoQlRTIHNlbmRzIFJMTCBSRUwgSU5EIHRvIEJTQykKKyAgKiBzdG9wIFQzMTA5CisgICogc3RhcnQgVDMxMTEgCisqIHdoZW4gVDMxMTEgdGltZXMgb3V0LCB0aGUgbmV0d29yayBjYW4gcmV1c2UgdGhlIGNoYW5ubHMKKyogaWYgVDMxMDkgdGltZXMgb3V0LCB0aGUgbmV0d29yayBkZWFjdGl2YXRlcyB0aGUgY2hhbm5lbHMgCisgIGFuZCBjYW4gcmV1c2UgdGhlbQorICAqIHRoaXMgcHJvYmFibHkgbWVhbnMgc2ltcGx5IFJGIENIQU5uZWwgUkVMZWFzZQorCisKKz09IEltcGxlbWVudGF0aW9uIGluIE9wZW5CU0MgPT0KKworY2hhbl9hbGxvYy5jOmxjaGFuX2F1dG9fcmVsZWFzZSgpCisJKiBjaGVja3MgaWYgdXNlIGNvdW50IHN0aWxsID4gMCAoYWJvcnQpCisJKiBjYWxscyBnc200OF9zZW5kX3JyX3JlbGVhc2UoKQorCQkqIHdoaWNoIGNhbGxzIHJzbF9kZWFjdF9zYWNjaCgpCisJKiBjYWxscyByc2xfcmVsZWFzZV9yZXF1ZXN0KCkKKwkJKiB3aGljaCBzZW5kcyBSTEwgTGluayBSZWxlYXNlIHJlcXVlc3QKKwkKK1JYIG9mIFJFTGVhc2UgSU5EaWNhdGlvbjoKKwkqIGNhbGwgcnNsX3JmX2NoYW5fcmVsZWFzZSgpIChzZW5kIFJGX0NIQU5fUkVMKQorCitSWCBvZiBSRUxlYXNlIENPTkZpbWVtOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKKyogUlggb2YgUkZfQ0hBTl9SRUxfQUNLCisJKiBjYWxsIGxjaGFuX2ZyZWUoKQorCQkqIHN1YnNjcl9wdXQoKQorCQkqIGRlbGV0ZSByZWxlYXNlX3RpbWVyCisKKworPT09IEludGVncmF0aW9uIHdpdGggU01TID09PQorCisqIFJYIG9mIENQX0VSUk9SIG9yIHVuaW1wbGVtZW50ZWQgTVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBDUCBUQzEqIGV4cGlyZWQgd2hpbGUgd2FpdGluZyBmb3IgQ1AtQUNLCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogUlggb2YgUlBfRVJST1IKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogVFggb2YgQ1AtQUNLIGluIE1UIERFTElWRVIKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBDUC1BQ0sgaW4gTU8gU1VCTUlUCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisJCisqIFJYIG9mIFJQLUFDSyBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMworCisqIFJYIG9mIFJQLVNNTUEgaW4gTVQgREVMSVZFUiAoYW5kIG5vIG1vcmUgbWVzc2FnZXMpCisJKiB0cmlnZ2VyIHJzbF9yZWxlYXNlX3JlcXVlc3QoKSBmb3IgU0FQSTMKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0IGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NGZlNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0CkBAIC0wLDAgKzEsMTcyIEBACitFMSByZWxhdGVkIGRhdGEgbW9kZWwKKworVGhpcyBkYXRhIG1vZGVsIGRlc2NyaWJlcyB0aGUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIG9mIHRoZSBpbmRpdmlkdWFsCitwYXJ0cyBpbiB0aGUgbmV0d29yaywgaXQgaXMgbm90IHRoZSBsb2dpY2FsL3Byb3RvY29sIHNpZGUgb2YgdGhlIEdTTQorbmV0d29yay4KKworQSBCVFMgaXMgY29ubmVjdGVkIHRvIHRoZSBCU0MgYnkgc29tZSBwaHlzaWNhbCBsaW5rLiAgSXQgY291bGQgYmUgYW4gYWN0dWFsCitFMSBsaW5rLCBidXQgaXQgY291bGQgYWxzbyBiZSBhYmlzLW92ZXItSVAgd2l0aCBhIG1peHR1cmUgb2YgVENQIGFuZCBSVFAvVURQLgorCitUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgdGhlIGZhY3QsIG11bHRpcGxlIEJUUyBjYW4gc2hhcmUgb25lIHN1Y2ggcHlzaWNhbAorbGluay4gIE9uIGEgc2luZ2xlIEUxIGxpbmUsIHdlIGNhbiBlYXNpbHkgYWNjb21vZGF0ZSB1cCB0byB0aHJlZSBCVFMgd2l0aAordHdvIFRSWCBlYWNoLgorCitUaHVzLCBpdCBpcyBiZXN0IGZvciBPcGVuQlNDIHRvIGhhdmUgc29tZSBraW5kIG9mIGFic3RyYWN0aW9uIGxheWVyLiAgVGhlIEJTQydzCit2aWV3IG9mIGEgQlRTIGNvbm5lY3RlZCB0byBpdC4gIFdlIGNhbGwgdGhpcyAnYnRzX2xpbmsnLiAgQSBidHNfbGluayBjYW4gYmUKKyogYWxsIHRoZSBUQ1AgYW5kIFVEUCBzdHJlYW1zIG9mIGEgQWJpcy1vdmVyLUlQIEJUUworKiBhIHNldCBvZiBFMSB0aW1lc2xvdHMgZm9yIE9NTCwgUlNMIGFuZCBUUkFVIGNvbm5lY3Rpb25zIG9uIGEgRTEgbGluaworKiBhIHNlcmlhbCBsaW5lIGV4Y2x1c2l2ZWx5IHVzZWQgZm9yIE9NTCBtZXNzYWdlcyAoVC1MaW5rKQorCitBIGJ0c19saW5rIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIE9wZW5CU0MgY29yZSBhdCBydW50aW1lLgorCitzdHJ1Y3QgdHJ4X2xpbmsgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworfTsKKworc3RydWN0IGJ0c19saW5rIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCB0cnhfbGluayB0cnhfbGlua3NbTlVNX1RSWF07Cit9OworCitJbnRlcmZhY2UgZnJvbSBzdGFjayB0byBpbnB1dCBjb3JlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIFJTTCBsaW5rIHRvIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgaW4KKwltc2ctPnRyeC4KKworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlyZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgUlNMIGxpbmsgZnJvbSB0aGUgVFJYIHNwZWNpZmllZCBieSB0aGUKKwljYWxsZXIgaW4gbXNnLT50cnguCisKK2ludCBhYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIE9NTCBsaW5rIHRvIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgaW4KKwltc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0IFRSWAorCWluIGEgQlRTLiAoT01MIG1lc3NhZ2VzIGFyZSBub3QgcmVhbGx5IHNlbnQgdG8gYSBUUlggYnV0IHRvIHRoZSBCVFMpCisKK2ludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlyZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgT01MIGxpbmsgZnJvbSB0aGUgQlRTIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyCisJaW4gbXNnLT50cngtPmJ0cy4gIFRoZSBjYWxsZXIgY2FuIGp1c3QgdXNlIGJ0cy0+YzAgdG8gZ2V0IHRoZSBmaXJzdAorCVRSWCBpbiBhIEJUUy4KKworaW50IGFiaXNfbGlua19ldmVudChpbnQgZXZlbnQsIHZvaWQgKmRhdGEpOworCXNpZ25hbCBzb21lIGV2ZW50IChzdWNoIGFzIGxheWVyIDEgY29ubmVjdC9kaXNjb25uZWN0KSBmcm9tIHRoZQorCWlucHV0IGNvcmUgdG8gdGhlIHN0YWNrLgorCitpbnQgc3ViY2hfZGVtdXhfaW4obXgsIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKwlyZWNlaXZlICdsZW4nIGJ5dGVzIGZyb20gYSBnaXZlbiBFMSB0aW1lc2xvdCAoVFJBVSBmcmFtZXMpCisKK2ludCBzdWJjaGFuX211eF9vdXQobXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKwlvYnRhaW4gJ2xlbicgYnl0ZXMgb2Ygb3V0cHV0IGRhdGEgdG8gYmUgc2VudCBvbiBFMSB0aW1lc2xvdAorCitJbnRyZmFjZSBieSBJbnB1dCBDb3JlIGZvciBJbnB1dCBQbHVnaW5zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ludCBidHNsaW5rX3JlZ2lzdGVyX3BsdWdpbigpOworCisKK0NvbmZpZ3VyYXRpb24gZm9yIHRoZSBFMSBpbnB1dCBtb2R1bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQlRTCisJQlRTIG51bWJlcgorCW51bWJlciBvZiBUUlgKKwlPTUwgbGluaworCQlFMSBsaW5lIG51bWJlcgorCQl0aW1lc2xvdCBudW1iZXIKKwkJW3N1YnNsb3QgbnVtYmVyXQorCQlTQVBJCisJCVRFSQorCWZvciBlYWNoIFRSWAorCQlSU0wgbGluaworCQkJRTEgbGluZSBudW1iZXIKKwkJCXRpbWVzbG90IG51bWJlcgorCQkJW3N1YnNsb3QgbnVtYmVyXQorCQkJU0FQSQorCQkJVEVJCisJCWZvciBlYWNoIFRTCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlzdWJzbG90IG51bWJlcgorCisKK0UxIGlucHV0IG1vZHVsZSBkYXRhIG1vZGVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworZW51bSBlMWlucF9zaWduX3R5cGUgeworCUUxSU5QX1NJR05fTk9ORSwKKwlFMUlOUF9TSUdOX09NTCwKKwlFMUlOUF9TSUdOX1JTTCwKK307CisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgeworCS8qIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwllbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlOworCisJLyogdHJ4IGZvciBtc2ctPnRyeCBvZiByZWNlaXZlZCBtc2dzICovCQorCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJLyogbXNnYiBxdWV1ZSBvZiB0by1iZS10cmFuc21pdHRlZCBtc2dzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfbGlzdDsKKworCS8qIFNBUEkgYW5kIFRFSSBvbiB0aGUgRTEgVFMgKi8KKwl1X2ludDhfdCBzYXBpOworCXVfaW50OF90IHRlaTsKK30KKworZW51bSBlMWlucF90c190eXBlIHsKKwlFMUlOUF9UU19UWVBFX05PTkUsCisJRTFJTlBfVFNfVFlQRV9TSUdOLAorCUUxSU5QX1RTX1RZUEVfVFJBVSwKK307CisKKy8qIEEgdGltZXNsb3QgaW4gdGhlIEUxIGludGVyZmFjZSAqLworc3RydWN0IGUxaW5wX3RzIHsKKwllbnVtIGUxaW5wX3RzX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgbGxpc3RfaGVhZCBzaWduX2xpbmtzOworCQl9IHNpZ247CisJCXN0cnVjdCB7CisJCQkvKiBzdWJjaGFubmVsIGRlbXV4ZXIgZm9yIGZyYW1lcyBmcm9tIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfZGVtdXggZGVtdXg7CisJCQkvKiBzdWJjaGFubmVsIG11eGVyIGZvciBmcmFtZXMgdG8gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9tdXggbXV4OworCQl9IHRyYXU7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBtSVNETiBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZDsKKwkJfSBtaXNkbjsKKwl9IGRyaXZlcjsKK307CisKK3N0cnVjdCBlMWlucF9saW5lIHsKKwl1bnNpZ25lZCBpbnQgbnVtOworCWNoYXIgKm5hbWU7CisKKwlzdHJ1Y3QgZTFpbnBfdHMgdHNbTlJfRTFfVFNdOworCisJY2hhciAqZTFpbnBfZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworfTsKKworLyogQ2FsbCBmcm9tIHRoZSBTdGFjazogY29uZmlndXJhdGlvbiBvZiB0aGlzIFRTIGhhcyBjaGFuZ2VkICovCitpbnQgZTFpbnBfdXBkYXRlX3RzKHN0cnVjdCBlMWlucF90cyAqdHMpOworCisvKiBSZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlIEUxIGRyaXZlciAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIFNlbmQgYSBwYWNrZXQsIGNhbGxiYWNrIGZ1bmN0aW9uIGluIHRoZSBkcml2ZXIgKi8KK2ludCBlMWRyaXZlcl90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQorCisKK3N0cnVjdCBlMWlucF9kcml2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqd2FudF93cml0ZSkoc3RydWN0IGUxaW5wX3RzICp0cyk7Cit9OwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0IGIvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKQEAgLTAsMCArMSw1NCBAQAorYWNjb3JkaW5nIHRvIEdTTSAwNS4wMjoKKworZ2VuZXJhbCBwYXJhbWV0ZXJzIGZyb20gQ0NDSDoKKyogQ0EgY2VsbCBhbGxvY2F0aW9uIG9mIEFSRkNOJ3MgKFN5c3RlbSBJbmZvcm1hdGlvbiAvIEJDQ0gpCisqIEZOOiBURE1BIGZyYW1lIG51bWJlciAodDEsdDIsdDMnKSBpbiBTQ0gKKworc3BlY2lmaWMgcGFyYW1ldGVycyBmcm9tIGNoYW5uZWwgYXNzaWdubWVudDoKKyogTUE6IG1vYmlsZSBhbGxvY2F0aW9uLCBkZWZpbmVzIHNldCBvZiBBUkZDTidzLCB1cCB0byA2NAorKiBNQUlPOiBpbmRleAorKiBIU046IGhvcHBpbmcgc2VxdWVuY2UgZ2VuZXJhdG9yIG51bWJlciAoMC4uNjQpCisKKworaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0aW9uICg2LjIuMyk6CisKK3VfaW50OF90IHJudGFibGVbMTE0XSA9IHsKKwkgNDgsICA5OCwgIDYzLCAgIDEsICAzNiwgIDk1LCAgNzgsIDEwMiwgIDk0LCAgNzMsCisJICAwLCAgNjQsICAyNSwgIDgxLCAgNzYsICA1OSwgMTI0LCAgMjMsIDEwNCwgMTAwLAorCTEwMSwgIDQ3LCAxMTgsICA4NSwgIDE4LCAgNTYsICA5NiwgIDg2LCAgNTQsICAgMiwKKwkgODAsICAzNCwgMTI3LCAgMTMsICAgNiwgIDg5LCAgNTcsIDEwMywgIDEyLCAgNzQsCisJIDU1LCAxMTEsICA3NSwgIDM4LCAxMDksICA3MSwgMTEyLCAgMjksICAxMSwgIDg4LAorCSA4NywgIDE5LCAgIDMsICA2OCwgMTEwLCAgMjYsICAzMywgIDMxLCAgIDgsICA0NSwKKwkgODIsICA1OCwgIDQwLCAxMDcsICAzMiwgICA1LCAxMDYsICA5MiwgIDYyLCAgNjcsCisJIDc3LCAxMDgsIDEyMiwgIDM3LCAgNjAsICA2NiwgMTIxLCAgNDIsICA1MSwgMTI2LAorCTExNywgMTE0LCAgIDQsICA5MCwgIDQzLCAgNTIsICA1MywgMTEzLCAxMjAsICA3MiwKKwkgMTYsICA0OSwgICA3LCAgNzksIDExOSwgIDYxLCAgMjIsICA4NCwgICA5LCAgOTcsCisJMTI1LCAgOTksICAxNywgMTIzCit9OworCisvKiBtYWk9MCByZXByZXNlbnRzIGxvd2VzdCBBUkZDTiBpbiB0aGUgTUEgKi8KKworCit1X2ludDhfdCBob3BwaW5nX21haSh1X2ludDhfdCBoc24sIHVfaW50MzJfdCBmbiwgdV9pbnQ4X3QgbWFpbywKKwkJICAgICB1X2ludDhfdCB0MSwgdV9pbnQ4X3QgdDIsIHVfaW50OF90IHQzXykKK3sKKwl1X2ludDhfdCBtYWk7CisKKwlpZiAoaHNuID09IDApIC8qIGN5Y2xpYyBob3BwaW5nICovCisJCW1haSA9IChmbiArIG1haW8pICUgbjsKKwllbHNlIHsKKwkJdV9pbnQzMl90IG0sIG1fLCB0XywgczsKKworCQltID0gdDIgKyBybnRhYmxlWyhoc24geG9yICh0MSAlIDY0KSkgKyB0M107CisJCW1fID0gbSAlICgyXk5CSU4pOworCQl0XyA9IHQzICUgKDJeTkJJTik7CisJCWlmIChtXyA8IG4gdGhlbikKKwkJCXMgPSBtXzsKKwkJZWxzZQorCQkJcyA9IChtXyArIHRfKSAlIG47CisJCW1haSA9IChzICsgbWFpbykgJSBuOworCX0KKworCXJldHVybiBtYWk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dCBiL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0CkBAIC0wLDAgKzEsODkgQEAKK0lkZWFzIGFib3V0IGEgaGFuZG92ZXIgYWxnb3JpdGhtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgbW9zdGx5IGJhc2VkIG9uIHRoZSByZXN1bHRzIHByZXNlbnRlZCBpbiBDaGFwdGVyIDggb2YgIlBlcmZvcm1hbmNlCitFbmhhbmNlbWVudHMgaW4gYSBGcmVxdWVuY3kgSG9wcGluZyBHU00gTmV0d29yayIgYnkgVGhvbWFzIFRvZnRlZ2FhcmQgTmllbHNlbgorYW5kIEpvZXJvZW4gV2lnYXJkLiAKKworCis9PT0gUmVhc29ucyBmb3IgcGVyZm9ybWluZyBoYW5kb3ZlciA9PT0KKworU2VjdGlvbiAyLjEuMTogSGFuZG92ZXIgdXNlZCBpbiB0aGVpciBDQVBBQ0lUWSBzaW11bGF0aW9uOgorCisxKSBJbnRlcmZlcmVuY2UgSGFuZG92ZXIKKworQXZlcmFnZSBSWExFViBpcyBzYXRpc2ZhY3RvcnkgaGlnaCwgYnV0IGF2ZXJhZ2UgUlhRVUFMIHRvbyBsb3cgaW5kaWNhdGVzCitpbnRlcmZlcmVuY2UgdG8gdGhlIGNoYW5uZWwuICBIYW5kb3ZlciBzaG91bGQgYmUgbWFkZS4KKworMikgQmFkIFF1YWxpdHkKKworQXZlcmFnZWQgUlhRVUFMIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQKKworMykgTG93IExldmVsIC8gU2lnbmFsIFN0cmVuZ3RoCisKK0F2ZXJhZ2UgUlhMRVYgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCis0KSBEaXN0YW5jZSBIYW5kb3ZlcgorCitNUyBpcyB0b28gZmFyIGF3YXkgZnJvbSBhIGNlbGwgKG1lYXN1cmVkIGJ5IFRBKQorCis1KSBQb3dlciBidWRnZXQgLyBCZXR0ZXIgQ2VsbAorCitSWCBMZXZlbCBvZiBuZWlnaGJvciBjZWxsIGlzIGF0IGxlYXN0ICJITyBNYXJnaW4gZEIiIGRCIGJldHRlciB0aGFuIHRoZQorY3VycmVudCBzZXJ2aW5nIGNlbGwuCisKKz09PSBJZGVhbCBwYXJhbWV0ZXJzIGZvciBITyBhbGdvcml0aG0gPT09CisKK0NoYXB0ZXIgOCwgU2VjdGlvbiAyLjIsIFRhYmxlIDI0OgorCitXaW5kb3cgUlhMRVYgYXZlcmFnaW5nOgkJMTAgU0FDQ0ggZnJhbWVzIChubyB3ZWlnaHRpbmcpCitXaW5kb3cgUlhRVUFMIGF2ZXJhZ2luZzoJMSBTQUNDSCBmcmFtZSAobm8gYXZlcmFnaW5nKQorTGV2ZWwgVGhyZWFzaG9sZDoJCTEgb2YgdGhlIGxhc3QgMSBBVi1SWExFViB2YWx1ZXMgPCAtMTEwZEJtCitRdWFsaXR5IFRocmVzaG9sZDoJCTMgb2YgdGhlIGxhc3QgNCBBVi1SWFFVQUwgdmFsdWVzID49IDUKK0ludGVyZmVyZW5jZSBUaHJlc2hvbGQ6CQkxIG9mIHRoZSBsYXN0IEFWLVJYTEVWID4gLTg1IGRCbSAmCisJCQkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorUG93ZXIgQnVkZ2V0OgkJCUxldmVsIG9mIG5laWdoYm9yIGNlbGwgPiAzIGRCIGJldHRlcgorUG93ZXIgQnVkZ2V0IEludGVydmFsOgkJRXZlcnkgNiBTQUNDSCBmcmFtZXMgKDYgc2Vjb25kcyA/IT8pCitEaXN0YW5jZSBIYW5kb3ZlcjoJCURpc2FibGVkCitFdmFsdWF0aW9uIHJ1bGUgMToJCVJYTEVWIG9mIHRoZSBjYW5kaWRhdGUgY2VsbCBhIHRsZWFzdCAtMTA0IGRCbQorRXZhbHVhdGlvbiBydWxlIDI6CQlMZXZlbCBvZiBjYW5kaWRhdGUgY2VsbCA+IDNkQiBiZXR0ZXIgb3duIGNlbGwKK1RpbWVyIFN1Y2Nlc3NmdWwgSE86CQk1IFNBQ0NIIGZyYW1lcworVGltZXIgVW5zdWNjZXNzZnVsIEhPOgkJMSBTQUNDSCBmcmFtZQorCitJbiBhIG5vbi1mcmVxdWVuY3kgaG9wcGluZyBjYXNlLCBSWFFVQUwgdGhyZXNob2xkIGNhbiBiZSBkZWNyZWFzZWQgdG8KK1JYTEVWID49IDQKKworV2hlbiBmcmVxdWVuY3kgaG9wcGluZyBpcyBlbmFibGVkLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFyYW1ldGVycworc2hvdWxkIGJlIGludHJvZHVjZWQ6CisKKyogTm8gaW50cmEtY2VsbCBoYW5kb3ZlcgorKiBVc2UgYSBITyBNYXJnaW4gb2YgMmRCCisKKz09PSBIYW5kb3ZlciBDaGFubmVsIFJlc2VydmF0aW9uID09PQorCitJbiBsb2FkZWQgbmV0d29yaywgZWFjaCBjZWxsIHNob3VsZCByZXNlcnZlIHNvbWUgY2hhbm5lbHMgZm9yIGhhbmRvdmVycywKK3JhdGhlciB0aGFuIHVzaW5nIGFsbCBvZiB0aGVtIGZvciBuZXcgY2FsbCBlc3RhYmxpc2htZW50LiAgVGhpcyByZWR1Y2VzIHRoZQorbmVlZCB0byBkcm9wIGNhbGxzIGR1ZSB0byBmYWlsaW5nIGhhbmRvdmVycywgYXQgdGhlIGV4cGVuc2Ugb2YgZmFpbGluZyBuZXcgY2FsbAorYXR0ZW1wdHMuCisKKz09PSBEeW5hbWljIEhPIE1hcmdpbiA9PT0KKworVGhlIGhhbmRvdmVyIG1hcmdpbiAoaHlzdGVyZXNpcykgc2hvdWxkIGRlcGVuZCBvbiB0aGUgUlhRVUFMLiBPcHRpbWFsIHJlc3VsdHMKK3dlcmUgYWNoaWV2ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgorKiBSWFFVQUwgPD0gNDogOSBkQgorKiBSWFFVQUwgPT0gNTogNiBkQgorKiBSWFFVQUwgPj0gNjogMSBkQgorCisKKworPT0gQWN0dWFsIEhhbmRvdmVyIG9uIGEgcHJvdG9jb2wgbGV2ZWwgPT0KKworQWZ0ZXIgdGhlIEJTQyBoYXMgZGVjaWRlZCBhIGhhbmRvdmVyIHNoYWxsIGJlIGRvbmUsIGl0IGhhcyB0bworCisjIGFsbG9jYXRlIGEgY2hhbm5lbCBhdCB0aGUgbmV3IEJUUworIyBhbGxvY2F0ZSBhIGhhbmRvdmVyIHJlZmVyZW5jZQorIyBhY3RpdmF0ZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTIHNpZGUgdXNpbmcgUlNMIENIQU5ORUwgQUNUSVZBVElPTiwKKyAgaW5kaWNhdGluZyB0aGUgSE8gcmVmZXJlbmNlCisjIEJUUyByZXNwb25kcyB3aXRoIENIQU4gQUNUIEFDSywgaW5jbHVkaW5nIEdTTSBmcmFtZSBudW1iZXIKKyMgQlNDIHNlbmRzIDA0LjA4IEhPIENNRCB0byBNUyB1c2luZyBvbGQgQlRTCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0IGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkY2ZlYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0CkBAIC0wLDAgKzEsMjEgQEAKK29tbCBpbnRlcmZhY2UgZGVzaWduIG5vdGVzCisKK3Byb2JsZW1zOgorCisqIHRoZXJlIGlzIG5vIHdheSBob3cgdG8gdGFnIGEgY29tbWFuZCBzZW50IHRvIHRoZSBCVFMsIHdpdGggdGhlIHJlc3BvbnNlCisgIGhhdmluZyB0aGUgc2FtZSB0YWcgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGNvbW1hbmQKKyogdGhlcmVmb3JlLCB3ZSBjYW4gaGF2ZSBlLmcuIGJvdGggdGhlIEJTQyBhbmQgdGhlIE9NTCBpbnRlcmZhY2Ugc2VuZCBhCisgIFNFVCBBVFRSSUJVVEUgbWVzc2FnZSwgd2hlcmUgdGhlIHJlc3BvbnNlcyB3b3VsZCBlbmQgdXAgYXQgdGhlIHdyb25nCisgIHF1ZXJ5LgorCit0aGUgb25seSBwb3NzaWJsZSBzb2x1dGlvbnMgaSBjYW4gaW1hZ2luZToKKyogaGF2ZSBzb21lIGtpbmQgb2YgZXhjbHVzaXZlIGxvY2tpbmcsIHdoZXJlIHRoZSBPTUwgaW50ZXJmYWNlIGdldHMgYmxvY2tlZAorICBmcm9tIHRoZSBCU0MgYW5kIGlzIGV4Y2x1c2l2ZWx5IGFzc2lnbmVkIHRvIHRoZSBPTUwgY29uc29sZSB1bnRpbCBhbGwgY29tbWFuZHMKKyAgb2YgdGhlIE9NTCBjb25zb2xlIGhhdmUgdGVybWluYXRlZC4gIFRoaXMgY2FuIGVpdGhlciBiZSBkb25lIGV4cGxpY2l0bHkKKyAgZHluYW1pY2FsbHkgb3Igb24gZGVtYW5kCisKKyogdXNlIHRoZSBPTUwgaW50ZXJmYWNlIHN5bmNocm9ub3VzbHksIGkuZS4gYWx3YXlzIHdhaXQgZm9yIHRoZSByZXNwb25zZSBmcm9tCisgIHRoZSBCVFMgYmVmb3JlCisKKyogdW5pbGF0ZXJhbCAvIHVuc29saWNpdGVkIG1lc3NhZ2VzIG5lZWQgdG8gYmUgYnJvYWRjYXN0ZWQgdG8gYm90aCB0aGUgQlNDIGFuZAorICB0aGUgT01MIGNvbnNvbGUKZGlmZiAtLWdpdCBhL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuIGIvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjJhZDRhNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuCkBAIC0wLDAgKzEsMTUxIEBACisjIS9iaW4vc2gKKyMgUHJpbnQgYSB2ZXJzaW9uIHN0cmluZy4KK3NjcmlwdHZlcnNpb249MjAxMC0wMS0yOC4wMQorCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBUaGlzIHNjcmlwdCBpcyBkZXJpdmVkIGZyb20gR0lULVZFUlNJT04tR0VOIGZyb20gR0lUOiBodHRwOi8vZ2l0Lm9yLmN6Ly4KKyMgSXQgbWF5IGJlIHJ1biB0d28gd2F5czoKKyMgLSBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgaW4gd2hpY2ggdGhlICJnaXQgZGVzY3JpYmUiIGNvbW1hbmQgYmVsb3cKKyMgICBwcm9kdWNlcyB1c2VmdWwgb3V0cHV0ICh0aHVzIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgc2lnbmVkIHRhZykKKyMgLSBmcm9tIGEgbm9uLWdpdC1yZXBvIGRpcmVjdG9yeSBjb250YWluaW5nIGEgLnRhcmJhbGwtdmVyc2lvbiBmaWxlLCB3aGljaAorIyAgIHByZXN1bWVzIHRoaXMgc2NyaXB0IGlzIGludm9rZWQgbGlrZSAiLi9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbiIuCisKKyMgSW4gb3JkZXIgdG8gdXNlIGludHJhLXZlcnNpb24gc3RyaW5ncyBpbiB5b3VyIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdHdvCisjIHNlcGFyYXRlIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBmaWxlczoKKyMKKyMgLnRhcmJhbGwtdmVyc2lvbiAtIHByZXNlbnQgb25seSBpbiBhIGRpc3RyaWJ1dGlvbiB0YXJiYWxsLCBhbmQgbm90IGluCisjICAgYSBjaGVja2VkLW91dCByZXBvc2l0b3J5LiAgQ3JlYXRlZCB3aXRoIGNvbnRlbnRzIHRoYXQgd2VyZSBsZWFybmVkIGF0CisjICAgdGhlIGxhc3QgdGltZSBhdXRvY29uZiB3YXMgcnVuLCBhbmQgdXNlZCBieSBnaXQtdmVyc2lvbi1nZW4uICBNdXN0IG5vdAorIyAgIGJlIHByZXNlbnQgaW4gZWl0aGVyICQoc3JjZGlyKSBvciAkKGJ1aWxkZGlyKSBmb3IgZ2l0LXZlcnNpb24tZ2VuIHRvCisjICAgZ2l2ZSBhY2N1cmF0ZSBhbnN3ZXJzIGR1cmluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBhIGNoZWNrZWQgb3V0IHRyZWUsCisjICAgYnV0IG11c3QgYmUgcHJlc2VudCBpbiBhIHRhcmJhbGwgd2hlbiB0aGVyZSBpcyBubyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgorIyAgIFRoZXJlZm9yZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gYW55IGRlcGVuZGVuY2llcy4gIEdOVW1ha2VmaWxlIGhhcworIyAgIGhvb2tzIHRvIGZvcmNlIGEgcmVjb25maWd1cmUgYXQgZGlzdHJpYnV0aW9uIHRpbWUgdG8gZ2V0IHRoZSB2YWx1ZQorIyAgIGNvcnJlY3QsIHdpdGhvdXQgcGVuYWxpemluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBleHRyYSByZWNvbmZpZ3VyZXMuCisjCisjIC52ZXJzaW9uIC0gcHJlc2VudCBpbiBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkgYW5kIGluIGEgZGlzdHJpYnV0aW9uCisjICAgdGFyYmFsbC4gIFVzYWJsZSBpbiBkZXBlbmRlbmNpZXMsIHBhcnRpY3VsYXJseSBmb3IgZmlsZXMgdGhhdCBkb24ndAorIyAgIHdhbnQgdG8gZGVwZW5kIG9uIGNvbmZpZy5oIGJ1dCBkbyB3YW50IHRvIHRyYWNrIHZlcnNpb24gY2hhbmdlcy4KKyMgICBEZWxldGUgdGhpcyBmaWxlIHByaW9yIHRvIGFueSBhdXRvY29uZiBydW4gd2hlcmUgeW91IHdhbnQgdG8gcmVidWlsZAorIyAgIGZpbGVzIHRvIHBpY2sgdXAgYSB2ZXJzaW9uIHN0cmluZyBjaGFuZ2U7IGFuZCBsZWF2ZSBpdCBzdGFsZSB0bworIyAgIG1pbmltaXplIHJlYnVpbGQgdGltZSBhZnRlciB1bnJlbGF0ZWQgY2hhbmdlcyB0byBjb25maWd1cmUgc291cmNlcy4KKyMKKyMgSXQgaXMgcHJvYmFibHkgd2lzZSB0byBhZGQgdGhlc2UgdHdvIGZpbGVzIHRvIC5naXRpZ25vcmUsIHNvIHRoYXQgeW91CisjIGRvbid0IGFjY2lkZW50YWxseSBjb21taXQgZWl0aGVyIGdlbmVyYXRlZCBmaWxlLgorIworIyBVc2UgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgY29uZmlndXJlLmFjLCBzbyB0aGF0ICQoVkVSU0lPTikgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIHVwLXRvLWRhdGUgZWFjaCB0aW1lIGNvbmZpZ3VyZSBpcyBydW4gKGFuZCBub3RlIHRoYXQKKyMgc2luY2UgY29uZmlndXJlLmFjIG5vIGxvbmdlciBpbmNsdWRlcyBhIHZlcnNpb24gc3RyaW5nLCBNYWtlZmlsZSBydWxlcworIyBzaG91bGQgbm90IGRlcGVuZCBvbiBjb25maWd1cmUuYWMgZm9yIHZlcnNpb24gdXBkYXRlcykuCisjCisjIEFDX0lOSVQoW0dOVSBwcm9qZWN0XSwKKyMgICAgICAgICBtNF9lc3lzY21kKFtidWlsZC1hdXgvZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKyMgICAgICAgICBbYnVnLXByb2plY3RAZXhhbXBsZV0pCisjCisjIFRoZW4gdXNlIHRoZSBmb2xsb3dpbmcgbGluZXMgaW4geW91ciBNYWtlZmlsZS5hbSwgc28gdGhhdCAudmVyc2lvbgorIyB3aWxsIGJlIHByZXNlbnQgZm9yIGRlcGVuZGVuY2llcywgYW5kIHNvIHRoYXQgLnRhcmJhbGwtdmVyc2lvbiB3aWxsCisjIGV4aXN0IGluIGRpc3RyaWJ1dGlvbiB0YXJiYWxscy4KKyMKKyMgQlVJTFRfU09VUkNFUyA9ICQodG9wX3NyY2RpcikvLnZlcnNpb24KKyMgJCh0b3Bfc3JjZGlyKS8udmVyc2lvbjoKKyMJZWNobyAkKFZFUlNJT04pID4gJEAtdCAmJiBtdiAkQC10ICRACisjIGRpc3QtaG9vazoKKyMJZWNobyAkKFZFUlNJT04pID4gJChkaXN0ZGlyKS8udGFyYmFsbC12ZXJzaW9uCisKK2Nhc2UgJCMgaW4KKyAgICAxKSA7OworICAgICopIGVjaG8gMT4mMiAiVXNhZ2U6ICQwIFwkc3JjZGlyLy50YXJiYWxsLXZlcnNpb24iOyBleGl0IDE7OworZXNhYworCit0YXJiYWxsX3ZlcnNpb25fZmlsZT0kMQorbmw9JworJworCisjIEZpcnN0IHNlZSBpZiB0aGVyZSBpcyBhIHRhcmJhbGwtb25seSB2ZXJzaW9uIGZpbGUuCisjIHRoZW4gdHJ5ICJnaXQgZGVzY3JpYmUiLCB0aGVuIGRlZmF1bHQuCitpZiB0ZXN0IC1mICR0YXJiYWxsX3ZlcnNpb25fZmlsZQordGhlbgorICAgIHY9YGNhdCAkdGFyYmFsbF92ZXJzaW9uX2ZpbGVgIHx8IGV4aXQgMQorICAgIGNhc2UgJHYgaW4KKwkqJG5sKikgdj0gOzsgIyByZWplY3QgbXVsdGktbGluZSBvdXRwdXQKKwlbMC05XSopIDs7CisJKikgdj0gOzsKKyAgICBlc2FjCisgICAgdGVzdCAteiAiJHYiIFwKKwkmJiBlY2hvICIkMDogV0FSTklORzogJHRhcmJhbGxfdmVyc2lvbl9maWxlIHNlZW1zIHRvIGJlIGRhbWFnZWQiIDE+JjIKK2ZpCisKK2lmIHRlc3QgLW4gIiR2IgordGhlbgorICAgIDogIyB1c2UgJHYKK2VsaWYgdGVzdCAtZCAuLy4uLy5naXQgXAorICAgICYmIHY9YGdpdCBkZXNjcmliZSAtLWFiYnJldj00IC0tbWF0Y2g9J3YqJyBIRUFEIDI+L2Rldi9udWxsIFwKKwkgIHx8IGdpdCBkZXNjcmliZSAtLWFiYnJldj00IEhFQUQgMj4vZGV2L251bGxgIFwKKyAgICAmJiBjYXNlICR2IGluCisJIFswLTldKikgOzsKKwkgdlswLTldKikgOzsKKwkgKikgKGV4aXQgMSkgOzsKKyAgICAgICBlc2FjCit0aGVuCisgICAgIyBJcyB0aGlzIGEgbmV3IGdpdCB0aGF0IGxpc3RzIG51bWJlciBvZiBjb21taXRzIHNpbmNlIHRoZSBsYXN0CisgICAgIyB0YWcgb3IgdGhlIHByZXZpb3VzIG9sZGVyIHZlcnNpb24gdGhhdCBkaWQgbm90PworICAgICMgICBOZXdlcjogdjYuMTAtNzctZzBmOGZhZWIKKyAgICAjICAgT2xkZXI6IHY2LjEwLWcwZjhmYWViCisgICAgY2FzZSAkdiBpbgorCSotKi0qKSA6IGdpdCBkZXNjcmliZSBpcyBva2F5IHRocmVlIHBhcnQgZmxhdm9yIDs7CisJKi0qKQorCSAgICA6IGdpdCBkZXNjcmliZSBpcyBvbGRlciB0d28gcGFydCBmbGF2b3IKKwkgICAgIyBSZWNyZWF0ZSB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgYW5kIHJld3JpdGUgc3VjaCB0aGF0IHRoZQorCSAgICAjIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyBpZiB3ZSB3ZXJlIHVzaW5nIHRoZSBuZXdlciB2ZXJzaW9uCisJICAgICMgb2YgZ2l0IGRlc2NyaWJlLgorCSAgICB2dGFnPWBlY2hvICIkdiIgfCBzZWQgJ3MvLS4qLy8nYAorCSAgICBudW1jb21taXRzPWBnaXQgcmV2LWxpc3QgIiR2dGFnIi4uSEVBRCB8IHdjIC1sYAorCSAgICB2PWBlY2hvICIkdiIgfCBzZWQgInMvXCguKlwpLVwoLipcKS9cMS0kbnVtY29tbWl0cy1cMi8iYDsKKwkgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIENoYW5nZSB0aGUgZmlyc3QgJy0nIHRvIGEgJy4nLCBzbyB2ZXJzaW9uLWNvbXBhcmluZyB0b29scyB3b3JrIHByb3Blcmx5LgorICAgICMgUmVtb3ZlIHRoZSAiZyIgaW4gZ2l0IGRlc2NyaWJlJ3Mgb3V0cHV0IHN0cmluZywgdG8gc2F2ZSBhIGJ5dGUuCisgICAgdj1gZWNobyAiJHYiIHwgc2VkICdzLy0vLi87cy9cKC4qXCktZy9cMS0vJ2A7CitlbHNlCisgICAgdj1VTktOT1dOCitmaQorCit2PWBlY2hvICIkdiIgfHNlZCAncy9edi8vJ2AKKworIyBEb24ndCBkZWNsYXJlIGEgdmVyc2lvbiAiZGlydHkiIG1lcmVseSBiZWNhdXNlIGEgdGltZSBzdGFtcCBoYXMgY2hhbmdlZC4KK2dpdCBzdGF0dXMgPiAvZGV2L251bGwgMj4mMQorCitkaXJ0eT1gc2ggLWMgJ2dpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQnIDI+L2Rldi9udWxsYCB8fCBkaXJ0eT0KK2Nhc2UgIiRkaXJ0eSIgaW4KKyAgICAnJykgOzsKKyAgICAqKSAjIEFwcGVuZCB0aGUgc3VmZml4IG9ubHkgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkuCisJY2FzZSAkdiBpbgorCSAgKi1kaXJ0eSkgOzsKKwkgICopIHY9IiR2LWRpcnR5IiA7OworCWVzYWMgOzsKK2VzYWMKKworIyBPbWl0IHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyB0aGF0IG00X2VzeXNjbWQgY2FuIHVzZSB0aGUgcmVzdWx0IGRpcmVjdGx5LgorZWNobyAiJHYiIHwgdHIgLWQgJ1wwMTInCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzIEBACitTVUJESVJTID0gb3BlbmJzYyB2dHkgc2NjcAorCitub2luc3RfSEVBREVSUyA9IG1JU0ROaWYuaCBjb21wYXRfYWZfaXNkbi5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaCBiL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2JmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApAQCAtMCwwICsxLDM5IEBACisjaWZkZWYgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKKyN1bmRlZiBBRl9JU0ROCisjdW5kZWYgUEZfSVNETgorCitleHRlcm4JaW50CUFGX0lTRE47CisjZGVmaW5lIFBGX0lTRE4JQUZfSVNETgorCitpbnQJQUZfSVNETjsKKworI2VuZGlmCisKK2V4dGVybiB2b2lkIGluaXRfYWZfaXNkbih2b2lkKTsKKworI2lmZGVmIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworCWludAlzOworCisJLyogdGVzdCBmb3IgbmV3IHZhbHVlICovCisJQUZfSVNETiA9IDM0OworCXMgPSBzb2NrZXQoQUZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAocyA+PSAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorCUFGX0lTRE4gPSAyNzsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KK30KKyNlbHNlCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmggYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDY1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoKKyAqIEF1dGhvcglLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDggIGJ5IEthcnN0ZW4gS2VpbCA8a2tlaWxAbm92ZWxsLmNvbT4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAqIHZlcnNpb24gMi4xIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIG1JU0ROSUZfSAorI2RlZmluZSBtSVNETklGX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworLyoKKyAqIEFCSSBWZXJzaW9uIDMyIGJpdAorICoKKyAqIDw4IGJpdD4gTWFqb3IgdmVyc2lvbgorICoJCS0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGJlY29tZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlCisgKgorICogPDggYml0PiBNaW5vciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgLSBjaGFuZ2VkIGlmIGFueSBpbnRlcmZhY2UgaXMgZXh0ZW5kZWQgYnV0IGJhY2t3YXJkcyBjb21wYXRpYmxlCisgKgorICogPDE2IGJpdD4gUmVsZWFzZSBudW1iZXIKKyAqICAgICAgICAgICAgICAtIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvbiBldmVyeSBjaGVja2luCisgKi8KKyNkZWZpbmUJTUlTRE5fTUFKT1JfVkVSU0lPTgkxCisjZGVmaW5lCU1JU0ROX01JTk9SX1ZFUlNJT04JMQorI2RlZmluZSBNSVNETl9SRUxFQVNFCQkyMAorCisvKiBwcmltaXRpdmVzIGZvciBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogZ2VuZXJlbGwgZm9ybWF0CisgKiA8MTYgIGJpdCAgMCA+CisgKiA8OCAgYml0IGNvbW1hbmQ+CisgKiAgICBCSVQgOCA9IDEgTEFZRVIgcHJpdmF0ZQorICogICAgQklUIDcgPSAxIGFuc3dlcgorICogICAgQklUIDYgPSAxIERBVEEKKyAqIDw4ICBiaXQgdGFyZ2V0IGxheWVyIG1hc2s+CisgKgorICogTGF5ZXIgPSAwMCBpcyByZXNlcnZlZCBmb3IgZ2VuZXJhbCBjb21tYW5kcworICAgTGF5ZXIgPSAwMSAgTDIgLT4gSFcKKyAgIExheWVyID0gMDIgIEhXIC0+IEwyCisgICBMYXllciA9IDA0ICBMMyAtPiBMMgorICAgTGF5ZXIgPSAwOCAgTDIgLT4gTDMKKyAqIExheWVyID0gRkYgaXMgcmVzZXJ2ZWQgZm9yIGJyb2FkY2FzdCBjb21tYW5kcworICovCisKKyNkZWZpbmUgTUlTRE5fQ01ETUFTSwkJMHhmZjAwCisjZGVmaW5lIE1JU0ROX0xBWUVSTUFTSwkJMHgwMGZmCisKKy8qIGdlbmVyZWxsIGNvbW1hbmRzICovCisjZGVmaW5lIE9QRU5fQ0hBTk5FTAkJMHgwMTAwCisjZGVmaW5lIENMT1NFX0NIQU5ORUwJCTB4MDIwMAorI2RlZmluZSBDT05UUk9MX0NIQU5ORUwJCTB4MDMwMAorI2RlZmluZSBDSEVDS19EQVRBCQkweDA0MDAKKworLyogbGF5ZXIgMiAtPiBsYXllciAxICovCisjZGVmaW5lIFBIX0FDVElWQVRFX1JFUQkJMHgwMTAxCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfUkVRCTB4MDIwMQorI2RlZmluZSBQSF9EQVRBX1JFUQkJMHgyMDAxCisjZGVmaW5lIE1QSF9BQ1RJVkFURV9SRVEJMHgwNTAxCisjZGVmaW5lIE1QSF9ERUFDVElWQVRFX1JFUQkweDA2MDEKKyNkZWZpbmUgTVBIX0lORk9STUFUSU9OX1JFUQkweDA3MDEKKyNkZWZpbmUgUEhfQ09OVFJPTF9SRVEJCTB4MDgwMQorCisvKiBsYXllciAxIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgUEhfQUNUSVZBVEVfSU5ECQkweDAxMDIKKyNkZWZpbmUgUEhfQUNUSVZBVEVfQ05GCQkweDQxMDIKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9JTkQJMHgwMjAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfQ05GCTB4NDIwMgorI2RlZmluZSBQSF9EQVRBX0lORAkJMHgyMDAyCisjZGVmaW5lIFBIX0RBVEFfRV9JTkQJCTB4MzAwMgorI2RlZmluZSBNUEhfQUNUSVZBVEVfSU5ECTB4MDUwMgorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9JTkQJMHgwNjAyCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9JTkQJMHgwNzAyCisjZGVmaW5lIFBIX0RBVEFfQ05GCQkweDYwMDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9JTkQJCTB4MDgwMgorI2RlZmluZSBQSF9DT05UUk9MX0NORgkJMHg0ODAyCisKKy8qIGxheWVyIDMgLT4gbGF5ZXIgMiAqLworI2RlZmluZSBETF9FU1RBQkxJU0hfUkVRCTB4MTAwNAorI2RlZmluZSBETF9SRUxFQVNFX1JFUQkJMHgxMTA0CisjZGVmaW5lIERMX0RBVEFfUkVRCQkweDMwMDQKKyNkZWZpbmUgRExfVU5JVERBVEFfUkVRCQkweDMxMDQKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fUkVRCTB4MDAwNAorCisvKiBsYXllciAyIC0+IGxheWVyIDMgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX0lORAkweDEwMDgKKyNkZWZpbmUgRExfRVNUQUJMSVNIX0NORgkweDUwMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9JTkQJCTB4MTEwOAorI2RlZmluZSBETF9SRUxFQVNFX0NORgkJMHg1MTA4CisjZGVmaW5lIERMX0RBVEFfSU5ECQkweDMwMDgKKyNkZWZpbmUgRExfVU5JVERBVEFfSU5ECQkweDMxMDgKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fSU5ECTB4MDAwOAorCisvKiBpbnRlcm4gbGF5ZXIgMiBtYW5hZ21lbnQgKi8KKyNkZWZpbmUgTURMX0FTU0lHTl9SRVEJCTB4MTgwNAorI2RlZmluZSBNRExfQVNTSUdOX0lORAkJMHgxOTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfUkVRCQkweDFBMDQKKyNkZWZpbmUgTURMX1JFTU9WRV9JTkQJCTB4MUIwNAorI2RlZmluZSBNRExfU1RBVFVTX1VQX0lORAkweDFDMDQKKyNkZWZpbmUgTURMX1NUQVRVU19ET1dOX0lORAkweDFEMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VSV9JTkQJMHgxRTA0CisjZGVmaW5lIE1ETF9FUlJPUl9JTkQJCTB4MUYwNAorI2RlZmluZSBNRExfRVJST1JfUlNQCQkweDVGMDQKKworLyogRExfSU5GT1JNQVRJT05fSU5EIHR5cGVzICovCisjZGVmaW5lIERMX0lORk9fTDJfQ09OTkVDVAkweDAwMDEKKyNkZWZpbmUgRExfSU5GT19MMl9SRU1PVkVECTB4MDAwMgorCisvKiBQSF9DT05UUk9MIHR5cGVzICovCisvKiBUT1VDSCBUT05FIElTIDB4MjBYWCAgWFggIjAiLi4uIjkiLCAiQSIsIkIiLCJDIiwiRCIsIioiLCIjIiAqLworI2RlZmluZSBEVE1GX1RPTkVfVkFMCQkweDIwMDAKKyNkZWZpbmUgRFRNRl9UT05FX01BU0sJCTB4MDA3RgorI2RlZmluZSBEVE1GX1RPTkVfU1RBUlQJCTB4MjEwMAorI2RlZmluZSBEVE1GX1RPTkVfU1RPUAkJMHgyMjAwCisjZGVmaW5lIERUTUZfSEZDX0NPRUYJCTB4NDAwMAorI2RlZmluZSBEU1BfQ09ORl9KT0lOCQkweDI0MDMKKyNkZWZpbmUgRFNQX0NPTkZfU1BMSVQJCTB4MjQwNAorI2RlZmluZSBEU1BfUkVDRUlWRV9PRkYJCTB4MjQwNQorI2RlZmluZSBEU1BfUkVDRUlWRV9PTgkJMHgyNDA2CisjZGVmaW5lIERTUF9FQ0hPX09OCQkweDI0MDcKKyNkZWZpbmUgRFNQX0VDSE9fT0ZGCQkweDI0MDgKKyNkZWZpbmUgRFNQX01JWF9PTgkJMHgyNDA5CisjZGVmaW5lIERTUF9NSVhfT0ZGCQkweDI0MGEKKyNkZWZpbmUgRFNQX0RFTEFZCQkweDI0MGIKKyNkZWZpbmUgRFNQX0pJVFRFUgkJMHgyNDBjCisjZGVmaW5lIERTUF9UWERBVEFfT04JCTB4MjQwZAorI2RlZmluZSBEU1BfVFhEQVRBX09GRgkJMHgyNDBlCisjZGVmaW5lIERTUF9UWF9ERUpJVFRFUgkJMHgyNDBmCisjZGVmaW5lIERTUF9UWF9ERUpfT0ZGCQkweDI0MTAKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PTgkweDI0MTEKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PRkYJMHgyNDEyCisjZGVmaW5lIERTUF9WT0xfQ0hBTkdFX1RYCTB4MjQxMworI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9SWAkweDI0MTQKKyNkZWZpbmUgRFNQX0JGX0VOQUJMRV9LRVkJMHgyNDE1CisjZGVmaW5lIERTUF9CRl9ESVNBQkxFCQkweDI0MTYKKyNkZWZpbmUgRFNQX0JGX0FDQ0VQVAkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9SRUpFQ1QJCTB4MjQxNworI2RlZmluZSBEU1BfUElQRUxJTkVfQ0ZHCTB4MjQxOAorI2RlZmluZSBIRkNfVk9MX0NIQU5HRV9UWAkweDI2MDEKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfUlgJMHgyNjAyCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PTgkJMHgyNjAzCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PRkYJMHgyNjA0CisKKy8qIERTUF9UT05FX1BBVFRfT04gcGFyYW1ldGVyICovCisjZGVmaW5lIFRPTkVfT0ZGCQkJMHgwMDAwCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxUT05FCQkweDAwMDEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xERElBTFRPTkUJCTB4MDAwMgorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxUT05FCQkweDAwMDMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fRElBTFBCWAkJMHgwMDA0CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxQQlgJCTB4MDAwNQorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxQQlgJCTB4MDAwNgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HSU5HCQkweDAwMDcKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR0lORwkJMHgwMDA4CisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR1BCWAkJMHgwMDBiCisjZGVmaW5lIFRPTkVfR0VSTUFOX1JJTkdQQlgJCTB4MDAwYworI2RlZmluZSBUT05FX0dFUk1BTl9PTERSSU5HUEJYCQkweDAwMGQKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9SSU5HSU5HCQkweDAwMGUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQlVTWQkJMHgwMDBmCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MREJVU1kJCTB4MDAxMAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0JVU1kJCTB4MDAxMQorI2RlZmluZSBUT05FX0dFUk1BTl9IQU5HVVAJCTB4MDAxMgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERIQU5HVVAJCTB4MDAxMworI2RlZmluZSBUT05FX0FNRVJJQ0FOX0hBTkdVUAkJMHgwMDE0CisjZGVmaW5lIFRPTkVfU1BFQ0lBTF9JTkZPCQkweDAwMTUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fR0FTU0VOQkVTRVRaVAkweDAwMTYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQVVGU0NIQUxUVE9OCTB4MDAxNgorCisvKiBNUEhfSU5GT1JNQVRJT05fSU5EICovCisjZGVmaW5lIEwxX1NJR05BTF9MT1NfT0ZGCTB4MDAxMAorI2RlZmluZSBMMV9TSUdOQUxfTE9TX09OCTB4MDAxMQorI2RlZmluZSBMMV9TSUdOQUxfQUlTX09GRgkweDAwMTIKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PTgkweDAwMTMKKyNkZWZpbmUgTDFfU0lHTkFMX1JESV9PRkYJMHgwMDE0CisjZGVmaW5lIEwxX1NJR05BTF9SRElfT04JMHgwMDE1CisjZGVmaW5lIEwxX1NJR05BTF9TTElQX1JYCTB4MDAyMAorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9UWAkweDAwMjEKKworLyoKKyAqIHByb3RvY29sIGlkcworICogRCBjaGFubmVsIDEtMzEKKyAqIEIgY2hhbm5lbCAzMyAtIDYzCisgKi8KKworI2RlZmluZSBJU0ROX1BfTk9ORQkJMAorI2RlZmluZSBJU0ROX1BfQkFTRQkJMAorI2RlZmluZSBJU0ROX1BfVEVfUzAJCTB4MDEKKyNkZWZpbmUgSVNETl9QX05UX1MwICAJCTB4MDIKKyNkZWZpbmUgSVNETl9QX1RFX0UxCQkweDAzCisjZGVmaW5lIElTRE5fUF9OVF9FMSAgCQkweDA0CisjZGVmaW5lIElTRE5fUF9URV9VUDAJCTB4MDUKKyNkZWZpbmUgSVNETl9QX05UX1VQMAkJMHgwNgorCisjZGVmaW5lIElTX0lTRE5fUF9URShwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfVEVfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9URSkpCisjZGVmaW5lIElTX0lTRE5fUF9OVChwKSAoKHAgPT0gSVNETl9QX05UX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfTlRfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9OVCkpCisjZGVmaW5lIElTX0lTRE5fUF9TMChwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfUzApKQorI2RlZmluZSBJU19JU0ROX1BfRTEocCkgKChwID09IElTRE5fUF9URV9FMSkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSkKKyNkZWZpbmUgSVNfSVNETl9QX1VQMChwKSAoKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX05UX1VQMCkpCisKKworI2RlZmluZSBJU0ROX1BfTEFQRF9URQkJMHgxMAorI2RlZmluZQlJU0ROX1BfTEFQRF9OVAkJMHgxMQorCisjZGVmaW5lIElTRE5fUF9CX01BU0sJCTB4MWYKKyNkZWZpbmUgSVNETl9QX0JfU1RBUlQJCTB4MjAKKworI2RlZmluZSBJU0ROX1BfQl9SQVcJCTB4MjEKKyNkZWZpbmUgSVNETl9QX0JfSERMQwkJMHgyMgorI2RlZmluZSBJU0ROX1BfQl9YNzVTTFAJCTB4MjMKKyNkZWZpbmUgSVNETl9QX0JfTDJEVE1GCQkweDI0CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQCQkweDI1CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQSERMQwkweDI2CisKKyNkZWZpbmUgT1BUSU9OX0wyX1BNWAkJMQorI2RlZmluZSBPUFRJT05fTDJfUFRQCQkyCisjZGVmaW5lIE9QVElPTl9MMl9GSVhFRFRFSQkzCisjZGVmaW5lIE9QVElPTl9MMl9DTEVBTlVQCTQKKworLyogc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBsaW51eC9rb2JqZWN0Lmg6S09CSl9OQU1FX0xFTiAqLworI2RlZmluZSBNSVNETl9NQVhfSURMRU4JCTIwCisKK3N0cnVjdCBtSVNETmhlYWQgeworCXVuc2lnbmVkIGludAlwcmltOworCXVuc2lnbmVkIGludAlpZDsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE1JU0ROX0hFQURFUl9MRU4Jc2l6ZW9mKHN0cnVjdCBtSVNETmhlYWQpCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJCTIwNDgKKyNkZWZpbmUgTUFYX0RBVEFfTUVNCQkoTUFYX0RBVEFfU0laRSArIE1JU0ROX0hFQURFUl9MRU4pCisjZGVmaW5lIE1BWF9ERlJBTUVfTEVOCQkyNjAKKworI2RlZmluZSBNSVNETl9JRF9BRERSX01BU0sJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9NQVNLCTB4RkYwMAorI2RlZmluZSBNSVNETl9JRF9TQVBJX01BU0sJMHgwMEZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9BTlkJMHg3RjAwCisKKyNkZWZpbmUgTUlTRE5fSURfQU5ZCQkweEZGRkYKKyNkZWZpbmUgTUlTRE5fSURfTk9ORQkJMHhGRkZFCisKKyNkZWZpbmUgR1JPVVBfVEVJCQkxMjcKKyNkZWZpbmUgVEVJX1NBUEkJCTYzCisjZGVmaW5lIENUUkxfU0FQSQkJMAorCisjZGVmaW5lIE1JU0ROX01BWF9DSEFOTkVMCTEyNworI2RlZmluZSBNSVNETl9DSE1BUF9TSVpFCSgoTUlTRE5fTUFYX0NIQU5ORUwgKyAxKSA+PiAzKQorCisjZGVmaW5lIFNPTF9NSVNETgkwCisKK3N0cnVjdCBzb2NrYWRkcl9tSVNETiB7CisJc2FfZmFtaWx5X3QgICAgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJZGV2OworCXVuc2lnbmVkIGNoYXIJY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyCXNhcGk7CisJdW5zaWduZWQgY2hhcgl0ZWk7Cit9OworCitzdHJ1Y3QgbUlTRE52ZXJzaW9uIHsKKwl1bnNpZ25lZCBjaGFyCW1ham9yOworCXVuc2lnbmVkIGNoYXIJbWlub3I7CisJdW5zaWduZWQgc2hvcnQJcmVsZWFzZTsKK307CisKKyNkZWZpbmUgTUFYX0RFVklDRV9JRCA2MworCitzdHJ1Y3QgbUlTRE5fZGV2aW5mbyB7CisJdV9pbnQJCQlpZDsKKwl1X2ludAkJCURwcm90b2NvbHM7CisJdV9pbnQJCQlCcHJvdG9jb2xzOworCXVfaW50CQkJcHJvdG9jb2w7CisJdV9jaGFyCQkJY2hhbm5lbG1hcFtNSVNETl9DSE1BUF9TSVpFXTsKKwl1X2ludAkJCW5yYmNoYW47CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBtSVNETl9kZXZyZW5hbWUgeworCXVfaW50CQkJaWQ7CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBwaF9pbmZvX2NoIHsKKwlpbnQzMl90IAkJcHJvdG9jb2w7CisJaW50NjRfdAkJCUZsYWdzOworfTsKKworc3RydWN0IHBoX2luZm9fZGNoIHsKKwlzdHJ1Y3QgcGhfaW5mb19jaAljaDsKKwlpbnQxNl90CQkJc3RhdGU7CisJaW50MTZfdAkJCW51bV9iY2g7Cit9OworCitzdHJ1Y3QgcGhfaW5mbyB7CisJc3RydWN0IHBoX2luZm9fZGNoCWRjaDsKKwlzdHJ1Y3QgcGhfaW5mb19jaCAJYmNoW107Cit9OworCisvKiB0aW1lciBkZXZpY2UgaW9jdGwgKi8KKyNkZWZpbmUgSU1BRERUSU1FUglfSU9SKCdJJywgNjQsIGludCkKKyNkZWZpbmUgSU1ERUxUSU1FUglfSU9SKCdJJywgNjUsIGludCkKKy8qIHNvY2tldCBpb2N0bHMgKi8KKyNkZWZpbmUJSU1HRVRWRVJTSU9OCV9JT1IoJ0knLCA2NiwgaW50KQorI2RlZmluZQlJTUdFVENPVU5UCV9JT1IoJ0knLCA2NywgaW50KQorI2RlZmluZSBJTUdFVERFVklORk8JX0lPUignSScsIDY4LCBpbnQpCisjZGVmaW5lIElNQ1RSTFJFUQlfSU9SKCdJJywgNjksIGludCkKKyNkZWZpbmUgSU1DTEVBUl9MMglfSU9SKCdJJywgNzAsIGludCkKKyNkZWZpbmUgSU1TRVRERVZOQU1FCV9JT1IoJ0knLCA3MSwgc3RydWN0IG1JU0ROX2RldnJlbmFtZSkKKworc3RhdGljIGlubGluZSBpbnQKK3Rlc3RfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJaWYgKG5yIDw9IE1JU0ROX01BWF9DSEFOTkVMKQorCQlyZXR1cm4gbWFwW25yID4+IDNdICYgKDEgPDwgKG5yICYgNykpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSB8PSAoMSA8PCAobnIgJiA3KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xlYXJfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJbWFwW25yID4+IDNdICY9IH4oMSA8PCAobnIgJiA3KSk7Cit9CisKKy8qIENPTlRST0xfQ0hBTk5FTCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUT1AJCTB4MDAwMAorI2RlZmluZSBNSVNETl9DVFJMX0xPT1AJCQkweDAwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9DT05ORUNUCQkweDAwMDIKKyNkZWZpbmUgTUlTRE5fQ1RSTF9ESVNDT05ORUNUCQkweDAwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01DT05ORUNUCQkweDAwMTAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01ESVNDT05ORUNUCTB4MDAyMAorI2RlZmluZSBNSVNETl9DVFJMX1NFVFBFRVIJCTB4MDA0MAorI2RlZmluZSBNSVNETl9DVFJMX1VOU0VUUEVFUgkJMHgwMDgwCisjZGVmaW5lIE1JU0ROX0NUUkxfUlhfT0ZGCQkweDAxMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9GSUxMX0VNUFRZCQkweDAyMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9HRVRQRUVSCQkweDA0MDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFU19PUAkweDIwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFUwkJMHgyMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX09QCQkweDQwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0NPTk4JCTB4NDAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19QQ01fRElTQwkJMHg0MDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfSk9JTgkweDQwMDMKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfQ09ORl9TUExJVAkweDQwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUkVDRUlWRV9PRkYJMHg0MDA1CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT04JMHg0MDA2CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0VDSE9DQU5fT04gCTB4NDAwNworI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09GRiAJMHg0MDA4CisKKworLyogc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fVElNRV9TVEFNUAkJMHgwMDAxCisKK3N0cnVjdCBtSVNETl9jdHJsX3JlcSB7CisJaW50CQlvcDsKKwlpbnQJCWNoYW5uZWw7CisJaW50CQlwMTsKKwlpbnQJCXAyOworfTsKKworLyogbXV4ZXIgb3B0aW9ucyAqLworI2RlZmluZSBNSVNETl9PUFRfQUxMCQkxCisjZGVmaW5lIE1JU0ROX09QVF9URUlNR1IJMgorCisjZW5kaWYgLyogbUlTRE5JRl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mzk5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExIEBACitub2luc3RfSEVBREVSUyA9IGFiaXNfbm0uaCBhYmlzX3JzbC5oIGRiLmggZ3NtXzA0XzA4LmggZ3NtX2RhdGEuaCBcCisJCSBnc21fc3Vic2NyaWJlci5oIGdzbV8wNF8xMS5oIGRlYnVnLmggc2lnbmFsLmggXAorCQkgbWlzZG4uaCBjaGFuX2FsbG9jLmggdGVsbmV0X2ludGVyZmFjZS5oIHBhZ2luZy5oIFwKKwkJIHN1YmNoYW5fZGVtdXguaCB0cmF1X2ZyYW1lLmggZTFfaW5wdXQuaCB0cmF1X211eC5oIFwKKwkJIGlwYWNjZXNzLmggcnMyMzIuaCBvcGVuYnNjZGVmaW5lcy5oIHJ0cF9wcm94eS5oIFwKKwkJIGJzY19ybGwuaCBtbmNjLmggdHJhbnNhY3Rpb24uaCB1c3NkLmggZ3NtXzA0XzgwLmggXAorCQkgc2lsZW50X2NhbGwuaCBtZ2NwLmggbWVhc19yZXAuaCByZXN0X29jdGV0cy5oIFwKKwkJIHN5c3RlbV9pbmZvcm1hdGlvbi5oIGhhbmRvdmVyLmggbWdjcF9pbnRlcm5hbC5oCisKK29wZW5ic2NfSEVBREVSUyA9IGdzbV8wNF8wOC5oIG1lYXNfcmVwLmgKK29wZW5ic2NkaXIgPSAkKGluY2x1ZGVkaXIpL29wZW5ic2MKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMwN2UzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTk1fSAorI2RlZmluZSBfTk1fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmg+CisKK3N0cnVjdCBjZWxsX2dsb2JhbF9pZCB7CisJdV9pbnQxNl90IG1jYzsKKwl1X2ludDE2X3QgbW5jOworCXVfaW50MTZfdCBsYWM7CisJdV9pbnQxNl90IGNpOworfTsKKworLyogVGhlIEJDQ0ggaW5mbyBmcm9tIGFuIGlwLmFjY2VzcyB0ZXN0LCBpbiBob3N0IGJ5dGUgb3JkZXIKKyAqIGFuZCBhbHJlYWR5IHBhcnNlZC4uLiAqLworc3RydWN0IGlwYWNfYmNjaF9pbmZvIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdV9pbnQxNl90IGluZm9fdHlwZTsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworCWludDE2X3QgZnJlcV9lcnI7CisJdV9pbnQxNl90IGZyYW1lX29mZnNldDsKKwl1X2ludDMyX3QgZnJhbWVfbnJfb2Zmc2V0OworCXVfaW50OF90IGJzaWM7CisJc3RydWN0IGNlbGxfZ2xvYmFsX2lkIGNnaTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMlsxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJiaXNbMTZdOworCXVfaW50OF90IGJhX2xpc3Rfc2kydGVyWzE2XTsKKwl1X2ludDhfdCBjYV9saXN0X3NpMVsxNl07Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKKy8qIFBVQkxJQyAqLworCitzdHJ1Y3QgbXNnYjsKKworc3RydWN0IGFiaXNfbm1fY2ZnIHsKKwkvKiBjYWxsYmFjayBmb3IgdW5pZGlyZWN0aW9uYWwgcmVwb3J0cyAqLworCWludCAoKnJlcG9ydF9jYikoc3RydWN0IG1zZ2IgKiwKKwkJCSBzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopOworCS8qIGNhbGxiYWNrIGZvciBzb2Z0d2FyZSBhY3RpdmF0ZSByZXF1ZXN0cyBmcm9tIEJUUyAqLworCWludCAoKnN3X2FjdF9yZXEpKHN0cnVjdCBtc2diICopOworfTsKKworZXh0ZXJuIGludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CitpbnQgYWJpc19ubV9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKTsKK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSk7CitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSk7CitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpOworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbik7CitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICptc2cpOworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSk7CisKK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pOworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFNpZW1lbnMgLyBCUy0xMSBzcGVjaWZpYyAqLworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLAorCQkJICB1X2ludDhfdCBpZHgsIHVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LAorCQkJICB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zZXJubyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfcGxsX21vZGUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X2NjbGsoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2Jmbik7CitpbnQgYWJpc19ubV9iczExX3NldF9leHRfdGltZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGJwb3J0LCBlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyBsaW5lX2NmZyk7CitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpOworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb21tYW5kcyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCAKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKTsKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKTsKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpOworCisvKiBGdW5jdGlvbnMgY2FsbGluZyBpbnRvIG90aGVyIGNvZGUgcGFydHMgKi8KK2VudW0gbm1fZXZ0IHsKKwlFVlRfU1RBVEVDSEdfT1BFUiwKKwlFVlRfU1RBVEVDSEdfQURNLAorfTsKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSk7IAorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpOworY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCk7CitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKTsKKyNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MDE4NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKQEAgLTAsMCArMSw4NyBAQAorLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9SU0xfSAorI2RlZmluZSBfUlNMX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsIAorCQkgICAgICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIsCisJCSAgICAgIHVfaW50OF90IGFjdF90eXBlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY2hhbl9tb2RlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgKmNoYW5faWRlbnQsCisJCSAgICAgIHVfaW50OF90IGJzX3Bvd2VyLCB1X2ludDhfdCBtc19wb3dlciwKKwkJICAgICAgdV9pbnQ4X3QgdGEpOworaW50IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhY3RfdHlwZSwgCisJCQkgICAgdV9pbnQ4X3QgdGEsIHVfaW50OF90IGhvX3JlZik7CitpbnQgcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKnRzKTsKK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX3BhZ2luZ19jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcGFnaW5nX2dyb3VwLCB1X2ludDhfdCBsZW4sCisJCSAgIHVfaW50OF90ICptc19pZGVudCwgdV9pbnQ4X3QgY2hhbl9uZWVkZWQpOworaW50IHJzbF9wYWdpbmdfY21kX3N1YnNjcihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBjaGFuX25lZWRlZCwKKwkJCSBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCk7CisKK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworaW50IHJzbF9lc3RhYmxpc2hfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX3JlbGFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpOworCisvKiBpcC5hY2Nlc3Mgc3BlY2ZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9pcGFjY19jcmN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfbWRjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGlwLAorCQkgICB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3QgcnRwX3BheWxvYWQyKTsKK2ludCByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfcGRjaF9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKTsKK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKTsKK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cik7Cit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQkNDSCByZWxhdGVkIGNvZGUgKi8KK2ludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NjaF9zZGNjaF9jb21iKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKTsKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKTsKKworI2VuZGlmIC8qIFJTTF9NVF9IICovCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg5OGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0JTQ19STExfSAorI2RlZmluZSBfQlNDX1JMTF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2VudW0gYnNjX3JsbHJfaW5kIHsKKwlCU0NfUkxMUl9JTkRfRVNUX0NPTkYsCisJQlNDX1JMTFJfSU5EX1JFTF9JTkQsCisJQlNDX1JMTFJfSU5EX0VSUl9JTkQsCisJQlNDX1JMTFJfSU5EX1RJTUVPVVQsCit9OworCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpOwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSk7CisKKyNlbmRpZiAvKiBfQlNDX1JMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2NGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaApAQCAtMCwwICsxLDY2IEBACisvKiBNYW5hZ2VtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZS9yZWxlYXNlIHN0cnVjdCBnc21fbGNoYW4gKi8KKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX0NIQU5fQUxMT0NfSAorI2RlZmluZSBfQ0hBTl9BTExPQ19ICisKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorCisvKiBTcGVjaWFsIGFsbG9jYXRvciBmb3IgQzAgb2YgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCBhbGxvY2F0b3IgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogUmVndWxhciBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3ZvaWQgdHNfZnJlZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKKworLyogRmluZCBhbiBhbGxvY2F0ZWQgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgZm9yIGEgc3BlY2lmaWVkIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpOworCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsIChTRENDSCwgVENILCAuLi4pICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitzdHJ1Y3QgbG9hZF9jb3VudGVyIHsKKwl1bnNpZ25lZCBpbnQgdG90YWw7CisJdW5zaWduZWQgaW50IHVzZWQ7Cit9OworCitzdHJ1Y3QgcGNoYW5fbG9hZCB7CisJc3RydWN0IGxvYWRfY291bnRlciBwY2hhbltHU01fUENIQU5fVU5LTk9XTl07Cit9OworCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCB0cnhfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworI2VuZGlmIC8qIF9DSEFOX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EQl9ICisjZGVmaW5lIF9EQl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKworLyogb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gKi8KK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGRiX3ByZXBhcmUoKTsKK2ludCBkYl9maW5pKCk7CisKKy8qIHN1YnNjcmliZXIgbWFuYWdlbWVudCAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgIGNoYXIgKmltc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9nZXRfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJIGVudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgZmllbGQsCisJCQkJCSBjb25zdCBjaGFyICpzdWJzY3IpOworaW50IGRiX3N5bmNfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgdV9pbnQzMl90KiB0b2tlbik7CitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgY2hhciAqaW1laSk7CitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKTsKKworLyogYXV0aCBpbmZvICovCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIFNNUyBzdG9yZS1hbmQtZm9yd2FyZCAqLworaW50IGRiX3Ntc19zdG9yZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1pbl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX3N1YnNjcl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZGJfc21zX21hcmtfc2VudChzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKworLyogQVBEVSBibG9iIHN0b3JhZ2UgKi8KK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIAorCQkJdV9pbnQ4X3QgYXBkdV9pZF9mbGFncywgdV9pbnQ4X3QgbGVuLAorCQkJdV9pbnQ4X3QgKmFwZHUpOworCisvKiBTdGF0aXN0aWNzIGNvdW50ZXIgc3RvcmFnZSAqLworaW50IGRiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmN0cik7CisKKyNlbmRpZiAvKiBfREJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2N2M2MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmgKQEAgLTAsMCArMSwxMzEgQEAKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgREVCVUcKKworLyogRGVidWcgQXJlYXMgb2YgdGhlIGNvZGUgKi8KK2VudW0geworCURSTEwsCisJRENDLAorCURNTSwKKwlEUlIsCisJRFJTTCwKKwlETk0sCisJRE1OQ0MsCisJRFNNUywKKwlEUEFHLAorCURNRUFTLAorCURNSSwKKwlETUlCLAorCURNVVgsCisJRElOUCwKKwlEU0NDUCwKKwlETVNDLAorCURNR0NQLAorCURITywKKwlEREIsCisJRFJFRiwKKwlEZWJ1Z19MYXN0RW50cnksCit9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCVUdQKHNzLCBmbXQsIGFyZ3MuLi4pIGRlYnVncChzcywgX19GSUxFX18sIF9fTElORV9fLCAwLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHUEMoc3MsIGZtdCwgYXJncy4uLikgZGVidWdwKHNzLCBfX0ZJTEVfXywgX19MSU5FX18sIDEsIGZtdCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUCh4c3MsIGZtdCwgYXJncy4uLikKKyNkZWZpbmUgREVCVUdQQyhzcywgZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKworI2RlZmluZSBzdGF0aWNfYXNzZXJ0KGV4cCwgbmFtZSkgdHlwZWRlZiBpbnQgZHVtbXkjI25hbWUgWyhleHApID8gMSA6IC0xXTsKKworY2hhciAqaGV4ZHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOwordm9pZCBkZWJ1Z3AodW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworCisvKiBuZXcgbG9nZ2luZyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE9HUChzcywgbGV2ZWwsIGZtdCwgYXJncy4uLikgZGVidWdwMihzcywgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgMCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIExPR1BDKHNzLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBkZWJ1Z3AyKHNzLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCAxLCBmbXQsICMjYXJncykKKworLyogZGlmZmVyZW50IGxldmVscyAqLworI2RlZmluZSBMT0dMX0RFQlVHCTEJLyogZGVidWdnaW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR0xfSU5GTwkzCisjZGVmaW5lIExPR0xfTk9USUNFCTUJLyogYWJub3JtYWwvdW5leHBlY3RlZCBjb25kaXRpb24gKi8KKyNkZWZpbmUgTE9HTF9FUlJPUgk3CS8qIGVycm9yIGNvbmRpdGlvbiwgcmVxdWlyZXMgdXNlciBhY3Rpb24gKi8KKyNkZWZpbmUgTE9HTF9GQVRBTAk4CS8qIGZhdGFsLCBwcm9ncmFtIGFib3J0ZWQgKi8KKworLyogY29udGV4dCAqLworI2RlZmluZSBCU0NfQ1RYX0xDSEFOCTAKKyNkZWZpbmUgQlNDX0NUWF9TVUJTQ1IJMQorI2RlZmluZSBCU0NfQ1RYX0JUUwkyCisjZGVmaW5lIEJTQ19DVFhfU0NDUAkzCisKKy8qIHRhcmdldCAqLworCitlbnVtIHsKKwlERUJVR19GSUxURVJfSU1TSSA9IDEgPDwgMCwKKwlERUJVR19GSUxURVJfQUxMID0gMSA8PCAxLAorfTsKKworc3RydWN0IGRlYnVnX2NhdGVnb3J5IHsKKwlpbnQgZW5hYmxlZDsKKwlpbnQgbG9nbGV2ZWw7Cit9OworCitzdHJ1Y3QgZGVidWdfdGFyZ2V0IHsKKwlpbnQgZmlsdGVyX21hcDsKKwljaGFyICppbXNpX2ZpbHRlcjsKKworCisJc3RydWN0IGRlYnVnX2NhdGVnb3J5IGNhdGVnb3JpZXNbRGVidWdfTGFzdEVudHJ5XTsKKwlpbnQgdXNlX2NvbG9yOworCWludCBwcmludF90aW1lc3RhbXA7CisJaW50IGxvZ2xldmVsOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJRklMRSAqb3V0OworCQl9IHRndF9zdGRvdXQ7CisKKwkJc3RydWN0IHsKKwkJCWludCBwcmlvcml0eTsKKwkJfSB0Z3Rfc3lzbG9nOworCisJCXN0cnVjdCB7CisJCQl2b2lkICp2dHk7CisJCX0gdGd0X3Z0eTsKKwl9OworCisgICAgICAgIHZvaWQgKCpvdXRwdXQpIChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKnN0cmluZyk7CisKKyAgICAgICAgc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Cit9OworCisvKiB1c2UgdGhlIGFib3ZlIG1hY3JvcyAqLwordm9pZCBkZWJ1Z3AyKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA2LCA3KSkpOwordm9pZCBkZWJ1Z19pbml0KHZvaWQpOworCisvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK3ZvaWQgZGVidWdfcmVzZXRfY29udGV4dCh2b2lkKTsKK3ZvaWQgZGVidWdfc2V0X2NvbnRleHQoaW50IGN0eCwgdm9pZCAqdmFsdWUpOworCisvKiBmaWx0ZXIgb24gdGhlIHRhcmdldHMgKi8KK3ZvaWQgZGVidWdfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSk7Cit2b2lkIGRlYnVnX3NldF9hbGxfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50KTsKK3ZvaWQgZGVidWdfc2V0X3VzZV9jb2xvcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCk7Cit2b2lkIGRlYnVnX3NldF9wcmludF90aW1lc3RhbXAoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwordm9pZCBkZWJ1Z19zZXRfbG9nX2xldmVsKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGxvZ19sZXZlbCk7Cit2b2lkIGRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyKiBtYXNrKTsKK2ludCBkZWJ1Z19wYXJzZV9sZXZlbChjb25zdCBjaGFyICpsdmwpOworaW50IGRlYnVnX3BhcnNlX2NhdGVnb3J5KGNvbnN0IGNoYXIgKmNhdGVnb3J5KTsKK3ZvaWQgZGVidWdfc2V0X2NhdGVnb3J5X2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBjYXRlZ29yeSwgaW50IGVuYWJsZSwgaW50IGxldmVsKTsKKworCisvKiBtYW5hZ2VtZW50IG9mIHRoZSB0YXJnZXRzICovCitzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkZWJ1Z190YXJnZXRfY3JlYXRlKHZvaWQpOworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIodm9pZCk7Cit2b2lkIGRlYnVnX2FkZF90YXJnZXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0KTsKK3ZvaWQgZGVidWdfZGVsX3RhcmdldChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQpOworI2VuZGlmIC8qIF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNkOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApAQCAtMCwwICsxLDE2OCBAQAorI2lmbmRlZiBfRTFfSU5QVVRfSAorI2RlZmluZSBfRTFfSU5QVVRfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKworI2RlZmluZSBOVU1fRTFfVFMgICAzMgorCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApOworCitzdHJ1Y3QgZTFpbnBfdHM7CisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgeworCS8qIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiB0byB3aGljaCB0aW1lc2xvdCBkbyB3ZSBiZWxvbmc/ICovCisJc3RydWN0IGUxaW5wX3RzICp0czsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgY2hhbm5lbDsKKwkJfSBtaXNkbjsKKwl9IGRyaXZlcjsKK307CisKK2VudW0gZTFpbnBfdHNfdHlwZSB7CisJRTFJTlBfVFNfVFlQRV9OT05FLAorCUUxSU5QX1RTX1RZUEVfU0lHTiwKKwlFMUlOUF9UU19UWVBFX1RSQVUsCit9OworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCWludCBudW07CisKKwkvKiB0byB3aGljaCBsaW5lIGRvIHdlIGJlbG9uZyA/ICovCisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBsaXN0IG9mIGFsbCBzaWduYWxsaW5nIGxpbmtzIG9uIHRoaXMgVFMgKi8KKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCQkvKiB0aW1lciB3aGVuIHRvIGRlcXVldWUgbmV4dCBmcmFtZSAqLworCQkJc3RydWN0IHRpbWVyX2xpc3QgdHhfdGltZXI7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IG1pc2RuOworCQlzdHJ1Y3QgeworCQkJLyogaXAuYWNjZXNzIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IGlwYWNjZXNzOworCisJfSBkcml2ZXI7Cit9OworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqd2FudF93cml0ZSkoc3RydWN0IGUxaW5wX3RzICp0cyk7Cit9OwkKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IG51bTsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogYXJyYXkgb2YgdGltZXN0bG90cyAqLworCXN0cnVjdCBlMWlucF90cyB0c1tOVU1fRTFfVFNdOworCisJc3RydWN0IGUxaW5wX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworfTsKKworLyogcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpOworCisvKiByZWdpc3RlciBhIGxpbmUgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2xpbmVfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisvKiBlbnN1cmUgYSBjZXJ0YWluIGxpbmUgZXhpc3RzLCByZXR1cm4gcG9pbnRlciB0byBpdCAqLworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucik7CisKKy8qIGZpbmQgYSBzaWduX2xpbmsgZm9yIGdpdmVuIFRFSSBhbmQgU0FQSSBpbiBhIFRTICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICp0cywgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBvbmUgZTFpbnBfdHMgKi8KK2ludCBlMWlucF90c19jb25maWcoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsCisJCSAgICBlbnVtIGUxaW5wX3RzX3R5cGUgdHlwZSk7CisKKy8qIENhbGwgZnJvbSB0aGUgU3RhY2s6IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBUUyBoYXMgY2hhbmdlZCAqLworaW50IGUxaW5wX3VwZGF0ZV90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKKworLyogUmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBFMSBkcml2ZXIgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGlmIGl0IHdhbnRzIHRvIHRyYW5zbWl0IG9uIGEgZ2l2ZW4gVFMgKi8KK3N0cnVjdCBtc2diICplMWlucF90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cywKKwkJCSBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoqc2lnbl9saW5rKTsKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogV3JpdGUgTEFQRCBmcmFtZXMgdG8gdGhlIGZkLiAqLwordm9pZCBlMV9zZXRfcGNhcF9mZChpbnQgZmQpOworCisvKiBjYWxsZWQgYnkgVFJBVSBtdXhlciB0byBvYnRhaW4gdGhlIGRlc3RpbmF0aW9uIG11eCBlbnRpdHkgKi8KK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKTsKKwordm9pZCBlMWlucF9zaWduX2xpbmtfZGVzdHJveShzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rKTsKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGUxX2NvbmZpZy5jICovCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbik7CitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpOworCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfZHJpdmVyX2xpc3Q7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfbGluZV9saXN0OworCisjZW5kaWYgLyogX0UxX0lOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMThjZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX0dTTV8wNF8wOF9ICisjZGVmaW5lIF9HU01fMDRfMDhfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworc3RydWN0IG1zZ2I7CitzdHJ1Y3QgZ3NtX2J0czsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCBnc21fdHJhbnM7CisKKy8qIGNvbmZpZyBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGxvd2VyIGxldmVzICovCit2b2lkIGdzbTA0MDhfYWxsb3dfZXZlcnlvbmUoaW50IGFsbG93KTsKKworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSk7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCk7CitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CitpbnQgZ3NtNDhfbWlfdG9fc3RyaW5nKGNoYXIgKnN0cmluZywgY29uc3QgaW50IHN0cl9sZW4sIGNvbnN0IHVfaW50OF90ICptaSwgY29uc3QgaW50IG1pX2xlbik7CisKK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpOworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpOworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY2xhc3MpOworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpOworCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7CisKKy8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gY2FsbC1jb250cm9sIEJDRCAqLworaW50IGVuY29kZV9iY2RfbnVtYmVyKHVfaW50OF90ICpiY2RfbHYsIHVfaW50OF90IG1heF9sZW4sCisJCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpOworaW50IGRlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sIGNvbnN0IHVfaW50OF90ICpiY2RfbHYsCisJCSAgICAgIGludCBoX2xlbik7CisKK2ludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KTsKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhZGQzNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dTTV8wNF8xMV9ICisjZGVmaW5lIF9HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmg+CisKKy8qIFNNUyBkZWxpdmVyIFBEVSAqLworc3RydWN0IHNtc19kZWxpdmVyIHsKKwl1X2ludDhfdCBtdGk6MjsJCS8qIG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IgKi8KKwl1X2ludDhfdCBtbXM6MTsJCS8qIG1vcmUgbWVzc2FnZXMgdG8gc2VuZCAqLworCXVfaW50OF90IHJwOjE7CQkvKiByZXBseSBwYXRoICovCisJdV9pbnQ4X3QgdWRoaToxOwkvKiB1c2VyIGRhdGEgaGVhZGVyIGluZGljYXRvciAqLworCXVfaW50OF90IHNyaToxOwkJLyogc3RhdHVzIHJlcG9ydCBpbmRpY2F0aW9uICovCisJdV9pbnQ4X3QgKm9yaWdfYWRkcjsJLyogb3JpZ2luYXRpbmcgYWRkcmVzcyAqLworCXVfaW50OF90IHBpZDsJCS8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1X2ludDhfdCBkY3M7CQkvKiBkYXRhIGNvZGluZyBzY2hlbWUgKi8KKwkJCQkvKiBzZXJ2aWNlIGNlbnRyZSB0aW1lIHN0YW1wICovCisJdV9pbnQ4X3QgdWRfbGVuOwkvKiB1c2VyIGRhdGEgbGVuZ3RoICovCisJdV9pbnQ4X3QgKnVzZXJfZGF0YTsJLyogdXNlciBkYXRhICovCisKKwl1X2ludDhfdCBtc2dfcmVmOwkvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXVfaW50OF90ICpzbXNjOworfTsKKworc3RydWN0IG1zZ2I7CisKK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpOworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpOwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjFjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dTTV8wNF84MF9ICisjZGVmaW5lIF9HU01fMDRfODBfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oPgorCisjZGVmaW5lIE1BWF9MRU5fVVNTRF9TVFJJTkcJMzEKKworc3RydWN0IHVzc2RfcmVxdWVzdCB7CisJCQljaGFyIHRleHRbTUFYX0xFTl9VU1NEX1NUUklORyArIDFdOworCQkJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCQl1X2ludDhfdCBpbnZva2VfaWQ7Cit9OworCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOyAKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyKiByZXNwb25zZV90ZXh0LCAKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTdmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC0wLDAgKzEsNzA2IEBACisjaWZuZGVmIF9HU01fREFUQV9ICisjZGVmaW5lIF9HU01fREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyB7CisJR1NNX1BDSEFOX05PTkUsCisJR1NNX1BDSEFOX0NDQ0gsCisJR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LAorCUdTTV9QQ0hBTl9UQ0hfRiwKKwlHU01fUENIQU5fVENIX0gsCisJR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLAorCUdTTV9QQ0hBTl9QRENILAkJLyogR1BSUyBQRENIICovCisJR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCS8qIFRDSC9GIGlmIHVzZWQsIFBEQ0ggb3RoZXJ3aXNlICovCisJR1NNX1BDSEFOX1VOS05PV04sCit9OworCitlbnVtIGdzbV9jaGFuX3QgeworCUdTTV9MQ0hBTl9OT05FLAorCUdTTV9MQ0hBTl9TRENDSCwKKwlHU01fTENIQU5fVENIX0YsCisJR1NNX0xDSEFOX1RDSF9ILAorCUdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworLyogUlJMUCBtb2RlIG9mIG9wZXJhdGlvbiAqLworZW51bSBycmxwX21vZGUgeworCVJSTFBfTU9ERV9OT05FLAorCVJSTFBfTU9ERV9NU19CQVNFRCwKKwlSUkxQX01PREVfTVNfUFJFRiwKKwlSUkxQX01PREVfQVNTX1BSRUYsCit9OworCisvKiBDaGFubmVsIFJlcXVlc3QgcmVhc29uICovCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCB7CisJR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorCisjZGVmaW5lIFRSWF9OUl9UUwk4CisjZGVmaW5lIFRTX01BWF9MQ0hBTgk4CisKKyNkZWZpbmUgSEFSRENPREVEX0FSRkNOIDEyMworI2RlZmluZSBIQVJEQ09ERURfVFNDCTcKKyNkZWZpbmUgSEFSRENPREVEX0JTSUMJMHgzZgkvKiBOQ0MgPSA3IC8gQkNDID0gNyAqLworCisvKiBmb3IgbXVsdGktZHJvcCBjb25maWcgKi8KKyNkZWZpbmUgSEFSRENPREVEX0JUUzBfVFMJMQorI2RlZmluZSBIQVJEQ09ERURfQlRTMV9UUwk2CisjZGVmaW5lIEhBUkRDT0RFRF9CVFMyX1RTCTExCisKK2VudW0gZ3NtX2hvb2tzIHsKKwlHU01fSE9PS19OTV9TV0xPQUQsCisJR1NNX0hPT0tfUlJfUEFHSU5HLAorfTsKKworZW51bSBnc21fcGFnaW5nX2V2ZW50IHsKKwlHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwlHU01fUEFHSU5HX0VYUElSRUQsCisJR1NNX1BBR0lOR19PT00sCit9OworCitzdHJ1Y3QgbXNnYjsKK3R5cGVkZWYgaW50IGdzbV9jYmZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgIHVuc2lnbmVkIGludCBldmVudCwKKwkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKTsKKworLyoKKyAqIFVzZSB0aGUgY2hhbm5lbC4gQXMgc2lkZSBlZmZlY3QgdGhlIGxjaGFubmVsIHJlY3ljbGUgdGltZXIKKyAqIHdpbGwgYmUgc3RhcnRlZC4KKyAqLworI2RlZmluZSBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQgMjAsIDAKKyNkZWZpbmUgdXNlX2xjaGFuKGxjaGFuKSBcCisJZG8gewlsY2hhbi0+dXNlX2NvdW50Kys7IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwgXAorCQkJbGNoYW4tPm5yLCBsY2hhbi0+dXNlX2NvdW50KTsgXAorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOyB9IHdoaWxlKDApOworCisjZGVmaW5lIHB1dF9sY2hhbihsY2hhbikgXAorCWRvIHsgbGNoYW4tPnVzZV9jb3VudC0tOyBcCisJCURFQlVHUChEUkVGLCAibGNoYW4gKGJ0cz0lZCx0cng9JWQsdHM9JWQsY2g9JWQpIGRlY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsIFwKKwkJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsIFwKKwkJCWxjaGFuLT5uciwgbGNoYW4tPnVzZV9jb3VudCk7IFwKKwl9IHdoaWxlKDApOworCisKKy8qIGNvbW11bmljYXRpb25zIGxpbmsgd2l0aCBhIEJUUyAqLworc3RydWN0IGdzbV9idHNfbGluayB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKKy8qIFJlYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gY29udGFpbmluZyBLaSAqLworZW51bSBnc21fYXV0aF9hbGdvIHsKKwlBVVRIX0FMR09fTk9ORSwKKwlBVVRIX0FMR09fWE9SLAorCUFVVEhfQUxHT19DT01QMTI4djEsCit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyB7CisJZW51bSBnc21fYXV0aF9hbGdvIGF1dGhfYWxnbzsKKwl1bnNpZ25lZCBpbnQgYTNhOF9raV9sZW47CisJdV9pbnQ4X3QgYTNhOF9raVsxNl07Cit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgeworCWludCB1c2VfY291bnQ7CisJaW50IGtleV9zZXE7CisJdV9pbnQ4X3QgcmFuZFsxNl07CisJdV9pbnQ4X3Qgc3Jlc1s0XTsKKwl1X2ludDhfdCBrY1s4XTsKK307CisKKworc3RydWN0IGdzbV9sY2hhbjsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbW5jYzsKK3N0cnVjdCBydHBfc29ja2V0OworCisvKiBOZXR3b3JrIE1hbmFnZW1lbnQgU3RhdGUgKi8KK3N0cnVjdCBnc21fbm1fc3RhdGUgeworCXVfaW50OF90IG9wZXJhdGlvbmFsOworCXVfaW50OF90IGFkbWluaXN0cmF0aXZlOworCXVfaW50OF90IGF2YWlsYWJpbGl0eTsKK307CisKKy8qCisgKiBMT0NBVElPTiBVUERBVElORyBSRVFVRVNUIHN0YXRlCisgKgorICogT3VyIGN1cnJlbnQgb3BlcmF0aW9uIGlzOgorICoJLSBHZXQgaW1laS90bXNpCisgKgktIEFjY2VwdC9SZWplY3QgYWNjb3JkaW5nIHRvIGdsb2JhbCBwb2xpY3kKKyAqLworc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uIHsKKyAgICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdXBkYXRpbmdfdGltZXI7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltc2kgOiAxOworCXVuc2lnbmVkIGludCB3YWl0aW5nX2Zvcl9pbWVpIDogMTsKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG5laWdoYm9yIGNlbGxzIHdob3NlIGF2ZXJhZ2Ugd2UgdHJhY2sgKi8KKyNkZWZpbmUgTUFYX05FSUdIX01FQVMJCTEwCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGF2ZXJhZ2luZyB3aW5kb3cgZm9yIG5laWdoYm9yIGNlbGxzICovCisjZGVmaW5lIE1BWF9XSU5fTkVJR0hfQVZHCTEwCisKKy8qIHByb2Nlc3NlZCBuZWlnaGJvciBtZWFzdXJlbWVudHMgZm9yIG9uZSBjZWxsICovCitzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jIHsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgYnNpYzsKKwl1X2ludDhfdCByeGxldltNQVhfV0lOX05FSUdIX0FWR107CisJdW5zaWduZWQgaW50IHJ4bGV2X2NudDsKKwl1X2ludDhfdCBsYXN0X3NlZW5fbnI7Cit9OworCisjZGVmaW5lIE1BWF9BNV9LRVlfTEVOCSgxMjgvOCkKKyNkZWZpbmUgUlNMX0VOQ19BTEdfQTUoeCkJKHgrMSkKKworLyogaXMgdGhlIGRhdGEgbGluayBlc3RhYmxpc2hlZD8gd2hvIGVzdGFibGlzaGVkIGl0PyAqLworI2RlZmluZSBMQ0hBTl9TQVBJX1VOVVNFRAkwCisjZGVmaW5lIExDSEFOX1NBUElfTVMJCTEKKyNkZWZpbmUgTENIQU5fU0FQSV9ORVQJCTIKKworLyogc3RhdGUgb2YgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK2VudW0gZ3NtX2xjaGFuX3N0YXRlIHsKKwlMQ0hBTl9TX05PTkUsCQkvKiBjaGFubmVsIGlzIG5vdCBhY3RpdmUgKi8KKwlMQ0hBTl9TX0FDVF9SRVEsCS8qIGNoYW5uZWwgYWN0aXZhdGluIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfQUNUSVZFLAkJLyogY2hhbm5lbCBpcyBhY3RpdmUgYW5kIG9wZXJhdGlvbmFsICovCisJTENIQU5fU19SRUxfUkVRLAkvKiBjaGFubmVsIHJlbGVhc2UgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJTENIQU5fU19JTkFDVElWRSwJLyogY2hhbm5lbCBpcyBzZXQgaW5hY3RpdmUgKi8KK307CisKK3N0cnVjdCBnc21fbGNoYW4geworCS8qIFRoZSBUUyB0aGF0IHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCS8qIFRoZSBsb2dpY2FsIHN1YnNsb3QgbnVtYmVyIGluIHRoZSBUUyAqLworCXVfaW50OF90IG5yOworCS8qIFRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSAqLworCWVudW0gZ3NtX2NoYW5fdCB0eXBlOworCS8qIFJTTCBjaGFubmVsIG1vZGUgKi8KKwllbnVtIHJzbF9jbW9kX3NwZCByc2xfY21vZGU7CisJLyogSWYgVENILCB0cmFmZmljIGNoYW5uZWwgbW9kZSAqLworCWVudW0gZ3NtNDhfY2hhbl9tb2RlIHRjaF9tb2RlOworCS8qIFN0YXRlICovCisJZW51bSBnc21fbGNoYW5fc3RhdGUgc3RhdGU7CisJLyogUG93ZXIgbGV2ZWxzIGZvciBNUyBhbmQgQlRTICovCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfcG93ZXI7CisJLyogRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB7CisJCXVfaW50OF90IGFsZ19pZDsKKwkJdV9pbnQ4X3Qga2V5X2xlbjsKKwkJdV9pbnQ4X3Qga2V5W01BWF9BNV9LRVlfTEVOXTsKKwl9IGVuY3I7CisJLyogQXJlIHdlIHBhcnQgb2YgYSBzcGVjaWFsICJzaWxlbnQiIGNhbGwgKi8KKwlpbnQgc2lsZW50X2NhbGw7CisKKwkvKiBBTVIgYml0cyAqLworCXN0cnVjdCBnc200OF9tdWx0aV9yYXRlX2NvbmYgbXJfY29uZjsKKwkKKwkvKiBUbyB3aG9tIHdlIGFyZSBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGltZXIgc3RhcnRlZCB0byByZWxlYXNlIHRoZSBjaGFubmVsICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVsZWFzZV90aW1lcjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAxOworCisJLyogRXN0YWJsaXNoZWQgZGF0YSBsaW5rIGxheWVyIHNlcnZpY2VzICovCisJdV9pbnQ4X3Qgc2FwaXNbOF07CisKKwkvKgorCSAqIE9wZXJhdGlvbnMgdGhhdCBoYXZlIGEgc3RhdGUgYW5kIG1pZ2h0IGJlIHBlbmRpbmcKKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24gKmxvY19vcGVyYXRpb247CisKKwkvKiB1c2UgY291bnQuIGhvdyBtYW55IHVzZXJzIHVzZSB0aGlzIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvdW50OworCisJLyogY2FjaGUgb2YgbGFzdCBtZWFzdXJlbWVudCByZXBvcnRzIG9uIHRoaXMgbGNoYW4gKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwIG1lYXNfcmVwWzZdOworCWludCBtZWFzX3JlcF9pZHg7CisKKwkvKiB0YWJsZSBvZiBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50cyAqLworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgbmVpZ2hfbWVhc1tNQVhfTkVJR0hfTUVBU107CisKKwlzdHJ1Y3QgeworCQl1X2ludDMyX3QgYm91bmRfaXA7CisJCXVfaW50MzJfdCBjb25uZWN0X2lwOworCQl1X2ludDE2X3QgYm91bmRfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5lY3RfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5faWQ7CisJCXVfaW50OF90IHJ0cF9wYXlsb2FkMjsKKwkJdV9pbnQ4X3Qgc3BlZWNoX21vZGU7CisJCXN0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0OworCX0gYWJpc19pcDsKK307CisKK3N0cnVjdCBnc21fZTFfc3Vic2xvdCB7CisJLyogTnVtYmVyIG9mIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV9ucjsKKwkvKiBOdW1iZXIgb2YgRTEgVFMgaW5zaWRlIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV90czsKKwkvKiBTdWItc2xvdCB3aXRoaW4gdGhlIEUxIFRTLCAweGZmIGlmIGZ1bGwgVFMgKi8KKwl1X2ludDhfdAllMV90c19zczsKK307CisKKyNkZWZpbmUgQlRTX1RSWF9GX0FDVElWQVRFRAkweDAwMDEKKy8qIE9uZSBUaW1lc2xvdCBpbiBhIFRSWCAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwkvKiBudW1iZXIgb2YgdGhpcyB0aW1lc2xvdCBhdCB0aGUgVFJYICovCisJdV9pbnQ4X3QgbnI7CisKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwl1X2ludDhfdCBubV9jaGFuX2NvbWI7CisKKwkvKiBUbyB3aGljaCBFMSBzdWJzbG90IGFyZSB3ZSBjb25uZWN0ZWQgKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgZTFfbGluazsKKworCXN0cnVjdCBnc21fbGNoYW4gbGNoYW5bVFNfTUFYX0xDSEFOXTsKK307CisKKy8qIE9uZSBUUlggaW4gYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeCB7CisJLyogbGlzdCBoZWFkZXIgaW4gYnRzLT50cnhfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOworCXVfaW50OF90IHJzbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IGJiX3RyYW5zYzsKKworCXVfaW50MTZfdCBhcmZjbjsKKwlpbnQgbm9taW5hbF9wb3dlcjsJCS8qIGluIGRCbSAqLworCXVuc2lnbmVkIGludCBtYXhfcG93ZXJfcmVkOwkvKiBpbiBhY3R1YWwgZEIgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gYmJzaWc7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHBhOworCQl9IGJzMTE7CisJfTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgdHNbVFJYX05SX1RTXTsKK307CisKK2VudW0gZ3NtX2J0c190eXBlIHsKKwlHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwlHU01fQlRTX1RZUEVfQlMxMSwKKwlHU01fQlRTX1RZUEVfTkFOT0JUUywKK307CisKK3N0cnVjdCBnc21fYnRzX21vZGVsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7Cit9OworCisvKioKKyAqIEEgcGVuZGluZyBwYWdpbmcgcmVxdWVzdCAKKyAqLworc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCB7CisJLyogbGlzdF9oZWFkIGZvciBsaXN0IG9mIGFsbCBwYWdpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwkvKiB0aGUgc3Vic2NyaWJlciB3aGljaCB3ZSdyZSBwYWdpbmcuIExhdGVyIGdzbV9wYWdpbmdfcmVxdWVzdAorCSAqIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBnc21fc3Vic2NyaWJlciBzdHJ1Y3Q/ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBCVFMgb24gd2hpY2ggd2UgYXJlIHBhZ2luZyAqLworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogd2hhdCBraW5kIG9mIGNoYW5uZWwgdHlwZSBkbyB3ZSBhc2sgdGhlIE1TIHRvIGVzdGFibGlzaCAqLworCWludCBjaGFuX3R5cGU7CisKKwkvKiBUaW1lciAzMTEzOiBob3cgbG9uZyBkbyB3ZSB0cnkgdG8gcGFnZT8gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzExMzsKKworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIHBhZ2luZyBjb21wbGV0ZXMgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYmZuX3BhcmFtOworfTsKKworLyoKKyAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2luZyBzdGF0dXMgb2Ygb25lIEJUUy4gSXQKKyAqIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMsIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgZ3NtX2J0cywgYSB0aW1lciBhbmQgc29tZSBtb3JlIHN0YXRlLgorICovCitzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgeworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBwZW5kaW5nX3JlcXVlc3RzOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmxhc3RfcmVxdWVzdDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJc3RydWN0IHRpbWVyX2xpc3Qgd29ya190aW1lcjsKKworCS8qIGxvYWQgKi8KKwl1X2ludDE2X3QgYXZhaWxhYmxlX3Nsb3RzOworfTsKKworc3RydWN0IGdzbV9lbnZhYnRzZSB7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKK307CisKK3N0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OworCXVfaW50MTZfdCByZW1vdGVfcG9ydDsKKwl1X2ludDMyX3QgcmVtb3RlX2lwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCisvKiBPbmUgQlRTICovCitzdHJ1Y3QgZ3NtX2J0cyB7CisJLyogbGlzdCBoZWFkZXIgaW4gbmV0LT5idHNfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJLyogbnVtYmVyIG9mIHRocyBCVFMgaW4gbmV0d29yayAqLworCXVfaW50OF90IG5yOworCS8qIENlbGwgSWRlbnRpdHkgKi8KKwl1X2ludDE2X3QgY2VsbF9pZGVudGl0eTsKKwkvKiBsb2NhdGlvbiBhcmVhIGNvZGUgb2YgdGhpcyBCVFMgKi8KKwl1X2ludDE2X3QgbG9jYXRpb25fYXJlYV9jb2RlOworCS8qIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKi8KKwl1X2ludDhfdCB0c2M7CisJLyogQmFzZSBTdGF0aW9uIElkZW50aWZpY2F0aW9uIENvZGUgKEJTSUMpICovCisJdV9pbnQ4X3QgYnNpYzsKKwkvKiB0eXBlIG9mIEJUUyAqLworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCWVudW0gZ3NtX2JhbmQgYmFuZDsKKwkvKiBzaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGNoYW5uZWxzIGZyb20gaGlnaCBUUlggdG8gVFJYMCwKKwkgKiByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIFRSWDAgYW5kIGdvIHVwd2FyZHM/ICovCisJaW50IGNoYW5fYWxsb2NfcmV2ZXJzZTsKKwkvKiBtYXhpbXVtIFR4IHBvd2VyIHRoYXQgdGhlIE1TIGlzIHBlcm1pdHRlZCB0byB1c2UgaW4gdGhpcyBjZWxsICovCisJaW50IG1zX21heF9wb3dlcjsKKworCS8qIGhvdyBkbyB3ZSB0YWxrIE9NTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBvbWxfZTFfbGluazsKKwl1X2ludDhfdCBvbWxfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCisJLyogQWJpcyBuZXR3b3JrIG1hbmFnZW1lbnQgTyZNIGhhbmRsZSAqLworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisKKwkvKiBudW1iZXIgb2YgdGhpcyBCVFMgb24gZ2l2ZW4gRTEgbGluayAqLworCXVfaW50OF90IGJ0c19ucjsKKworCS8qIHBhZ2luZyBzdGF0ZSBhbmQgY29udHJvbCAqLworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSBwYWdpbmc7CisKKwkvKiBDQ0NIIGlzIG9uIEMwICovCisJc3RydWN0IGdzbV9idHNfdHJ4ICpjMDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBzaXRlX21ncjsKKworCS8qIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB3ZSBidWlsZCBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkJdV9pbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOworCQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNoYW5fZGVzYzsKKwkJc3RydWN0IGJpdHZlYyBuZWlnaF9saXN0OworCQlzdHJ1Y3QgYml0dmVjIGNlbGxfYWxsb2M7CisJCXN0cnVjdCB7CisJCQkvKiBiaXRtYXNrIGxhcmdlIGVub3VnaCBmb3IgYWxsIHBvc3NpYmxlIEFSRkNOJ3MgKi8KKwkJCXVfaW50OF90IG5laWdoX2xpc3RbMTAyNC84XTsKKwkJCXVfaW50OF90IGNlbGxfYWxsb2NbMTAyNC84XTsKKwkJfSBkYXRhOworCX0gc2lfY29tbW9uOworCisJLyogaXAuYWNjZXNzcyBVbml0IElEJ3MgaGF2ZSBTaXRlL0JUUy9UUlggbGF5b3V0ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCQl1X2ludDE2X3QgYnRzX2lkOworCQkJdV9pbnQzMl90IGZsYWdzOworCQl9IGlwX2FjY2VzczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gY2NsazsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcmFjazsKKwkJCXN0cnVjdCBnc21fZW52YWJ0c2UgZW52YWJ0c2VbNF07CisJCX0gYnMxMTsKKwl9OworCisJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCisJc3RydWN0IHsKKwkJaW50IGVuYWJsZWQ7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IG5zZWk7CisJCX0gbnNlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBidmNpOworCQl9IGNlbGw7CisJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyBuc3ZjWzJdOworCQl1X2ludDhfdCByYWM7CisJfSBncHJzOworCQorCS8qIHRyYW5zY2VpdmVycyAqLworCWludCBudW1fdHJ4OworCXN0cnVjdCBsbGlzdF9oZWFkIHRyeF9saXN0OworfTsKKworLyogU29tZSBzdGF0aXN0aWNzIG9mIG91ciBuZXR3b3JrICovCitzdHJ1Y3QgZ3NtbmV0X3N0YXRzIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqdG90YWw7CisJCXN0cnVjdCBjb3VudGVyICpub19jaGFubmVsOworCX0gY2hyZXE7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CS8qIG5vIGNoYW5uZWwgYXZhaWxhYmxlICovCisJCXN0cnVjdCBjb3VudGVyICp0aW1lb3V0OwkJLyogVDMxMDMgdGltZW91dCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOwkvKiBITyBDT01QTCByZWNlaXZlZCAqLworCQlzdHJ1Y3QgY291bnRlciAqZmFpbGVkOwkJLyogSE8gRkFJTCByZWNlaXZlZCAqLworCX0gaGFuZG92ZXI7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGFjaDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vcm1hbDsKKwkJc3RydWN0IGNvdW50ZXIgKnBlcmlvZGljOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoOworCX0gbG9jX3VwZF90eXBlOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZWplY3Q7CisJCXN0cnVjdCBjb3VudGVyICphY2NlcHQ7CisJfSBsb2NfdXBkX3Jlc3A7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmRldGFjaGVkOworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOworCQlzdHJ1Y3QgY291bnRlciAqZXhwaXJlZDsKKwl9IHBhZ2luZzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqc3VibWl0dGVkOyAvKiBNTyBTTVMgc3VibWlzc2lvbnMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKm5vX3JlY2VpdmVyOworCQlzdHJ1Y3QgY291bnRlciAqZGVsaXZlcmVkOyAvKiBNVCBTTVMgZGVsaXZlcmllcyAqLworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX21lbTsKKwkJc3RydWN0IGNvdW50ZXIgKnJwX2Vycl9vdGhlcjsKKwl9IHNtczsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqZGlhbGxlZDsJLyogdG90YWwgbnVtYmVyIG9mIGRpYWxsZWQgY2FsbHMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmFsZXJ0ZWQ7CS8qIHdlIGFsZXJ0ZWQgdGhlIG90aGVyIGVuZCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29ubmVjdGVkOy8qIGhvdyBtYW55IGNhbGxzIHdlcmUgYWNjZXB0ZWQgKi8KKwl9IGNhbGw7Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSB7CisJR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwgLyogb25seSBzdWJzY3JpYmVycyBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsIC8qIGFjY2VwdCBldmVyeW9uZSwgZXZlbiBpZiBub3QgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9UT0tFTiwgLyogYWNjZXB0IGZpcnN0LCBzZW5kIHRva2VuIHBlciBzbXMsIHRoZW4gcmV2b2tlIGF1dGhvcml6YXRpb24gKi8KK307CisKKyNkZWZpbmUgR1NNX1QzMTAxX0RFRkFVTFQgMTAKKyNkZWZpbmUgR1NNX1QzMTEzX0RFRkFVTFQgNjAKKworc3RydWN0IGdzbV9uZXR3b3JrIHsKKwkvKiBnbG9iYWwgcGFyYW1ldGVycyAqLworCXVfaW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdV9pbnQxNl90IG5ldHdvcmtfY29kZTsKKwljaGFyICpuYW1lX2xvbmc7CisJY2hhciAqbmFtZV9zaG9ydDsKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBhdXRoX3BvbGljeTsKKwllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSByZWplY3RfY2F1c2U7CisJaW50IGE1X2VuY3J5cHRpb247CisJaW50IG5lY2k7CisJaW50IHNlbmRfbW1faW5mbzsKKwlzdHJ1Y3QgeworCQlpbnQgYWN0aXZlOworCQkvKiBXaW5kb3cgUlhMRVYgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWFFVQUwgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhxdWFsX2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhMRVYgbmVpZ2hib3VyaW5nIGNlbGxzIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2Z19uZWlnaDsgLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCisJCS8qIGhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgZm9yIHBvd2VyIGJ1ZGdldCBITyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2ludGVydmFsOwkvKiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogaG93IG11Y2ggYmV0dGVyIGRvZXMgYSBuZWlnaGJvciBjZWxsIGhhdmUgdG8gYmUgPyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2h5c3RlcmVzaXM7CS8qIGRCbSAqLworCQkvKiBtYXhpbXVtIGRpc3RhY25lIGJlZm9yZSB3ZSB0cnkgYSBoYW5kb3ZlciAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3RhbmNlOwkvKiBUQSB2YWx1ZXMgKi8KKwl9IGhhbmRvdmVyOworCisJc3RydWN0IGdzbW5ldF9zdGF0cyBzdGF0czsKKworCS8qIGxheWVyIDQgKi8KKwlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKworCXVuc2lnbmVkIGludCBudW1fYnRzOworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCisJLyogdGltZXIgdmFsdWVzICovCisJaW50IFQzMTAxOworCWludCBUMzEwMzsKKwlpbnQgVDMxMDU7CisJaW50IFQzMTA3OworCWludCBUMzEwOTsKKwlpbnQgVDMxMTE7CisJaW50IFQzMTEzOworCWludCBUMzExNTsKKwlpbnQgVDMxMTc7CisJaW50IFQzMTE5OworCWludCBUMzE0MTsKKworCS8qIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIChUUyAwNC4zMSkgKi8KKwlzdHJ1Y3QgeworCQllbnVtIHJybHBfbW9kZSBtb2RlOworCX0gcnJscDsKK307CisKKyNkZWZpbmUgU01TX0hEUl9TSVpFCTEyOAorI2RlZmluZSBTTVNfVEVYVF9TSVpFCTI1Ngorc3RydWN0IGdzbV9zbXMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBpZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnNlbmRlcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyOworCisJdW5zaWduZWQgbG9uZyB2YWxpZGl0eV9taW51dGVzOworCXVfaW50OF90IHJlcGx5X3BhdGhfcmVxOworCXVfaW50OF90IHN0YXR1c19yZXBfcmVxOworCXVfaW50OF90IHVkX2hkcl9pbmQ7CisJdV9pbnQ4X3QgcHJvdG9jb2xfaWQ7CisJdV9pbnQ4X3QgZGF0YV9jb2Rpbmdfc2NoZW1lOworCXVfaW50OF90IG1zZ19yZWY7CisJY2hhciBkZXN0X2FkZHJbMjArMV07CS8qIERBIExWIGlzIDEyIGJ5dGVzIG1heCwgaS5lLiAxMCBieXRlcworCQkJCSAqIEJDRCA9PSAyMCBieXRlcyBzdHJpbmcgKi8KKwl1X2ludDhfdCB1c2VyX2RhdGFfbGVuOworCXVfaW50OF90IHVzZXJfZGF0YVtTTVNfVEVYVF9TSVpFXTsKKworCWNoYXIgdGV4dFtTTVNfVEVYVF9TSVpFXTsKK307CisKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pOworCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYyk7CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pOworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpOworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpOworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYyk7CitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Citjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcyk7CisKK2VudW0gZ3NtX2UxX2V2ZW50IHsKKwlFVlRfRTFfTk9ORSwKKwlFVlRfRTFfVEVJX1VQLAorCUVWVF9FMV9URUlfRE4sCit9OworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcyk7CitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKK2V4dGVybiBpbnQgaXBhY2NfcnRwX2RpcmVjdDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaXBhY2Nlc3NfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NpZW1lbnNfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSk7CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKTsKKworLyogQSBwYXJzZWQgR1BSUyByb3V0aW5nIGFyZWEgKi8KK3N0cnVjdCBncHJzX3JhX2lkIHsKKwl1X2ludDE2X3QJbW5jOworCXVfaW50MTZfdAltY2M7CisJdV9pbnQxNl90CWxhYzsKKwl1X2ludDhfdAlyYWM7Cit9OworCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9HU01fU1VCU0NSX0gKKyNkZWZpbmUgX0dTTV9TVUJTQ1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBHU01fSU1FSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9OQU1FX0xFTkdUSCAxMjgKKworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNSAvKiBNU0lTRE4gY2FuIG9ubHkgYmUgMTUgZGlnaXRzIGxlbmd0aCAqLworI2RlZmluZSBHU01fTUlOX0VYVEVOIDIwMDAwCisjZGVmaW5lIEdTTV9NQVhfRVhURU4gNDk5OTkKKworLyogcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIEdTTSAwMy4wMyDCpyAyLjQgKi8KKyNkZWZpbmUgR1NNX1JFU0VSVkVEX1RNU0kgICAweEZGRkZGRkZGCisKKworI2RlZmluZSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUgdG1zaV9mcm9tX3N0cmluZyhzdHIpIHN0cnRvdWwoc3RyLCBOVUxMLCAxMCkKKworc3RydWN0IGdzbV9lcXVpcG1lbnQgeworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazJbM107CisJdV9pbnQ4X3QgY2xhc3NtYXJrM19sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrM1sxNF07Cit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgeworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbXNpW0dTTV9JTVNJX0xFTkdUSF07CisJdV9pbnQzMl90IHRtc2k7CisJdV9pbnQxNl90IGxhYzsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKwljaGFyIGV4dGVuc2lvbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJaW50IGF1dGhvcml6ZWQ7CisKKwkvKiBUZW1wb3JhcnkgZmllbGQgd2hpY2ggaXMgbm90IHN0b3JlZCBpbiB0aGUgREIvSExSICovCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogRXZlcnkgdXNlciBjYW4gb25seSBoYXZlIG9uZSBlcXVpcG1lbnQgaW4gdXNlIGF0IGFueSBnaXZlbgorCSAqIHBvaW50IGluIHRpbWUgKi8KKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCBlcXVpcG1lbnQ7CisKKwkvKiBmb3IgaW50ZXJuYWwgbWFuYWdlbWVudCAqLworCWludCB1c2VfY291bnQ7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJaW50IGluX2NhbGxiYWNrOworCXN0cnVjdCBsbGlzdF9oZWFkIHJlcXVlc3RzOworfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCB7CisJR1NNX1NVQlNDUklCRVJfSU1TSSwKKwlHU01fU1VCU0NSSUJFUl9UTVNJLAorCUdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwKKwlHU01fU1VCU0NSSUJFUl9JRCwKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfdXBkYXRlX3JlYXNvbiB7CisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfRVFVSVBNRU5ULAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpOworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKTsKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogaW50ZXJuYWwgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGFjdGl2ZV9zdWJzY3JpYmVyczsKKworI2VuZGlmIC8qIF9HU01fU1VCU0NSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSEFORE9WRVJfSAorI2RlZmluZSBfSEFORE9WRVJfSAorLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworI2VuZGlmIC8qIF9IQU5ET1ZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI0OGFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfSVBBQ0NFU1NfSAorI2RlZmluZSBfSVBBQ0NFU1NfSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBJUEFfVENQX1BPUlRfT01MCTMwMDIKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX1JTTAkzMDAzCisKK3N0cnVjdCBpcGFjY2Vzc19oZWFkIHsKKwl1X2ludDE2X3QgbGVuOwkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1X2ludDhfdCBwcm90bzsKKwl1X2ludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gaXBhY2Nlc3NfcHJvdG8geworCUlQQUNfUFJPVE9fUlNMCQk9IDB4MDAsCisJSVBBQ19QUk9UT19JUEFDQ0VTUwk9IDB4ZmUsCisJSVBBQ19QUk9UT19TQ0NQCQk9IDB4ZmQsCisJSVBBQ19QUk9UT19PTUwJCT0gMHhmZiwKK307CisKK2VudW0gaXBhY2Nlc3NfbXNndHlwZSB7CisJSVBBQ19NU0dUX1BJTkcJCT0gMHgwMCwKKwlJUEFDX01TR1RfUE9ORwkJPSAweDAxLAorCUlQQUNfTVNHVF9JRF9HRVQJPSAweDA0LAorCUlQQUNfTVNHVF9JRF9SRVNQCT0gMHgwNSwKKwlJUEFDX01TR1RfSURfQUNLCT0gMHgwNiwKK307CisKK2VudW0gaXBhY2Nlc3NfaWRfdGFncyB7CisJSVBBQ19JRFRBR19TRVJOUgkJPSAweDAwLAorCUlQQUNfSURUQUdfVU5JVE5BTUUJCT0gMHgwMSwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMQkJPSAweDAyLAorCUlQQUNfSURUQUdfTE9DQVRJT04yCQk9IDB4MDMsCisJSVBBQ19JRFRBR19FUVVJUFZFUlMJCT0gMHgwNCwKKwlJUEFDX0lEVEFHX1NXVkVSU0lPTgkJPSAweDA1LAorCUlQQUNfSURUQUdfSVBBRERSCQk9IDB4MDYsCisJSVBBQ19JRFRBR19NQUNBRERSCQk9IDB4MDcsCisJSVBBQ19JRFRBR19VTklUCQkJPSAweDA4LAorfTsKKworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpOworCisvKgorICogbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgc2VuZGluZyBhIG1lc3NhZ2UKKyAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBic2NfZmQgKmJmZCk7CitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKTsKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpOworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCk7CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCisKKy8qCisgKiBGaXJtd2FyZSBzcGVjaWZpYyBoZWFkZXIKKyAqLworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbMl07CisJdV9pbnQxNl90IG1vcmVfbW9yZV9tYWdpYzsKKwl1X2ludDMyX3QgaGVhZGVyX2xlbmd0aDsKKwl1X2ludDMyX3QgZmlsZV9sZW5ndGg7CisJY2hhciBzd19wYXJ0WzIwXTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCS8qIHN0dWZmIGkgZG9uJ3Qga25vdyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgeworCXVfaW50MTZfdCBzb21ldGhpbmcxOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MzJfdCBsZW5ndGg7CisJdV9pbnQzMl90IGFkZHIxOworCXVfaW50MzJfdCBhZGRyMjsKKwl1X2ludDMyX3Qgc3RhcnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtIHsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBoZWFkZXJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJb2ZmX3QgYWJzb2x1dGVfb2Zmc2V0OworfTsKKworc3RydWN0IHNkcF9oZWFkZXIgeworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaW5mbzsKKworCS8qIGZvciBtb3JlX21hZ2ljIGEgbGlzdCBvZiBzZHBfaGVhZGVyX2VudHJ5X2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBoZWFkZXJfbGlzdDsKKworCS8qIHRoZSBlbnRyeSBvZiB0aGUgc2RwX2hlYWRlciAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpOworCisjZW5kaWYgLyogX0lQQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX01FQVNfUkVQX0gKKyNkZWZpbmUgX01FQVNfUkVQX0gKKworI2RlZmluZSBNUkNfRl9QUk9DRVNTRUQJMHgwMDAxCisKKy8qIGV4dHJhY3RlZCBmcm9tIGEgTDMgbWVhc3VyZW1lbnQgcmVwb3J0IElFICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgeworCXVfaW50OF90IHJ4bGV2OworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgbmVpZ2hfaWR4OworCXVfaW50MTZfdCBhcmZjbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisvKiBSWCBMZXZlbCBhbmQgUlggUXVhbGl0eSAqLworc3RydWN0IGdzbV9yeF9sZXZfcXVhbCB7CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7Cit9OworCisvKiB1bmlkaXJlY3Rpb25hbCBtZWFzdW1yZW1lbnQgcmVwb3J0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBmdWxsOworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgc3ViOworfTsKKworI2RlZmluZSBNRUFTX1JFUF9GX1VMX0RUWAkweDAxCisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfVkFMSUQJMHgwMgorI2RlZmluZSBNRUFTX1JFUF9GX0JBMQkJMHgwNAorI2RlZmluZSBNRUFTX1JFUF9GX0RMX0RUWAkweDA4CisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfVE8JMHgxMAorI2RlZmluZSBNRUFTX1JFUF9GX01TX0wxCTB4MjAKKyNkZWZpbmUgTUVBU19SRVBfRl9GUEMJCTB4NDAKKworLyogcGFyc2VkIHVwbGluayBhbmQgZG93bmxpbmsgbWVhc3VyZW1lbnQgcmVzdWx0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwIHsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGxvZ2ljYWwgY2hhbm5lbCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogbnVtYmVyIG9mIHRoZSBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBmbGFncywgc2VlIE1FQVNfUkVQX0ZfKiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIHVwbGluayBhbmQgZG93bmxpbmsgcnhsZXYsIHJ4cXVhbDsgZnVsbCBhbmQgc3ViICovCisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgdWw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgZGw7CisKKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc190aW1pbmdfb2Zmc2V0OworCXN0cnVjdCB7CisJCWludDhfdCBwd3I7CS8qIE1TIHBvd2VyIGluIGRCbSAqLworCQl1X2ludDhfdCB0YTsJLyogTVMgdGltaW5nIGFkdmFuY2UgKi8KKwl9IG1zX2wxOworCisJLyogbmVpZ2hib3IgbWVhc3VyZW1lbnQgcmVwb3J0cyBmb3IgdXAgdG8gNiBjZWxscyAqLworCWludCBudW1fY2VsbDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgY2VsbFs2XTsKK307CisKK2VudW0gbWVhc19yZXBfZmllbGQgeworCU1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfRExfUlhMRVZfU1VCLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9TVUIsCisJTUVBU19SRVBfVUxfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWExFVl9TVUIsCisJTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhRVUFMX1NVQiwKK307CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pOworCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKTsKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpOworCisjZW5kaWYgLyogX01FQVNfUkVQX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4MDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgUlRQX1BPUlRfREVGQVVMVCA0MDAwCisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBSVFAgYXVkaW8gcG9ydCBmb3IgdGhlIGdpdmVuIG11bHRpcGxleAorICogYW5kIHRoZSBkaXJlY3Rpb24uIFRoaXMgYWxsb3dzIGEgc2VtaSBzdGF0aWMgZW5kcG9pbnQKKyAqIHRvIHBvcnQgY2FsY3VsYXRpb24gcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBCU0MKKyAqIGFuZCB0aGUgTWVkaWFHYXRld2F5IHRvIGNvbW11bmljYXRlLgorICoKKyAqIFBvcnQgdXNhZ2UgZXhwbGFpbmVkOgorICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDAgPT0gbG9jYWwgcG9ydCB0byB3YWl0IGZvciBuZXR3b3JrIHBhY2tldHMKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAxID09IGxvY2FsIHBvcnQgZm9yIHJ0Y3AKKyAqCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBCVFMgdGhhdCBuZWVkCisgKiB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIG5ldHdvcmsuCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrIHRoYXQKKyAqIG5lZWQgdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBCVFMuCisgKgorICogV2UgYXNzdW1lIHRvIGhhdmUgYSBzdGF0aWMgQlRTIElQIGFkZHJlc3Mgc28gd2UgY2FuIGRpZmZlcmVudGlhdGUKKyAqIG5ldHdvcmsgYW5kIEJUUy4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0cF9jYWxjdWxhdGVfcG9ydChpbnQgbXVsdGlwbGV4LCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4gYmFzZSArIChtdWx0aXBsZXggKiAyKTsKK30KKworCisvKgorICogSGFuZGxpbmcgb2YgTUdDUCBFbmRwb2ludHMgYW5kIHRoZSBNR0NQIENvbmZpZworICovCitzdHJ1Y3QgbWdjcF9lbmRwb2ludDsKK3N0cnVjdCBtZ2NwX2NvbmZpZzsKKworI2RlZmluZSBNR0NQX0VORFBfQ1JDWCAxCisjZGVmaW5lIE1HQ1BfRU5EUF9ETENYIDIKKyNkZWZpbmUgTUdDUF9FTkRQX01EQ1ggMworCisvKgorICogd2hhdCB0byBkbyB3aXRoIHRoZSBtc2c/CisgKgktIGNvbnRpbnVlIGFzIHVzdWFsPworICoJLSByZWplY3QgYW5kIHNlbmQgYSBmYWlsdXJlIGNvZGU/CisgKgktIGRlZmVyPyBkbyBub3Qgc2VuZCBhbnl0aGluZworICovCisjZGVmaW5lIE1HQ1BfUE9MSUNZX0NPTlQJNAorI2RlZmluZSBNR0NQX1BPTElDWV9SRUpFQ1QJNQorI2RlZmluZSBNR0NQX1BPTElDWV9ERUZFUgk2CisKK3R5cGVkZWYgaW50ICgqbWdjcF9jaGFuZ2UpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgaW50IGxvY2FsX3J0cCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcG9saWN5KShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGNvbnN0IGNoYXIgKnRyYW5zYWN0aW9faWQpOworCitzdHJ1Y3QgbWdjcF9jb25maWcgeworCWludCBzb3VyY2VfcG9ydDsKKwljaGFyICpsb2NhbF9pcDsKKwljaGFyICpzb3VyY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX2VuZHBvaW50czsKKwljaGFyICpidHNfaXA7CisKKwlzdHJ1Y3QgaW5fYWRkciBidHNfaW47CisJY2hhciAqYXVkaW9fbmFtZTsKKwlpbnQgYXVkaW9fcGF5bG9hZDsKKwlpbnQgYXVkaW9fbG9vcDsKKwlpbnQgZWFybHlfYmluZDsKKwlpbnQgcnRwX2Jhc2VfcG9ydDsKKworCWNoYXIgKmZvcndhcmRfaXA7CisJaW50IGZvcndhcmRfcG9ydDsKKworCW1nY3BfY2hhbmdlIGNoYW5nZV9jYjsKKwltZ2NwX3BvbGljeSBwb2xpY3lfY2I7CisJdm9pZCAqZGF0YTsKKworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CisJdW5zaWduZWQgaW50IGxhc3RfY2FsbF9pZDsKK307CisKKy8qIGNvbmZpZyBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpOworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKTsKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpOwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKy8qCisgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKTsKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsIGNvbnN0IGNoYXIgKmRhdGEpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDBjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKQEAgLTAsMCArMSw2NCBAQAorLyogTUdDUCBQcml2YXRlIERhdGEgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0RBVEFfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfREFUQV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBDSV9VTlVTRUQgMAorCitzdHJ1Y3QgbWdjcF9lbmRwb2ludCB7CisJaW50IGNpOworCWNoYXIgKmNhbGxpZDsKKwljaGFyICpsb2NhbF9vcHRpb25zOworCWludCBjb25uX21vZGU7CisKKwlpbnQgYnRzX3BheWxvYWRfdHlwZTsKKwlpbnQgbmV0X3BheWxvYWRfdHlwZTsKKworCS8qIHRoZSBsb2NhbCBydHAgcG9ydCB3ZSBhcmUgYmluZGluZyB0byAqLworCWludCBydHBfcG9ydDsKKworCS8qCisJICogUlRQIG1hbmdsaW5nOgorCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgdG8gdXMgYW5kIG5lZWQgdG8gZm9yd2FyZCB0byB0aGUgQlRTCisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCBmcm9tIHRoZSBCVFMgYW5kIGZvcndhcmQgdG8gdGhlIG5ldHdvcmsKKwkgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0cDsKKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0Y3A7CisKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGU7CisJc3RydWN0IGluX2FkZHIgYnRzOworCisJLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJaW50IG5ldF9ydHAsIG5ldF9ydGNwOworCWludCBidHNfcnRwLCBidHNfcnRjcDsKKworCS8qIGJhY2twb2ludGVyICovCisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7Cit9OworCisjZGVmaW5lIEVORFBPSU5UX05VTUJFUihlbmRwKSBhYnMoZW5kcCAtIGVuZHAtPmNmZy0+ZW5kcG9pbnRzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzhkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBNSVNETl9ICisjZGVmaW5lIE1JU0ROX0gKKworI2luY2x1ZGUgImUxX2lucHV0LmgiCisKK2ludCBtaV9zZXR1cChpbnQgY2FyZG5yLCAgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKTsKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MzM5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApAQCAtMCwwICsxLDE1OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX01OQ0NfSAorI2RlZmluZSBfTU5DQ19ICisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisKKy8qIE9uZSBlbmQgb2YgYSBjYWxsICovCitzdHJ1Y3QgZ3NtX2NhbGwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogbmV0d29yayBoYW5kbGUgKi8KKwl2b2lkICpuZXQ7CisKKwkvKiB0aGUgJ2xvY2FsJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCS8qIHRoZSAncmVtb3RlJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCByZW1vdGVfcmVmOworfTsKKworI2RlZmluZSBNTkNDX1NFVFVQX1JFUQkJMHgwMTAxCisjZGVmaW5lIE1OQ0NfU0VUVVBfSU5ECQkweDAxMDIKKyNkZWZpbmUgTU5DQ19TRVRVUF9SU1AJCTB4MDEwMworI2RlZmluZSBNTkNDX1NFVFVQX0NORgkJMHgwMTA0CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfUkVRCTB4MDEwNQorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX0lORAkweDAxMDYKKy8qIE1OQ0NfUkVKXyogaXMgcGVyZm9tZWQgdmlhIE1OQ0NfUkVMXyogKi8KKyNkZWZpbmUgTU5DQ19DQUxMX0NPTkZfSU5ECTB4MDEwNworI2RlZmluZSBNTkNDX0NBTExfUFJPQ19SRVEJMHgwMTA4CisjZGVmaW5lIE1OQ0NfUFJPR1JFU1NfUkVRCTB4MDEwOQorI2RlZmluZSBNTkNDX0FMRVJUX1JFUQkJMHgwMTBhCisjZGVmaW5lIE1OQ0NfQUxFUlRfSU5ECQkweDAxMGIKKyNkZWZpbmUgTU5DQ19OT1RJRllfUkVRCQkweDAxMGMKKyNkZWZpbmUgTU5DQ19OT1RJRllfSU5ECQkweDAxMGQKKyNkZWZpbmUgTU5DQ19ESVNDX1JFUQkJMHgwMTBlCisjZGVmaW5lIE1OQ0NfRElTQ19JTkQJCTB4MDEwZgorI2RlZmluZSBNTkNDX1JFTF9SRVEJCTB4MDExMAorI2RlZmluZSBNTkNDX1JFTF9JTkQJCTB4MDExMQorI2RlZmluZSBNTkNDX1JFTF9DTkYJCTB4MDExMgorI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX1JFUQkweDAxMTMKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9JTkQJMHgwMTE0CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9JTkQJMHgwMTE1CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SU1AJMHgwMTE2CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SRUoJMHgwMTE3CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX0lORAkweDAxMTgKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfUlNQCTB4MDExOQorI2RlZmluZSBNTkNDX01PRElGWV9SRVEJCTB4MDExYQorI2RlZmluZSBNTkNDX01PRElGWV9JTkQJCTB4MDExYgorI2RlZmluZSBNTkNDX01PRElGWV9SU1AJCTB4MDExYworI2RlZmluZSBNTkNDX01PRElGWV9DTkYJCTB4MDExZAorI2RlZmluZSBNTkNDX01PRElGWV9SRUoJCTB4MDExZQorI2RlZmluZSBNTkNDX0hPTERfSU5ECQkweDAxMWYKKyNkZWZpbmUgTU5DQ19IT0xEX0NORgkJMHgwMTIwCisjZGVmaW5lIE1OQ0NfSE9MRF9SRUoJCTB4MDEyMQorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0lORAkweDAxMjIKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9DTkYJMHgwMTIzCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfUkVKCTB4MDEyNAorI2RlZmluZSBNTkNDX1VTRVJJTkZPX1JFUQkweDAxMjUKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19JTkQJMHgwMTI2CisjZGVmaW5lIE1OQ0NfUkVKX1JFUQkJMHgwMTI3CisjZGVmaW5lIE1OQ0NfUkVKX0lORAkJMHgwMTI4CisKKyNkZWZpbmUgTU5DQ19CUklER0UJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZSQU1FX1JFQ1YJCTB4MDIwMQorI2RlZmluZSBNTkNDX0ZSQU1FX0RST1AJCTB4MDIwMgorI2RlZmluZSBNTkNDX0xDSEFOX01PRElGWQkweDAyMDMKKworI2RlZmluZSBHU01fVENIRl9GUkFNRQkJMHgwMzAwCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FX0VGUgkweDAzMDEKKworI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZCTEyOAorI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTgkxMjgKKyNkZWZpbmUgR1NNX01BWF9VU0VSVVNFUgkxMjgKKworI2RlZmluZQlNTkNDX0ZfQkVBUkVSX0NBUAkweDAwMDEKKyNkZWZpbmUgTU5DQ19GX0NBTExFRAkJMHgwMDAyCisjZGVmaW5lIE1OQ0NfRl9DQUxMSU5HCQkweDAwMDQKKyNkZWZpbmUgTU5DQ19GX1JFRElSRUNUSU5HCTB4MDAwOAorI2RlZmluZSBNTkNDX0ZfQ09OTkVDVEVECTB4MDAxMAorI2RlZmluZSBNTkNDX0ZfQ0FVU0UJCTB4MDAyMAorI2RlZmluZSBNTkNDX0ZfVVNFUlVTRVIJCTB4MDA0MAorI2RlZmluZSBNTkNDX0ZfUFJPR1JFU1MJCTB4MDA4MAorI2RlZmluZSBNTkNDX0ZfRU1FUkdFTkNZCTB4MDEwMAorI2RlZmluZSBNTkNDX0ZfRkFDSUxJVFkJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZfU1NWRVJTSU9OCTB4MDQwMAorI2RlZmluZSBNTkNDX0ZfQ0NDQVAJCTB4MDgwMAorI2RlZmluZSBNTkNDX0ZfS0VZUEFECQkweDEwMDAKKyNkZWZpbmUgTU5DQ19GX1NJR05BTAkJMHgyMDAwCisKK3N0cnVjdCBnc21fbW5jYyB7CisJLyogY29udGV4dCBiYXNlZCBpbmZvcm1hdGlvbiAqLworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKworCS8qIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCAqLworCXVfaW50MzJfdAlmaWVsZHM7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb25zIChNTkNDX0ZfIGJhc2VkKSAqLworCXN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwCWJlYXJlcl9jYXA7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGVkOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJcmVkaXJlY3Rpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY29ubmVjdGVkOworCXN0cnVjdCBnc21fbW5jY19jYXVzZQkJY2F1c2U7CisJc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzCXByb2dyZXNzOworCXN0cnVjdCBnc21fbW5jY191c2VydXNlcgl1c2VydXNlcjsKKwlzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkJZmFjaWxpdHk7CisJc3RydWN0IGdzbV9tbmNjX2NjY2FwCQljY2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uCXNzdmVyc2lvbjsKKwlzdHJ1Y3QJeworCQlpbnQJCXN1cDsKKwkJaW50CQlpbnY7CisJfSBjbGlyOworCWludAkJc2lnbmFsOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9uLCBub3QgTU5DQ19GIGJhc2VkICovCisJaW50CQlrZXlwYWQ7CisJaW50CQltb3JlOworCWludAkJbm90aWZ5OyAvKiAwLi4xMjcgKi8KKwlpbnQJCWVtZXJnZW5jeTsKKwljaGFyCQlpbXNpWzE2XTsKKworCXVuc2lnbmVkIGNoYXIJbGNoYW5fbW9kZTsKK307CisKK3N0cnVjdCBnc21fZGF0YV9mcmFtZSB7CisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCXVuc2lnbmVkIGNoYXIJZGF0YVswXTsKK307CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKTsKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJlNTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApAQCAtMCwwICsxLDM1IEBACisvKiAKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDREVGSU5FU19ICisjZGVmaW5lIE9QRU5CU0NERUZJTkVTX0gKKworI2lmZGVmIEJVSUxESU5HX09OX1dJTkRPV1MKKyAgICAjaWZkZWYgQlVJTERJTkdfT1BFTkJTQworICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgICNlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIEJTQ19BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZGNhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQUdJTkdfSAorI2RlZmluZSBQQUdJTkdfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgImdzbV9zdWJzY3JpYmVyLmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworLyogY2FsbCBvbmNlIGZvciBldmVyeSBnc21fYnRzLi4uICovCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBzY2hlZHVsZSBwYWdpbmcgcmVxdWVzdCAqLworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7CisKKy8qIHN0b3AgcGFnaW5nIHJlcXVlc3RzICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiB1cGRhdGUgcGFnaW5nIGxvYWQgKi8KK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTcyYzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfUkVTVF9PQ1RFVFNfSAorI2RlZmluZSBfUkVTVF9PQ1RFVFNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3Bvcyk7CisKK3N0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHsKKwl1X2ludDE2X3QgcGVuYWx0eV90aW1lOjUsCisJCSAgdGVtcF9vZmZzOjMsCisJCSAgY2VsbF9yZXNlbF9vZmY6NiwKKwkJICBjYnE6MSwKKwkJICBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHsKKwl1X2ludDhfdCBwb3dlcl9vZmZzZXQ6MiwKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgeworCXVfaW50OF90IHNpMTNfcG9zaXRpb246MSwKKwkJIHJhX2NvbG91cjozLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgeworCXVfaW50MzJfdCBwcmlvX3RocjozLAorCQkgbHNhX29mZnNldDozLAorCQkgbWNjOjEyLAorCQkgbW5jOjEyOworCXVuc2lnbmVkIGludCBwcmVzZW50OworfTsKKworc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8geworCXN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHNlbGVjdGlvbl9wYXJhbXM7CisJc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCBwb3dlcl9vZmZzZXQ7CisJdV9pbnQ4X3Qgc2kydGVyX2luZGljYXRvcjsKKwl1X2ludDhfdCBlYXJseV9jbV9jdHJsOworCXN0cnVjdCB7CisJCXVfaW50OF90IHdoZXJlOjMsCisJCQkgcHJlc2VudDoxOworCX0gc2NoZWR1bGluZzsKKwlzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIGdwcnNfaW5kOworCisJLyogU0kgNCBzcGVjaWZpYyAqLworCXN0cnVjdCBnc200OF9sc2FfcGFyYW1zIGxzYV9wYXJhbXM7CisJdV9pbnQxNl90IGNlbGxfaWQ7CisJdV9pbnQ4X3QgYnJlYWtfaW5kOwkvKiBkbyB3ZSBoYXZlIFNJNyArIFNJOCA/ICovCit9OworCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpOworCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCk7CisKK2VudW0gcGJjY2hfY2Fycmllcl90eXBlIHsKKwlQQkNDSF9CQ0NILAorCVBCQ0NIX0FSRkNOLAorCVBCQ0NIX01BSU8KK307CisKKy8qIFRTIDAzLjYwIENoYXB0ZXIgNi4zLjMuMTogTmV0d29yayBNb2RlIG9mIE9wZXJhdGlvbiAqLworZW51bSBncHJzX25tbyB7CisJR1BSU19OTU9fSQk9IDAsCS8qIENTIHBhZ2luIG9uIEdQUlMgcGFnaW5nIG9yIHRyYWZmaWMgY2hhbm5lbCAqLworCUdQUlNfTk1PX0lJCT0gMSwJLyogYWxsIHBhZ2luZyBvbiBDQ0NIICovCisJR1BSU19OTU9fSUlJCT0gMiwJLyogbm8gcGFnaW5nIGNvb3JkaW5hdGlvbiAqLworfTsKKworc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIHsKKwllbnVtIGdwcnNfbm1vIG5tbzsKKwkvKiBUMzE2ODogd2FpdCBmb3IgcGFja2V0IHVwbGluayBhc3NpZ25tZW50IG1lc3NhZ2UgKi8KKwl1X2ludDMyX3QgdDMxNjg7CS8qIGluIG1pbGxpc2Vjb25kcyAqLworCS8qIFQzMTkyOiB3YWl0IGZvciByZWxlYXNlIG9mIHRoZSBUQkYgYWZ0ZXIgcmVjZXB0aW9uIG9mIHRoZSBmaW5hbCBibG9jayAqLworCXVfaW50MzJfdCB0MzE5MjsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJdV9pbnQzMl90IGRyeF90aW1lcl9tYXg7LyogaW4gc2Vjb25kcyAqLworCXVfaW50MzJfdCBic19jdl9tYXg7Cit9OworCisvKiBUUyAwNC42MCBUYWJsZSAxMi45LjIgKi8KK3N0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyB7CisJdV9pbnQ4X3QgYWxwaGE7CisJdV9pbnQ4X3QgdF9hdmdfdzsKKwl1X2ludDhfdCB0X2F2Z190OworCXVfaW50OF90IHBjX21lYXNfY2hhbjsKKwl1X2ludDhfdCBuX2F2Z19pOworfTsKKworc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyB7CisJc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIGNlbGxfb3B0czsKKwlzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgcHdyX2N0cmxfcGFyczsKKwl1X2ludDhfdCBiY2NoX2NoYW5nZV9tYXJrOworCXVfaW50OF90IHNpX2NoYW5nZV9maWVsZDsKKwl1X2ludDhfdCBwYmNjaF9wcmVzZW50OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcmFjOworCQkJdV9pbnQ4X3Qgc3BnY19jY2NoX3N1cDsKKwkJCXVfaW50OF90IG5ldF9jdHJsX29yZDsKKwkJCXVfaW50OF90IHByaW9fYWNjX3RocjsKKwkJfSBub19wYmNjaDsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IHBzaTFfcmVwX3BlcjsKKwkJCXVfaW50OF90IHBiOworCQkJdV9pbnQ4X3QgdHNjOworCQkJdV9pbnQ4X3QgdG47CisJCQllbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSBjYXJyaWVyX3R5cGU7CisJCQl1X2ludDE2X3QgYXJmY247CisJCQl1X2ludDhfdCBtYWlvOworCQl9IHBiY2NoOworCX07Cit9OworCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpOworCisjZW5kaWYgLyogX1JFU1RfT0NURVRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTg3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfUlMyMzJfSAorI2RlZmluZSBfUlMyMzJfSAorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9SUzIzMl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjcxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9SVFBfUFJPWFlfSAorI2RlZmluZSBfUlRQX1BST1hZX0gKKworLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCitlbnVtIHJ0cF9yeF9hY3Rpb24geworCVJUUF9OT05FLAorCVJUUF9QUk9YWSwKKwlSVFBfUkVDVl9VUFNUUkVBTSwKK307CisKK2VudW0gcnRwX3R4X2FjdGlvbiB7CisJUlRQX1NFTkRfTk9ORSwKKwlSVFBfU0VORF9ET1dOU1RSRUFNLAorfTsKKworc3RydWN0IHJ0cF9zdWJfc29ja2V0IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX2xvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fcmVtb3RlOworCisJc3RydWN0IGJzY19mZCBiZmQ7CisJLyogbGlua2VkIGxpc3Qgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNnYidzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydHA7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0Y3A7CisKKwkvKiB3aGF0IHNob3VsZCB3ZSBkbyBvbiByZWNlaXZlPyAqLworCWVudW0gcnRwX3J4X2FjdGlvbiByeF9hY3Rpb247CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyX3NvY2s7CisJCX0gcHJveHk7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwkJCXVfaW50MzJfdCBjYWxscmVmOworCQl9IHJlY2VpdmU7CisJfTsKKwllbnVtIHJ0cF90eF9hY3Rpb24gdHhfYWN0aW9uOworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwkJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwkJdV9pbnQzMl90IHNzcmM7CisJCXN0cnVjdCB0aW1ldmFsIGxhc3RfdHY7CisJfSB0cmFuc21pdDsKK307CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKTsKK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApOworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpOworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcik7CitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmKTsKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKTsKK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOworCisjZW5kaWYgLyogX1JUUF9QUk9YWV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjI4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJpYyBzaWduYWxsaW5nL25vdGlmaWNhdGlvbiBpbmZyYXN0cnVjdHVyZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfU0lHTkFMX0gKKyNkZWZpbmUgT1BFTkJTQ19TSUdOQUxfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKworLyoKKyAqIFNpZ25hbGxpbmcgc3Vic3lzdGVtcworICovCitlbnVtIHNpZ25hbF9zdWJzeXN0ZW1zIHsKKwlTU19QQUdJTkcsCisJU1NfU01TLAorCVNTX0FCSVNJUCwKKwlTU19OTSwKKwlTU19MQ0hBTiwKKwlTU19TVUJTQ1IsCisJU1NfU0NBTEwsCisJU1NfR0xPQkFMLAorfTsKKworLyogU1NfUEFHSU5HIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3BhZ2luZyB7CisJU19QQUdJTkdfU1VDQ0VFREVELAorCVNfUEFHSU5HX0VYUElSRUQsCit9OworCisvKiBTU19TTVMgc2lnbmFscyAqLworZW51bSBzaWduYWxfc21zIHsKKwlTX1NNU19TVUJNSVRURUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdXMgKi8KKwlTX1NNU19ERUxJVkVSRUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gYSBNUyAqLworCVNfU01TX1NNTUEsCQkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworCVNfU01TX01FTV9FWENFRURFRCwJLyogQSBNUyB0ZWxscyB1cyBpdCBoYXMgbm8gbW9yZSBzcGFjZSBhdmFpbGFibGUgKi8KK307CisKKy8qIFNTX0FCSVNJUCBzaWduYWxzICovCitlbnVtIHNpZ25hbF9hYmlzaXAgeworCVNfQUJJU0lQX0NSQ1hfQUNLLAorCVNfQUJJU0lQX01EQ1hfQUNLLAorCVNfQUJJU0lQX0RMQ1hfSU5ELAorfTsKKworLyogU1NfTk0gc2lnbmFscyAqLworZW51bSBzaWduYWxfbm0geworCVNfTk1fU1dfQUNUSVZfUkVQLAkvKiBHU00gMTIuMjEgc29mdHdhcmUgYWN0aXZhdGVkIHJlcG9ydCAqLworCVNfTk1fRkFJTF9SRVAsCQkvKiBHU00gMTIuMjEgZmFpbHVyZSBldmVudCByZXBvcnQgKi8KKwlTX05NX05BQ0ssCQkvKiBHU00gMTIuMjEgdmFyaW91cyBOTV9NVF8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX05BQ0ssCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX0FDSywJCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX0FDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0ssIC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fVEVTVF9SRVAsCQkvKiBHU00gMTIuMjEgVGVzdCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0xDSEFOIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2xjaGFuIHsKKwkvKgorCSAqIFRoZSBsY2hhbiBnb3QgZnJlZWQgd2l0aCBhbiB1c2VfY291bnQgIT0gMCBhbmQgZXJyb3IKKwkgKiByZWNvdmVyeSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dCBmcm9tIHdpdGhpbiB0aGUKKwkgKiBzaWduYWwgaGFuZGxlci4KKwkgKi8KKwlTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwKKwlTX0xDSEFOX0FDVElWQVRFX0FDSywJCS8qIDA4LjU4IENoYW5uZWwgQWN0aXZhdGUgQUNLICovCisJU19MQ0hBTl9BQ1RJVkFURV9OQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBOQUNLICovCisJU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwJCS8qIDA0LjA4IEhhbmRvdmVyIENvbXBsZXRlZCAqLworCVNfTENIQU5fSEFORE9WRVJfRkFJTCwJCS8qIDA0LjA4IEhhbmRvdmVyIEZhaWxlZCAqLworCVNfTENIQU5fSEFORE9WRVJfREVURUNULAkvKiAwOC41OCBIYW5kb3ZlciBEZXRlY3QgKi8KKwlTX0xDSEFOX01FQVNfUkVQLAkJLyogMDguNTggTWVhc3VyZW1lbnQgUmVwb3J0ICovCit9OworCisvKiBTU19TVUJTQ1Igc2lnbmFscyAqLworZW51bSBzaWduYWxfc3Vic2NyIHsKKwlTX1NVQlNDUl9BVFRBQ0hFRCwKKwlTX1NVQlNDUl9ERVRBQ0hFRCwKKwlTX1NVQlNDUl9JREVOVElUWSwJCS8qIHdlJ3ZlIHJlY2VpdmVkIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTX1NDQUxMIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NjYWxsIHsKKwlTX1NDQUxMX1NVQ0NFU1MsCisJU19TQ0FMTF9FWFBJUkVELAorCVNfU0NBTExfREVUQUNIRUQsCit9OworCitlbnVtIHNpZ25hbF9nbG9iYWwgeworCVNfR0xPQkFMX1NIVVRET1dOLAorfTsKKworc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIE5VTEwgaW4gY2FzZSB0aGUgcGFnaW5nIGRpZG4ndCB3b3JrICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47Cit9OworCitzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXVfaW50OF90IG1zZ190eXBlOwkKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYzUxOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfU0lMRU5UX0NBTExfSAorI2RlZmluZSBfU0lMRU5UX0NBTExfSAorCitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCB0eXBlKTsKK2V4dGVybiBpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworZXh0ZXJuIGludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9TSUxFTlRfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmYTAyMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBfU1VCQ0hfREVNVVhfSAorI2RlZmluZSBfU1VCQ0hfREVNVVhfSAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgTlJfU1VCQ0gJNAorI2RlZmluZSBUUkFVX0ZSQU1FX1NJWkUJNDAKKyNkZWZpbmUgVFJBVV9GUkFNRV9CSVRTCShUUkFVX0ZSQU1FX1NJWkUqOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogREVNVUxUSVBMRVhFUiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZGVtdXhfc3ViY2ggeworCXVfaW50OF90IG91dF9iaXRidWZbVFJBVV9GUkFNRV9CSVRTXTsKKwl1X2ludDE2X3Qgb3V0X2lkeDsgLyogbmV4dCBiaXQgdG8gYmUgd3JpdHRlbiBpbiBvdXRfYml0YnVmICovCisJLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHplcm9zIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCAoZm9yIHN5bmMpICovCisJdW5zaWduZWQgaW50IGNvbnNlY3V0aXZlX3plcm9zOworCS8qIGFyZSB3ZSBpbiBUUkFVIGZyYW1lIHN5bmMgb3Igbm90PyAqLworCXVuc2lnbmVkIGludCBpbl9zeW5jOworfTsKKworc3RydWN0IHN1YmNoX2RlbXV4IHsKKwkvKiBiaXRtYXNrIG9mIGN1cnJlbnRseSBhY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwl1X2ludDhfdCBjaGFuX2FjdGl2OworCS8qIG9uZSBkZW11eF9zdWJjaCBzdHJ1Y3QgZm9yIGV2ZXJ5IHN1YmNoYW5uZWwgKi8KKwlzdHJ1Y3QgZGVtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbmNlIHdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZQorCSAqIGZyYW1lIG9uIGEgZ2l2ZW4gc3ViY2hhbm5lbCAqLworCWludCAoKm91dF9jYikoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBjaCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4sCisJCSAgICAgIHZvaWQgKik7CisJLyogdXNlci1wcm92aWRlZCBkYXRhLCB0cmFuc3BhcmVudGx5IHBhc3NlZCB0byBvdXRfY2IoKSAqLworCXZvaWQgKmRhdGE7Cit9OworCisvKiBpbml0aWFsaXplIG9uZSBkZW11bHRpcGxleGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hfZGVtdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCk7CisKKy8qIGZlZWQgJ2xlbicgbnVtYmVyIG9mIG11eGVkIGJ5dGVzIGludG8gdGhlIGRlbXVsdGlwbGV4ZXIgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisvKiBhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2FjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpOworCisvKiBkZWFjdGl2YXRlIGRlY29kaW5nL3Byb2Nlc3NpbmcgZm9yIG9uZSBzdWJjaGFubmVsICovCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogb25lIGVsZW1lbnQgaW4gdGhlIHR4X3F1ZXVlIG9mIGEgbXV4ZXIgc3ViLWNoYW5uZWwgKi8KK3N0cnVjdCBzdWJjaF90eHFfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1bnNpZ25lZCBpbnQgYml0X2xlbjsJLyogdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gJ2JpdHMnICovCisJdW5zaWduZWQgaW50IG5leHRfYml0OwkvKiBuZXh0IGJpdCB0byBiZSB0cmFuc21pdHRlZCAqLworCisJdV9pbnQ4X3QgYml0c1swXTsJLyogb25lIGJpdCBwZXIgYnl0ZSAqLworfTsKKworc3RydWN0IG11eF9zdWJjaCB7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCisvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgc3ViY2hhbm5lbCBtdXhlciAqLworc3RydWN0IHN1YmNoX211eCB7CisJc3RydWN0IG11eF9zdWJjaCBzdWJjaFtOUl9TVUJDSF07Cit9OworCisvKiBpbml0aWFsaXplIGEgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpOworCisvKiByZXF1ZXN0IHRoZSBvdXRwdXQgb2YgJ2xlbicgbXVsdGlwbGV4ZWQgYnl0ZXMgKi8KK2ludCBzdWJjaGFuX211eF9vdXQoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byBvbmUgc3ViLWNoYW5uZWwgb2YgdGhlIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbik7CisKKyNlbmRpZiAvKiBfU1VCQ0hfREVNVVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhOWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9TWVNURU1fSU5GT19ICisjZGVmaW5lIF9TWVNURU1fSU5GT19ICisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU3OTRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIG1pbmltYWxpc3RpYyB0ZWxuZXQvbmV0d29yayBpbnRlcmZhY2UgaXQgbWlnaHQgdHVybiBpbnRvIGEgd2lyZSBpbnRlcmZhY2UgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFRFTE5FVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBURUxORVRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqZGJnOworfTsKKworCit2b2lkIHRlbG5ldF9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgaW50IHBvcnQpOworCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMzY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmIF9UUkFOU0FDVF9ICisjZGVmaW5lIF9UUkFOU0FDVF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisKKy8qIE9uZSB0cmFuc2FjdGlvbiAqLworc3RydWN0IGdzbV90cmFucyB7CisJLyogRW50cnkgaW4gbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBUaGUgcHJvdG9jb2wgd2l0aGluIHdoaWNoIHdlIGxpdmUgKi8KKwl1X2ludDhfdCBwcm90b2NvbDsKKworCS8qIFRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElEICovCisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCisJLyogVG8gd2hvbSB3ZSBiZWxvbmcsIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHJlbW90ZSBNTSBlbnRpdHkgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIFRoZSBMQ0hBTiB0aGF0IHdlJ3JlIGN1cnJlbnRseSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YTUxNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMiBAQAorc2NjcF9IRUFERVJTID0gc2NjcF90eXBlcy5oIHNjY3AuaAorc2NjcGRpciA9ICQoaW5jbHVkZWRpcikvc2NjcApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcC5oIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzQ3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBTQ0NQIG1hbmFnZW1lbnQgY29kZQorICoKKyAqIChDKSAyMDA5LCAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBTQ0NQX0gKKyNkZWZpbmUgU0NDUF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInNjY3BfdHlwZXMuaCIKKworc3RydWN0IG1zZ2I7CitzdHJ1Y3Qgc2NjcF9zeXN0ZW07CisKK2VudW0geworCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9OT05FLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRVFVRVNULAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRSwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfU0VUVVBfRVJST1IsCit9OworCitzdHJ1Y3Qgc29ja2FkZHJfc2NjcCB7CisJc2FfZmFtaWx5X3QJc2NjcF9mYW1pbHk7CQkvKiBBRl9TQ0NQIGluIHRoZSBmdXR1cmU/Pz8gKi8KKwl1X2ludDhfdAlzY2NwX3NzbjsJCS8qIHN1YnNzeXN0ZW0gbnVtYmVyIGZvciByb3V0aW5nICovCisKKwkvKiBUT0RPIGZpbGwgaW4gYWRkcmVzcyBpbmRpY2F0b3IuLi4gaWYgdGhhdCBpcyBldmVyIG5lZWRlZCAqLworCisJLyogbm90IHN1cmUgYWJvdXQgdGhlc2UgKi8KKwkvKiB1X2ludDhfdCAgICBzY2NwX2NsYXNzOyAqLworfTsKKworLyoKKyAqIHBhcnNlZCBzdHJ1Y3R1cmUgb2YgYW4gYWRkcmVzcworICovCitzdHJ1Y3Qgc2NjcF9hZGRyZXNzIHsKKwlzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAgICBhZGRyZXNzOworCXVfaW50OF90CQkJICAgIHNzbjsKKwl1X2ludDhfdAkJCSAgICBwb2lbMl07Cit9OworCitzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIHsKKwl1X2ludDhfdAkJCSAgICBkYXRhX2xlbjsKKwl1X2ludDhfdAkJCSAgICBkYXRhX3N0YXJ0OworfTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbiB7CisJLyogcHVibGljICovCisJdm9pZCAqZGF0YV9jdHg7CisJdm9pZCAoKmRhdGFfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pOworCisJdm9pZCAqc3RhdGVfY3R4OworCXZvaWQgKCpzdGF0ZV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCBpbnQgb2xkX3N0YXRlKTsKKworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCWludCBjb25uZWN0aW9uX3N0YXRlOworCisJLyogcHJpdmF0ZSAqLworCS8qIGxpc3Qgb2YgYWN0aXZlIGNvbm5lY3Rpb25zICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgc2NjcF9zeXN0ZW0gKnN5c3RlbTsKKwlpbnQgaW5jb21pbmc7Cit9OworCisvKioKKyAqIHN5c3RlbSBmdW5jdGlvbmFsaXR5IHRvIGltcGxlbWVudCBvbiB0b3Agb2YgYW55IG90aGVyIHRyYW5zcG9ydCBsYXllcjoKKyAqICAgY2FsbCBzY2NwX3N5c3RlbV9pbmNvbWluZyBmb3IgaW5jb21pbmcgZGF0YSAoZnJvbSB0aGUgbmV0d29yaykKKyAqICAgc2NjcCB3aWxsIGNhbGwgb3V0Z29pbmcgd2hlbmV2ZXIgb3V0Z29pbmcgZGF0YSBleGlzdHMKKyAqLworaW50IHNjY3Bfc3lzdGVtX2luaXQoaW50ICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHNvY2tldC4gU2V0IHlvdXIgY2FsbGJhY2tzIGFuZCB0aGVuIGNhbGwgYmluZCB0byBvcGVuCisgKiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqc2NjcF9jb25uZWN0aW9uX3NvY2tldCh2b2lkKTsKKworLyoqCisgKiBPcGVuIHRoZSBjb25uZWN0aW9uIGFuZCBzZW5kIGFkZGl0aW9uYWwgZGF0YQorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc2NjcF9jYWxsZWQsCisJCQkgICAgc3RydWN0IG1zZ2IgKmRhdGEpOworCisvKioKKyAqIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBTZXQgdGhlIGFjY2VwdCBjYWxsYmFjay4KKyAqIFRPRE86IGFkZCB0cnVlIHJvdXRpbmcgaW5mb3JtYXRpb24uLi4gaW4gYW5hbG9neSB0byBzb2NrZXQsIGJpbmQsIGFjY2VwdAorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJCQkgaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICpkYXRhKSwKKwkJCQkgdm9pZCAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBTZW5kIGRhdGEgaW4gdGVybXMgb2YgdW5pdCBkYXRhLiBBIGZpeGVkIGFkZHJlc3MgaW5kaWNhdG9yIHdpbGwgYmUgdXNlZC4KKyAqLworaW50IHNjY3Bfd3JpdGUoc3RydWN0IG1zZ2IgKmRhdGEsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3NlbmRlciwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2tfdGFyZ2V0LCBpbnQgY2xhc3MpOworaW50IHNjY3Bfc2V0X3JlYWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCSAgaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCwgdm9pZCAqdXNlcl9kYXRhKSwKKwkJICB2b2lkICp1c2VyX2RhdGEpOworCisvKiBnZW5lcmljIHNvY2sgYWRkcmVzc2VzICovCitleHRlcm4gY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3Agc2NjcF9zc25fYnNzYXA7CisKKy8qIGhlbHBlcnMgKi8KK3VfaW50MzJfdCBzY2NwX3NyY19yZWZfdG9faW50KHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZik7CitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNjY3Bfc3JjX3JlZl9mcm9tX2ludCh1X2ludDMyX3QpOworCisvKioKKyAqIEJlbG93IHRoaXMgYXJlIGhlbHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgZm9yIHBhcnNpbmcgU0NDUCBtZXNzYWdlcworICovCitzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgeworCXN0cnVjdCBzY2NwX2FkZHJlc3MgY2FsbGVkOworCXN0cnVjdCBzY2NwX2FkZHJlc3MgY2FsbGluZzsKKworCS8qIHBvaW50IHRvIHRoZSBtc2cgcGFja2V0ICovCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKiBkYXRhIHBvaW50ZXIgKi8KKwlpbnQgZGF0YV9sZW47Cit9OworCisvKgorICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIG5hdCBjb2RlCisgKi8KK2ludCBzY2NwX2RldGVybWluZV9tc2dfdHlwZShzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBzY2NwX3BhcnNlX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmRhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBJVFUgUS43MTMgZGVmaW5lZCB0eXBlcyBmb3IgU0NDUAorICoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBTQ0NQX1RZUEVTX0gKKyNkZWZpbmUgU0NDUF9UWVBFU19ICisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogVGFibGUgMS9RLjcxMyAtIFNDQ1AgbWVzc2FnZSB0eXBlcyAqLworZW51bSBzY2NwX21lc3NhZ2VfdHlwZXMgeworCVNDQ1BfTVNHX1RZUEVfQ1IJPSAxLAorCVNDQ1BfTVNHX1RZUEVfQ0MJPSAyLAorCVNDQ1BfTVNHX1RZUEVfQ1JFRgk9IDMsCisJU0NDUF9NU0dfVFlQRV9STFNECT0gNCwKKwlTQ0NQX01TR19UWVBFX1JMQwk9IDUsCisJU0NDUF9NU0dfVFlQRV9EVDEJPSA2LAorCVNDQ1BfTVNHX1RZUEVfRFQyCT0gNywKKwlTQ0NQX01TR19UWVBFX0FLCT0gOCwKKwlTQ0NQX01TR19UWVBFX1VEVAk9IDksCisJU0NDUF9NU0dfVFlQRV9VRFRTCT0gMTAsCisJU0NDUF9NU0dfVFlQRV9FRAk9IDExLAorCVNDQ1BfTVNHX1RZUEVfRUEJPSAxMiwKKwlTQ0NQX01TR19UWVBFX1JTUgk9IDEzLAorCVNDQ1BfTVNHX1RZUEVfUlNDCT0gMTQsCisJU0NDUF9NU0dfVFlQRV9FUlIJPSAxNSwKKwlTQ0NQX01TR19UWVBFX0lUCT0gMTYsCisJU0NDUF9NU0dfVFlQRV9YVURUCT0gMTcsCisJU0NDUF9NU0dfVFlQRV9YVURUUwk9IDE4LAorCVNDQ1BfTVNHX1RZUEVfTFVEVAk9IDE5LAorCVNDQ1BfTVNHX1RZUEVfTFVEVFMJPSAyMAorfTsKKworLyogVGFibGUgMi9RLjcxMyAtIFNDQ1AgcGFyYW1ldGVyIG5hbWUgY29kZXMgKi8KK2VudW0gc2NjcF9wYXJhbWV0ZXJfbmFtZV9jb2RlcyB7CisJU0NDUF9QTkNfRU5EX09GX09QVElPTkFMCQk9IDAsCisJU0NDUF9QTkNfREVTVElOQVRJT05fTE9DQUxfUkVGRVJFTkNFCT0gMSwKKwlTQ0NQX1BOQ19TT1VSQ0VfTE9DQUxfUkVGRVJFTkNFCQk9IDIsCisJU0NDUF9QTkNfQ0FMTEVEX1BBUlRZX0FERFJFU1MJCT0gMywKKwlTQ0NQX1BOQ19DQUxMSU5HX1BBUlRZX0FERFJFU1MJCT0gNCwKKwlTQ0NQX1BOQ19QUk9UT0NPTF9DTEFTUwkJCT0gNSwKKwlTQ0NQX1BOQ19TRUdNRU5USU5HCQkJPSA2LAorCVNDQ1BfUE5DX1JFQ0VJVkVfU0VRX05VTUJFUgkJPSA3LAorCVNDQ1BfUE5DX1NFUVVFTkNJTkcJCQk9IDgsCisJU0NDUF9QTkNfQ1JFRElUCQkJCT0gOSwKKwlTQ0NQX1BOQ19SRUxFQVNFX0NBVVNFCQkJPSAxMCwKKwlTQ0NQX1BOQ19SRVRVUk5fQ0FVU0UJCQk9IDExLAorCVNDQ1BfUE5DX1JFU0VUX0NBVVNFCQkJPSAxMiwKKwlTQ0NQX1BOQ19FUlJPUl9DQVVTRQkJCT0gMTMsCisJU0NDUF9QTkNfUkVGVVNBTF9DQVVTRQkJCT0gMTQsCisJU0NDUF9QTkNfREFUQQkJCQk9IDE1LAorCVNDQ1BfUE5DX1NFR01FTlRBVElPTgkJCT0gMTYsCisJU0NDUF9QTkNfSE9QX0NPVU5URVIJCQk9IDE3LAorCVNDQ1BfUE5DX0lNUE9SVEFOQ0UJCQk9IDE4LAorCVNDQ1BfUE5DX0xPTkdfREFUQQkJCT0gMTksCit9OworCisvKiBGaWd1cmUgMy9RLjcxMyBDYWxsZWQvY2FsbGluZyBwYXJ0eSBhZGRyZXNzICovCitlbnVtIHsKKwlTQ0NQX1RJVExFX0lORF9OT05FCQkJPSAwLAorCVNDQ1BfVElUTEVfSU5EX05BVFVSRV9PTkxZCQk9IDEsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNMQVRJT05fT05MWQkJPSAyLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TX05VTV9FTkMJCT0gMywKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DX05BVFVSRQk9IDQsCit9OworCitlbnVtIHsKKwlTQ0NQX0NBTExfUk9VVEVfT05fU1NOCQkJPSAxLAorCVNDQ1BfQ0FMTF9ST1VURV9PTl9HVAkJCT0gMCwKK307CisKK3N0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxLAorCQkJc3NuX2luZGljYXRvcgkgICAgIDogMSwKKwkJCWdsb2JhbF90aXRsZV9pbmRpY2F0b3IgOiA0LAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJcmVzZXJ2ZWQJICAgICA6IDE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJcmVzZXJ2ZWQJICAgICA6IDEsCisJCQlyb3V0aW5nX2luZGljYXRvciAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlwb2ludF9jb2RlX2luZGljYXRvciA6IDE7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogaW5kaWNhdG9yIGluZGljYXRlcyBwcmVzZW5jZSBpbiB0aGUgYWJvdmUgb3JkZXIgKi8KKworLyogRmlndXJlIDYvUS43MTMgKi8KK3N0cnVjdCBzY2NwX3NpZ25hbGxpbmdfcG9pbnRfY29kZSB7CisJdV9pbnQ4X3QJbHNiOworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAltc2IgOiA2LAorCQkJcmVzZXJ2ZWQgOiAyOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkIDogMiwKKwkJCW1zYiA6IDY7CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFNTTiA9PSBzdWJzeXN0ZW0gbnVtYmVyICovCitlbnVtIHNjY3Bfc3Vic3lzdGVtX251bWJlciB7CisJU0NDUF9TU05fTk9UX0tOT1dOX09SX1VTRUQJICAgID0gMCwKKwlTQ0NQX1NTTl9NQU5BR0VNRU5UCQkgICAgPSAxLAorCVNDQ1BfU1NOX1JFU0VSVkVEX0lUVQkJICAgID0gMiwKKwlTQ0NQX1NTTl9JU0ROX1VTRVJfUEFSVAkJICAgID0gMywKKwlTQ0NQX1NTTl9PTUFQCQkJICAgID0gNCwgLyogb3BlcmF0aW9uLCBtYWludCBhbmQgYWRtaW5pc3RyYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX01BUAkJCSAgICA9IDUsIC8qIG1vYmlsZSBhcHBsaWNhdGlvbiBwYXJ0ICovCisJU0NDUF9TU05fSExSCQkJICAgID0gNiwKKwlTQ0NQX1NTTl9WTFIJCQkgICAgPSA3LAorCVNDQ1BfU1NOX01TQwkJCSAgICA9IDgsCisJU0NDUF9TU05fRUlDCQkJICAgID0gOSwgLyogZXF1aXBlbnQgaWRlbnRpZmllciBjZW50cmUgKi8KKwlTQ0NQX1NTTl9BVUMJCQkgICAgPSAxMCwgLyogYXV0aGVudGljYXRpb24gY2VudHJlICovCisJU0NDUF9TU05fSVNETl9TVVBQTF9TRVJWSUNFUwkgICAgPSAxMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JTlRMCQkgICAgPSAxMiwKKwlTQ0NQX1NTTl9JU0ROX0VER0VfVE9fRURHRQkgICAgPSAxMywKKwlTQ0NQX1NTTl9UQ19URVNUX1JFU1BPTkRFUgkgICAgPSAxNCwKKworCS8qIEZyb20gR1NNIDAzLjAzIDguMiAqLworCVNDQ1BfU1NOX0JTU0FQCQkJICAgID0gMjU0LAorCVNDQ1BfU1NOX0JTU09NCQkJICAgID0gMjUzLAorfTsKKworLyogUS43MTMsIDMuNC4yLjMgKi8KK2VudW0geworCVNDQ1BfTkFJX1VOS05PV04JCSAgICA9IDAsCisJU0NDUF9OQUlfU1VCU0NSSUJFUl9OVU1CRVIJICAgID0gMSwKKwlTQ0NQX05BSV9SRVNFUlZFRF9OQVRJT05BTAkgICAgPSAyLAorCVNDQ1BfTkFJX05BVElPTkFMX1NJR05JRklDQU5UCSAgICA9IDMsCisJU0NDUF9OQUlfSU5URVJOQVRJT05BTAkJICAgID0gNCwKK307CisKK3N0cnVjdCBzY2NwX2dsb2JhbF90aXRsZSB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CW5hdHVyZV9vZl9hZGRyX2luZCA6IDcsCisJCQlvZGRfZXZlbiA6IDE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJb2RkX2V2ZW4gOiAxLAorCQkJbmF0dXJlX29mX2FkZHJfaW5kIDogNzsKKyNlbmRpZgorCXVfaW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxMywgMy4zICovCitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHsKKwl1X2ludDhfdCAgICBvY3RldDE7CisJdV9pbnQ4X3QgICAgb2N0ZXQyOworCXVfaW50OF90ICAgIG9jdGV0MzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFEuNzE0LCAzLjYgKi8KK2VudW0gc2NjcF9wcm90b2NvbF9jbGFzcyB7CisJU0NDUF9QUk9UT0NPTF9DTEFTU18wCQkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMQkJICAgID0gMSwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzIJCSAgICA9IDIsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18zCQkgICAgPSAzLAorfTsKKworLyogYml0cyA1LTggd2hlbiBjbGFzczAsIGNsYXNzMSBpcyB1c2VkICovCitlbnVtIHNjY3BfcHJvdG9jb2xfb3B0aW9ucyB7CisJU0NDUF9QUk9UT0NPTF9OT19TUEVDSUFMCSAgICA9IDAsCisJU0NDUF9QUk9UT0NPTF9SRVRVUk5fTUVTU0FHRQkgICAgPSA4LAorfTsKKworZW51bSBzY2NwX3JlbGVhc2VfY2F1c2UgeworCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0NPTkdFU1RJT04JICAgID0gMSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfRkFJTFVSRQkgICAgPSAyLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9SRU1PVEVfUFJPQ0VEVVJFX0VSUk9SICAgPSA0LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9JTkNPTlNJU1RFTlRfQ09OTl9EQVRBICAgPSA1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9BQ0NFU1NfRkFJTFVSRQkgICAgPSA2LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9BQ0NFU1NfQ09OR0VTVElPTgkgICAgPSA3LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TVUJTWVNURU1fRkFJTFVSRQkgICAgPSA4LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSA5LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9NVFBfRkFJTFVSRQkJICAgID0gMTAsCisJU0NDUF9SRUxFQVNFX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRVhQSVJBVElPTl9SRVNFVAkgICAgPSAxMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRVhQSVJBVElPTl9JTkFDVElWRQkgICAgPSAxMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDE0LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NDQ1BfRkFJTFVSRQkJICAgID0gMTYsCit9OworCitlbnVtIHNjY3BfcmV0dXJuX2NhdXNlIHsKKwlTQ0NQX1JFVFVSTl9DQVVTRV9OT19UUkFOU0xBVElPTl9OQVRVUkUJICAgID0gMCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9OT19UUkFOU0xBVElPTgkgICAgPSAxLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9DT05HRVNUSU9OCSAgICA9IDIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gMywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9VTkVRVUlQUEVEX1VTRVIJICAgID0gNCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9NVFBfRkFJTFVSRQkJICAgID0gNSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gNiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9VTlFVQUxJRklFRAkJICAgID0gNywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9FUlJPUl9JTl9NU0dfVFJBTlNQT1JUICAgID0gOCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9FUlJPUl9JTl9MT0NBTF9QUk9DRVNTSU5HID0gOSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9ERVNUX0NBTk5PVF9QRVJGT1JNX1JFQVNTRU1CTFkgPSAxMCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDExLAorCVNDQ1BfUkVUVVJOX0NBVVNFX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxMiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TRUdNRU5UQVRJT05fTk9UX1NVUFBPUlRFRD0gMTMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX0ZBT0xVUkUJICAgID0gMTQKK307CisKK2VudW0gc2NjcF9yZXNldF9jYXVzZSB7CisJU0NDUF9SRVNFVF9DQVVTRV9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRVNFVF9DQVVTRV9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAxLAorCVNDQ1BfUkVTRVRfQ0FVU0VfTVNHX09VVF9PRl9PUkRFUl9QUwkgICAgPSAyLAorCVNDQ1BfUkVTRVRfQ0FVU0VfTVNHX09VVF9PRl9PUkRFUl9QUgkgICAgPSAzLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX09VVF9PRl9XSU5ET1cJICAgID0gNCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19JTkNPUlJFQ1RfUFMJICAgID0gNSwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19HRU5FUkFMCQkgICAgPSA2LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVNT1RFX0VORF9VU0VSX09QRVJBVElPTkFMPSA3LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19PUEVSQVRJT05BTAkgICAgPSA4LAorCVNDQ1BfUkVTRVRfQ0FVU0VfQUNDRVNTX09QRVJBVElPTkFMCSAgICA9IDksCisJU0NDUF9SRVNFVF9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTAsCisJU0NDUF9SRVNFVF9DQVVTRV9SRVNFUlZFRAkJICAgID0gMTEsCit9OworCitlbnVtIHNjY3BfZXJyb3JfY2F1c2UgeworCVNDQ1BfRVJST1JfTFJOX01JU01BVENIX1VOQVNTSUdORUQJICAgID0gMCwgLyogbG9jYWwgcmVmZXJlbmNlIG51bWJlciAqLworCVNDQ1BfRVJST1JfTFJOX01JU01BVENIX0lOQ09OU0lTVEVOVAkgICAgPSAxLAorCVNDQ1BfRVJST1JfUE9JTlRfQ09ERV9NSVNNQVRDSAkJICAgID0gMiwKKwlTQ0NQX0VSUk9SX1NFUlZJQ0VfQ0xBU1NfTUlTTUFUQ0gJICAgID0gMywKKwlTQ0NQX0VSUk9SX1VOUVVBTElGSUVECQkJICAgID0gNCwKK307CisKK2VudW0gc2NjcF9yZWZ1c2FsX2NhdXNlIHsKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX0ZBSUxVUkUJCSAgICA9IDIsCisJU0NDUF9SRUZVU0FMX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDMsCisJU0NDUF9SRUZVU0FMX0RFU1RJTkFUSU9OX0FERFJFU1NfVUtOT1dOCSAgICA9IDQsCisJU0NDUF9SRUZVU0FMX0RFU1RJTkFUSU9OX0lOQUNDRVNTSUJMRQkgICAgPSA1LAorCVNDQ1BfUkVGVVNBTF9ORVRfUU9TX05PTl9UUkFOU0lFTlQJICAgID0gNiwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19UUkFOU0lFTlQJCSAgICA9IDcsCisJU0NDUF9SRUZVU0FMX0FDQ0VTU19GQUlMVVJFCQkgICAgPSA4LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfQ09OR0VTVElPTgkJICAgID0gOSwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lTVEVNX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVGVVNBTF9TVUJTWVRFTV9DT05HRVNUSU9OCSAgICA9IDExLAorCVNDQ1BfUkVGVVNBTF9FWFBJUkFUSU9OCQkJICAgID0gMTIsCisJU0NDUF9SRUZVU0FMX0lOQ09NUEFUSUJMRV9VU0VSX0RBVEEJICAgID0gMTMsCisJU0NDUF9SRUZVU0FMX1JFU0VSVkVECQkJICAgID0gMTQsCisJU0NDUF9SRUZVU0FMX1VOUVVBTElGSUVECQkgICAgPSAxNSwKKwlTQ0NQX1JFRlVTQUxfSE9QX0NPVU5URVJfVklPTEFUSU9OCSAgICA9IDE2LAorCVNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE3LAorCVNDQ1BfUkVGVVNBTF9VTkVRVUlQUEVEX1VTRVIJCSAgICA9IDE4LAorfTsKKworLyoKKyAqIG1lc3NhZ2VzLi4uIGFzIG9mIFEuNzEzIENoYXB0ZXIgNAorICovCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsZWQ7CisjaWYgVkFSSUFCTEUKKwljYWxsZWRfcGFydHlfYWRkcmVzcworI2VuZGlmCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWNyZWRpdCAzCisJY2FsbGluZ3BhcnR5IHZhciA0LW4KKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlob3BfY291bnRlciAgICAgMworCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisJLyogb3B0aW9uYWwgKi8KKyNpZiBPUFRJT05BTAorCWNyZWRpdCAzCisJY2FsbGVkIHBhcnR5IDQKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCWNhdXNlOworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisJLyogb3B0aW9uYWwgKi8KKyNpZiBPUFRJT05BTAorCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXJlbGVhc2VfY2F1c2U7CisKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworI2lmIE9QVElPTkFMCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfZGF0YV9mb3JtMSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXNlZ21lbnRpbmc7CisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfc3RhcnQ7CisKKyNpZiBWQVJJQUJMRQorCWRhdGEgMi0yNTY7CisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGluZzsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2RhdGE7CisKKyNpZiBWQVJJQUJMRQorCWNhbGxlZCBwYXJ0eSBhZGRyZXNzCisJY2FsbGluZyBwYXJ0eSBhZGRyZXNzCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfaXQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKwl1X2ludDhfdAkJCXNlcXVlbmNpbmdbMl07CisJdV9pbnQ4X3QJCQljcmVkaXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvdnR5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzQ3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK25vaW5zdF9IRUFERVJTID0gYnVmZmVyLmggY29tbWFuZC5oICB2ZWN0b3IuaCB2dHkuaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1MTk0MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvYnVmZmVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBCdWZmZXJpbmcgdG8gb3V0cHV0IGFuZCBpbnB1dC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX0JVRkZFUl9ICisjZGVmaW5lIF9aRUJSQV9CVUZGRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIENyZWF0ZSBhIG5ldyBidWZmZXIuICBNZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gY2h1bmtzIG9mIHRoZSBnaXZlbgorICAgc2l6ZS4gIElmIHRoZSBhcmd1bWVudCBpcyAwLCB0aGUgbGlicmFyeSB3aWxsIHN1cHBseSBhIHJlYXNvbmFibGUKKyAgIGRlZmF1bHQgc2l6ZSBzdWl0YWJsZSBmb3IgYnVmZmVyaW5nIHNvY2tldCBJL08uICovCitzdHJ1Y3QgYnVmZmVyICpidWZmZXJfbmV3KHNpemVfdCk7CisKKy8qIEZyZWUgYWxsIGRhdGEgaW4gdGhlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3Jlc2V0KHN0cnVjdCBidWZmZXIgKik7CisKKy8qIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2FsbHMgYnVmZmVyX3Jlc2V0IHRvIHJlbGVhc2UgYWxsIGJ1ZmZlcmVkIGRhdGEuCisgICBUaGVuIGl0IGZyZWVzIHRoZSBzdHJ1Y3QgYnVmZmVyIGl0c2VsZi4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogQWRkIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisvKiBBZGQgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXRjKHN0cnVjdCBidWZmZXIgKiwgdV9jaGFyKTsKKy8qIEFkZCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogQ29tYmluZSBhbGwgYWNjdW11bGF0ZWQgKGFuZCB1bmZsdXNoZWQpIGRhdGEgaW5zaWRlIHRoZSBidWZmZXIgaW50byBhCisgICBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB1c2luZyBYTUFMTE9DKE1UWVBFX1RNUCkuICBOb3RlCisgICB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWx0ZXIgdGhlIHN0YXRlIG9mIHRoZSBidWZmZXIsIHNvIHRoZSBkYXRhCisgICBpcyBzdGlsbCBpbnNpZGUgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICopOworCisvKiBSZXR1cm5zIDEgaWYgdGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIuICBPdGhlcndpc2UgcmV0dXJucyAwLiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICopOworCit0eXBlZGVmIGVudW0geworCS8qIEFuIEkvTyBlcnJvciBvY2N1cnJlZC4gIFRoZSBidWZmZXIgc2hvdWxkIGJlIGRlc3Ryb3llZCBhbmQgdGhlCisJICAgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBjbG9zZWQuICovCisJQlVGRkVSX0VSUk9SID0gLTEsCisKKwkvKiBUaGUgZGF0YSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGFuZCB0aGUgYnVmZmVyIGlzIG5vdyBlbXB0eQorCSAgICh0aGVyZSBpcyBubyBwZW5kaW5nIGRhdGEgd2FpdGluZyB0byBiZSBmbHVzaGVkKS4gKi8KKwlCVUZGRVJfRU1QVFkgPSAwLAorCisJLyogVGhlcmUgaXMgcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAgUGxlYXNlCisJICAgdHJ5IGZsdXNoaW5nIHRoZSBidWZmZXIgd2hlbiBzZWxlY3QgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvcgorCSAgIGlzIHdyaXRlYWJsZS4gKi8KKwlCVUZGRVJfUEVORElORyA9IDEKK30gYnVmZmVyX3N0YXR1c190OworCisvKiBUcnkgdG8gd3JpdGUgdGhpcyBkYXRhIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBBbnkgZGF0YSB0aGF0IGNhbm5vdAorICAgYmUgd3JpdHRlbiBpbW1lZGlhdGVseSBpcyBhZGRlZCB0byB0aGUgYnVmZmVyIHF1ZXVlLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsCisJCQkJICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworLyogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBmbHVzaCBzb21lIChidXQgcGVyaGFwcyBub3QgYWxsKSBvZgorICAgdGhlIHF1ZXVlZCBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIChidWZmZXJfZmx1c2hfYWxsIGFuZCBidWZmZXJfZmx1c2hfd2luZG93KQorICAgYXJlIGZvciB1c2UgaW4gbGliL3Z0eS5jIG9ubHkuICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUuICovCisKKy8qIENhbGwgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZSByZXBlYXRlZGx5IHVudGlsIGVpdGhlciBhbGwgZGF0YSBoYXMgYmVlbgorICAgZmx1c2hlZCwgb3IgYW4gSS9PIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLCBvciB0aGUgb3BlcmF0aW9uIHdvdWxkCisgICBibG9jay4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICosIGludCBmZCk7CisKKy8qIEF0dGVtcHQgdG8gd3JpdGUgZW5vdWdoIGRhdGEgdG8gdGhlIGdpdmVuIGZkIHRvIGZpbGwgYSB3aW5kb3cgb2YgdGhlCisgICBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IChhbmQgcmVtb3ZlIHRoZSBkYXRhIHdyaXR0ZW4gZnJvbSB0aGUgYnVmZmVyKS4KKworICAgSWYgIW5vX21vcmUsIHRoZW4gYSBtZXNzYWdlIHNheWluZyAiIC0tTW9yZS0tICIgaXMgYXBwZW5kZWQuCisgICBJZiBlcmFzZSBpcyB0cnVlLCB0aGVuIGZpcnN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgIiAtLU1vcmUtLSAiIG1lc3NhZ2UKKyAgIHdpdGggc3BhY2VzLgorCisgICBBbnkgd3JpdGUgZXJyb3IgKGluY2x1ZGluZyBFQUdBSU4gb3IgRUlOVFIpIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbgorICAgdG8gcmV0dXJuIC0xIChiZWNhdXNlIHRoZSBsb2dpYyBmb3IgaGFuZGxpbmcgdGhlIGVyYXNlIGFuZCBtb3JlIGZlYXR1cmVzCisgICBpcyB0b28gY29tcGxpY2F0ZWQgdG8gcmV0cnkgdGhlIHdyaXRlIGxhdGVyKS4KKyovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF93aW5kb3coc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsIGludCB3aWR0aCwKKwkJCQkJICAgaW50IGhlaWdodCwgaW50IGVyYXNlLCBpbnQgbm9fbW9yZSk7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMDcxZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogWmVicmEgY29uZmlndXJhdGlvbiBjb21tYW5kIGludGVyZmFjZSByb3V0aW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQ09NTUFORF9ICisjZGVmaW5lIF9aRUJSQV9DT01NQU5EX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAidmVjdG9yLmgiCisjaW5jbHVkZSAidnR5LmgiCisKKy8qIEhvc3QgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAqLworc3RydWN0IGhvc3QgeworCS8qIEhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlci4gKi8KKwljaGFyICpuYW1lOworCisJLyogUGFzc3dvcmQgZm9yIHZ0eSBpbnRlcmZhY2UuICovCisJY2hhciAqcGFzc3dvcmQ7CisJY2hhciAqcGFzc3dvcmRfZW5jcnlwdDsKKworCS8qIEVuYWJsZSBwYXNzd29yZCAqLworCWNoYXIgKmVuYWJsZTsKKwljaGFyICplbmFibGVfZW5jcnlwdDsKKworCS8qIFN5c3RlbSB3aWRlIHRlcm1pbmFsIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCS8qIExvZyBmaWxlbmFtZS4gKi8KKwljaGFyICpsb2dmaWxlOworCisJLyogY29uZmlnIGZpbGUgbmFtZSBvZiB0aGlzIGhvc3QgKi8KKwljaGFyICpjb25maWc7CisKKwkvKiBGbGFncyBmb3Igc2VydmljZXMgKi8KKwlpbnQgYWR2YW5jZWQ7CisJaW50IGVuY3J5cHQ7CisKKwkvKiBCYW5uZXIgY29uZmlndXJhdGlvbi4gKi8KKwljb25zdCBjaGFyICptb3RkOworCWNoYXIgKm1vdGRmaWxlOworfTsKKworLyogVGhlcmUgYXJlIHNvbWUgY29tbWFuZCBsZXZlbHMgd2hpY2ggY2FsbGVkIGZyb20gY29tbWFuZCBub2RlLiAqLworZW51bSBub2RlX3R5cGUgeworCUFVVEhfTk9ERSwJCS8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgb2YgdnR5IGludGVyZmFjZS4gKi8KKwlWSUVXX05PREUsCQkvKiBWaWV3IG5vZGUuIERlZmF1bHQgbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLworCUFVVEhfRU5BQkxFX05PREUsCS8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgZm9yIGNoYW5nZSBlbmFibGUuICovCisJRU5BQkxFX05PREUsCQkvKiBFbmFibGUgbm9kZS4gKi8KKwlDT05GSUdfTk9ERSwJCS8qIENvbmZpZyBub2RlLiBEZWZhdWx0IG1vZGUgb2YgY29uZmlnIGZpbGUuICovCisJU0VSVklDRV9OT0RFLAkJLyogU2VydmljZSBub2RlLiAqLworCURFQlVHX05PREUsCQkvKiBEZWJ1ZyBub2RlLiAqLworI2lmIDAKKwlBQUFfTk9ERSwJCS8qIEFBQSBub2RlLiAqLworCUtFWUNIQUlOX05PREUsCQkvKiBLZXktY2hhaW4gbm9kZS4gKi8KKwlLRVlDSEFJTl9LRVlfTk9ERSwJLyogS2V5LWNoYWluIGtleSBub2RlLiAqLworCUlOVEVSRkFDRV9OT0RFLAkJLyogSW50ZXJmYWNlIG1vZGUgbm9kZS4gKi8KKwlaRUJSQV9OT0RFLAkJLyogemVicmEgY29ubmVjdGlvbiBub2RlLiAqLworCVRBQkxFX05PREUsCQkvKiBydG1fdGFibGUgc2VsZWN0aW9uIG5vZGUuICovCisJUklQX05PREUsCQkvKiBSSVAgcHJvdG9jb2wgbW9kZSBub2RlLiAqLworCVJJUE5HX05PREUsCQkvKiBSSVBuZyBwcm90b2NvbCBtb2RlIG5vZGUuICovCisJQkdQX05PREUsCQkvKiBCR1AgcHJvdG9jb2wgbW9kZSB3aGljaCBpbmNsdWRlcyBCR1A0KyAqLworCUJHUF9WUE5WNF9OT0RFLAkJLyogQkdQIE1QTFMtVlBOIFBFIGV4Y2hhbmdlLiAqLworCUJHUF9JUFY0X05PREUsCQkvKiBCR1AgSVB2NCB1bmljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KKwlCR1BfSVBWNE1fTk9ERSwJCS8qIEJHUCBJUHY0IG11bHRpY2FzdCBhZGRyZXNzIGZhbWlseS4gICovCisJQkdQX0lQVjZfTk9ERSwJCS8qIEJHUCBJUHY2IGFkZHJlc3MgZmFtaWx5ICovCisJT1NQRl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBtb2RlICovCisJT1NQRjZfTk9ERSwJCS8qIE9TUEYgcHJvdG9jb2wgZm9yIElQdjYgbW9kZSAqLworCUlTSVNfTk9ERSwJCS8qIElTSVMgcHJvdG9jb2wgbW9kZSAqLworCU1BU0NfTk9ERSwJCS8qIE1BU0MgZm9yIG11bHRpY2FzdC4gICovCisJSVJEUF9OT0RFLAkJLyogSUNNUCBSb3V0ZXIgRGlzY292ZXJ5IFByb3RvY29sIG1vZGUuICovCisJSVBfTk9ERSwJCS8qIFN0YXRpYyBpcCByb3V0ZSBub2RlLiAqLworCUFDQ0VTU19OT0RFLAkJLyogQWNjZXNzIGxpc3Qgbm9kZS4gKi8KKwlQUkVGSVhfTk9ERSwJCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCisJQUNDRVNTX0lQVjZfTk9ERSwJLyogQWNjZXNzIGxpc3Qgbm9kZS4gKi8KKwlQUkVGSVhfSVBWNl9OT0RFLAkvKiBQcmVmaXggbGlzdCBub2RlLiAqLworCUFTX0xJU1RfTk9ERSwJCS8qIEFTIGxpc3Qgbm9kZS4gKi8KKwlDT01NVU5JVFlfTElTVF9OT0RFLAkvKiBDb21tdW5pdHkgbGlzdCBub2RlLiAqLworCVJNQVBfTk9ERSwJCS8qIFJvdXRlIG1hcCBub2RlLiAqLworCVNNVVhfTk9ERSwJCS8qIFNOTVAgY29uZmlndXJhdGlvbiBub2RlLiAqLworCURVTVBfTk9ERSwJCS8qIFBhY2tldCBkdW1wIG5vZGUuICovCisJRk9SV0FSRElOR19OT0RFLAkvKiBJUCBmb3J3YXJkaW5nIG5vZGUuICovCisjZW5kaWYKKwlWVFlfTk9ERSwJCS8qIFZ0eSBub2RlLiAqLworCisJR1NNTkVUX05PREUsCisJQlRTX05PREUsCisJVFJYX05PREUsCisJVFNfTk9ERSwKKwlTVUJTQ1JfTk9ERSwKKwlNR0NQX05PREUsCit9OworCisvKiBOb2RlIHdoaWNoIGhhcyBzb21lIGNvbW1hbmRzIGFuZCBwcm9tcHQgc3RyaW5nIGFuZCBjb25maWd1cmF0aW9uCisgICBmdW5jdGlvbiBwb2ludGVyIC4gKi8KK3N0cnVjdCBjbWRfbm9kZSB7CisJLyogTm9kZSBpbmRleC4gKi8KKwllbnVtIG5vZGVfdHlwZSBub2RlOworCisJLyogUHJvbXB0IGNoYXJhY3RlciBhdCB2dHkgaW50ZXJmYWNlLiAqLworCWNvbnN0IGNoYXIgKnByb21wdDsKKworCS8qIElzIHRoaXMgbm9kZSdzIGNvbmZpZ3VyYXRpb24gZ29lcyB0byB2dHlzaCA/ICovCisJaW50IHZ0eXNoOworCisJLyogTm9kZSdzIGNvbmZpZ3VyYXRpb24gd3JpdGUgZnVuY3Rpb24gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKTsKKworCS8qIFZlY3RvciBvZiB0aGlzIG5vZGUncyBjb21tYW5kIGxpc3QuICovCisJdmVjdG9yIGNtZF92ZWN0b3I7Cit9OworCitlbnVtIHsKKwlDTURfQVRUUl9ERVBSRUNBVEVEID0gMSwKKwlDTURfQVRUUl9ISURERU4sCit9OworCisvKiBTdHJ1Y3R1cmUgb2YgY29tbWFuZCBlbGVtZW50LiAqLworc3RydWN0IGNtZF9lbGVtZW50IHsKKwljb25zdCBjaGFyICpzdHJpbmc7CS8qIENvbW1hbmQgc3BlY2lmaWNhdGlvbiBieSBzdHJpbmcuICovCisJaW50ICgqZnVuYykgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOworCWNvbnN0IGNoYXIgKmRvYzsJLyogRG9jdW1lbnRhdGlvbiBvZiB0aGlzIGNvbW1hbmQuICovCisJaW50IGRhZW1vbjsJCS8qIERhZW1vbiB0byB3aGljaCB0aGlzIGNvbW1hbmQgYmVsb25nLiAqLworCXZlY3RvciBzdHJ2ZWM7CQkvKiBQb2ludGluZyBvdXQgZWFjaCBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJdW5zaWduZWQgaW50IGNtZHNpemU7CS8qIENvbW1hbmQgaW5kZXggY291bnQuICovCisJY2hhciAqY29uZmlnOwkJLyogQ29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl2ZWN0b3Igc3ViY29uZmlnOwkvKiBTdWIgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl1X2NoYXIgYXR0cjsJCS8qIENvbW1hbmQgYXR0cmlidXRlcyAqLworfTsKKworLyogQ29tbWFuZCBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgZGVzYyB7CisJY29uc3QgY2hhciAqY21kOwkvKiBDb21tYW5kIHN0cmluZy4gKi8KKwljb25zdCBjaGFyICpzdHI7CS8qIENvbW1hbmQncyBkZXNjcmlwdGlvbi4gKi8KK307CisKKy8qIFJldHVybiB2YWx1ZSBvZiB0aGUgY29tbWFuZHMuICovCisjZGVmaW5lIENNRF9TVUNDRVNTICAgICAgICAgICAgICAwCisjZGVmaW5lIENNRF9XQVJOSU5HICAgICAgICAgICAgICAxCisjZGVmaW5lIENNRF9FUlJfTk9fTUFUQ0ggICAgICAgICAyCisjZGVmaW5lIENNRF9FUlJfQU1CSUdVT1VTICAgICAgICAzCisjZGVmaW5lIENNRF9FUlJfSU5DT01QTEVURSAgICAgICA0CisjZGVmaW5lIENNRF9FUlJfRVhFRURfQVJHQ19NQVggICA1CisjZGVmaW5lIENNRF9FUlJfTk9USElOR19UT0RPICAgICA2CisjZGVmaW5lIENNRF9DT01QTEVURV9GVUxMX01BVENIICA3CisjZGVmaW5lIENNRF9DT01QTEVURV9NQVRDSCAgICAgICA4CisjZGVmaW5lIENNRF9DT01QTEVURV9MSVNUX01BVENIICA5CisjZGVmaW5lIENNRF9TVUNDRVNTX0RBRU1PTiAgICAgIDEwCisKKy8qIEFyZ2MgbWF4IGNvdW50cy4gKi8KKyNkZWZpbmUgQ01EX0FSR0NfTUFYICAgMjUKKworLyogVHVybiBvZmYgdGhlc2UgbWFjcm9zIHdoZW4gdWlzbmcgY3BwIHdpdGggZXh0cmFjdC5wbCAqLworI2lmbmRlZiBWVFlTSF9FWFRSQUNUX1BMCisKKy8qIGhlbHBlciBkZWZpbmVzIGZvciBlbmQtdXNlciBERUZVTiogbWFjcm9zICovCisjZGVmaW5lIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHJzLCBkbnVtKSBcCisgIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIChzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgc3RydWN0IHZ0eSAqLCBpbnQsIGNvbnN0IGNoYXIgKltdKTsgXAorCisjZGVmaW5lIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpIFwKKyAgc3RhdGljIGludCBmdW5jbmFtZSBcCisgICAgKHN0cnVjdCBjbWRfZWxlbWVudCAqc2VsZiwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQorCisvKiBERUZVTiBmb3IgdnR5IGNvbW1hbmQgaW50ZXJhZmNlLiBMaXR0bGUgYml0IGhhY2t5IDstKS4gKi8KKyNkZWZpbmUgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5fSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQVRUUiAoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKSBcCisKKy8qIERFRlVOX05PU0ggZm9yIGNvbW1hbmRzIHRoYXQgdnR5c2ggc2hvdWxkIGlnbm9yZSAqLworI2RlZmluZSBERUZVTl9OT1NIKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikKKworLyogREVGU0ggZm9yIHZ0eXNoLiAqLworI2RlZmluZSBERUZTSChkYWVtb24sIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChOVUxMLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikgXAorCisvKiBERUZVTiArIERFRlNIICovCisjZGVmaW5lIERFRlVOU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKy8qIERFRlVOICsgREVGU0ggd2l0aCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIERFRlVOU0hfQVRUUihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTlNIX0hJRERFTihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTikKKworI2RlZmluZSBERUZVTlNIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOU0hfQVRUUiAoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKQorCisvKiBBTElBUyBtYWNybyB3aGljaCBkZWZpbmUgZXhpc3RpbmcgY29tbWFuZCdzIGFsaWFzLiAqLworI2RlZmluZSBBTElBUyhmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApCisKKyNkZWZpbmUgQUxJQVNfQVRUUihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApCisKKyNkZWZpbmUgQUxJQVNfSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOLCAwKQorCisjZGVmaW5lIEFMSUFTX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCAwKQorCisjZGVmaW5lIEFMSUFTX1NIKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pCisKKyNkZWZpbmUgQUxJQVNfU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ERVBSRUNBVEVEKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCBkYWVtb24pCisKKyNlbmRpZgkJCQkvKiBWVFlTSF9FWFRSQUNUX1BMICovCisKKy8qIFNvbWUgbWFjcm9lcyAqLworI2RlZmluZSBDTURfT1BUSU9OKFMpICAgKChTWzBdKSA9PSAnWycpCisjZGVmaW5lIENNRF9WQVJJQUJMRShTKSAoKChTWzBdKSA+PSAnQScgJiYgKFNbMF0pIDw9ICdaJykgfHwgKChTWzBdKSA9PSAnPCcpKQorI2RlZmluZSBDTURfVkFSQVJHKFMpICAgKChTWzBdKSA9PSAnLicpCisjZGVmaW5lIENNRF9SQU5HRShTKQkoKFNbMF0gPT0gJzwnKSkKKworI2RlZmluZSBDTURfSVBWNChTKQkgICAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRCIpID09IDApKQorI2RlZmluZSBDTURfSVBWNF9QUkVGSVgoUykgKChzdHJjbXAgKChTKSwgIkEuQi5DLkQvTSIpID09IDApKQorI2RlZmluZSBDTURfSVBWNihTKSAgICAgICAgKChzdHJjbXAgKChTKSwgIlg6WDo6WDpYIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgvTSIpID09IDApKQorCisvKiBDb21tb24gZGVzY3JpcHRpb25zLiAqLworI2RlZmluZSBTSE9XX1NUUiAiU2hvdyBydW5uaW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBJUF9TVFIgIklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQVjZfU1RSICJJUHY2IGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE5PX1NUUiAiTmVnYXRlIGEgY29tbWFuZCBvciBzZXQgaXRzIGRlZmF1bHRzXG4iCisjZGVmaW5lIENMRUFSX1NUUiAiUmVzZXQgZnVuY3Rpb25zXG4iCisjZGVmaW5lIFJJUF9TVFIgIlJJUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBCR1BfU1RSICJCR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRl9TVFIgIk9TUEYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTkVJR0hCT1JfU1RSICJTcGVjaWZ5IG5laWdoYm9yIHJvdXRlclxuIgorI2RlZmluZSBERUJVR19TVFIgIkRlYnVnZ2luZyBmdW5jdGlvbnMgKHNlZSBhbHNvICd1bmRlYnVnJylcbiIKKyNkZWZpbmUgVU5ERUJVR19TVFIgIkRpc2FibGUgZGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ2RlYnVnJylcbiIKKyNkZWZpbmUgUk9VVEVSX1NUUiAiRW5hYmxlIGEgcm91dGluZyBwcm9jZXNzXG4iCisjZGVmaW5lIEFTX1NUUiAiQVMgbnVtYmVyXG4iCisjZGVmaW5lIE1CR1BfU1RSICJNQkdQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE1BVENIX1NUUiAiTWF0Y2ggdmFsdWVzIGZyb20gcm91dGluZyB0YWJsZVxuIgorI2RlZmluZSBTRVRfU1RSICJTZXQgdmFsdWVzIGluIGRlc3RpbmF0aW9uIHJvdXRpbmcgcHJvdG9jb2xcbiIKKyNkZWZpbmUgT1VUX1NUUiAiRmlsdGVyIG91dGdvaW5nIHJvdXRpbmcgdXBkYXRlc1xuIgorI2RlZmluZSBJTl9TVFIgICJGaWx0ZXIgaW5jb21pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIFY0Tk9UQVRJT05fU1RSICJzcGVjaWZ5IGJ5IElQdjQgYWRkcmVzcyBub3RhdGlvbihlLmcuIDAuMC4wLjApXG4iCisjZGVmaW5lIE9TUEY2X05VTUJFUl9TVFIgIlNwZWNpZnkgYnkgbnVtYmVyXG4iCisjZGVmaW5lIElOVEVSRkFDRV9TVFIgIkludGVyZmFjZSBpbmZvbWF0aW9uXG4iCisjZGVmaW5lIElGTkFNRV9TVFIgIkludGVyZmFjZSBuYW1lKGUuZy4gZXAwKVxuIgorI2RlZmluZSBJUDZfU1RSICJJUHY2IEluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE9TUEY2X1NUUiAiT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IChPU1BGKSBmb3IgSVB2NlxuIgorI2RlZmluZSBPU1BGNl9ST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgT1NQRjZfSU5TVEFOQ0VfU1RSICI8MS02NTUzNT4gSW5zdGFuY2UgSURcbiIKKyNkZWZpbmUgU0VDT05EU19TVFIgIjwxLTY1NTM1PiBTZWNvbmRzXG4iCisjZGVmaW5lIFJPVVRFX1NUUiAiUm91dGluZyBUYWJsZVxuIgorI2RlZmluZSBQUkVGSVhfTElTVF9TVFIgIkJ1aWxkIGEgcHJlZml4IGxpc3RcbiIKKyNkZWZpbmUgT1NQRjZfRFVNUF9UWVBFX0xJU1QgXAorIihuZWlnaGJvcnxpbnRlcmZhY2V8YXJlYXxsc2F8emVicmF8Y29uZmlnfGRiZXh8c3BmfHJvdXRlfGxzZGJ8cmVkaXN0cmlidXRlfGhvb2t8YXNicnxwcmVmaXh8YWJyKSIKKyNkZWZpbmUgSVNJU19TVFIgIklTLUlTIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEFSRUFfVEFHX1NUUiAiW2FyZWEgdGFnXVxuIgorCisjZGVmaW5lIENPTkZfQkFDS1VQX0VYVCAiLnNhdiIKKworLyogSVB2NCBvbmx5IG1hY2hpbmUgc2hvdWxkIG5vdCBhY2NlcHQgSVB2NiBhZGRyZXNzIGZvciBwZWVyJ3MgSVAKKyAgIGFkZHJlc3MuICBTbyB3ZSByZXBsYWNlIFZUWSBjb21tYW5kIHN0cmluZyBsaWtlIGJlbG93LiAqLworI2lmZGVmIEhBVkVfSVBWNgorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIgICJOZWlnaGJvciBhZGRyZXNzXG5JUHY2IGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlh8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIElQdjYgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZWxzZQorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQgICAgIm5vIG5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIHRhZ1xuIgorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCisvKiBQcm90b3R5cGVzLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICosIGludCAoKikoc3RydWN0IHZ0eSAqKSk7Cit2b2lkIGluc3RhbGxfZGVmYXVsdChlbnVtIG5vZGVfdHlwZSk7Cit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICopOwordm9pZCBzb3J0X25vZGUoKTsKKworLyogQ29uY2F0ZW5hdGVzIGFyZ3Zbc2hpZnRdIHRocm91Z2ggYXJndlthcmdjLTFdIGludG8gYSBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQKKyAgIHN0cmluZyB3aXRoIGEgc3BhY2UgYmV0d2VlbiBlYWNoIGVsZW1lbnQgKGFsbG9jYXRlZCB1c2luZworICAgWE1BTExPQyhNVFlQRV9UTVApKS4gIFJldHVybnMgTlVMTCBpZiBzaGlmdCA+PSBhcmdjLiAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpOworCit2ZWN0b3IgY21kX21ha2Vfc3RydmVjKGNvbnN0IGNoYXIgKik7Cit2b2lkIGNtZF9mcmVlX3N0cnZlYyh2ZWN0b3IpOwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKCk7CitjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmQoKTsKK2NvbnN0IGNoYXIgKmNtZF9wcm9tcHQoZW51bSBub2RlX3R5cGUpOworaW50IGNvbmZpZ19mcm9tX2ZpbGUoc3RydWN0IHZ0eSAqLCBGSUxFICopOworZW51bSBub2RlX3R5cGUgbm9kZV9wYXJlbnQoZW51bSBub2RlX3R5cGUpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmQodmVjdG9yLCBzdHJ1Y3QgdnR5ICosIHN0cnVjdCBjbWRfZWxlbWVudCAqKiwgaW50KTsKK2ludCBjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqKTsKK3ZvaWQgY29uZmlnX3JlcGxhY2Vfc3RyaW5nKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBjaGFyICosIC4uLik7Cit2b2lkIGNtZF9pbml0KGludCk7CisKKy8qIEV4cG9ydCB0eXBpY2FsIGZ1bmN0aW9ucy4gKi8KK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2VuZF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19leGl0X2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX3F1aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfaGVscF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19saXN0X2NtZDsKK2NoYXIgKmhvc3RfY29uZmlnX2ZpbGUoKTsKK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKik7CisKK3ZvaWQgcHJpbnRfdmVyc2lvbihjb25zdCBjaGFyICopOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9DT01NQU5EX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTE4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2UgaGVhZGVyLgorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX1ZFQ1RPUl9ICisjZGVmaW5lIF9aRUJSQV9WRUNUT1JfSAorCisvKiBzdHJ1Y3QgZm9yIHZlY3RvciAqLworc3RydWN0IF92ZWN0b3IgeworCXVuc2lnbmVkIGludCBhY3RpdmU7CS8qIG51bWJlciBvZiBhY3RpdmUgc2xvdHMgKi8KKwl1bnNpZ25lZCBpbnQgYWxsb2NlZDsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBzbG90ICovCisJdm9pZCAqKmluZGV4OwkJLyogaW5kZXggdG8gZGF0YSAqLworfTsKK3R5cGVkZWYgc3RydWN0IF92ZWN0b3IgKnZlY3RvcjsKKworI2RlZmluZSBWRUNUT1JfTUlOX1NJWkUgMQorCisvKiAoU29tZXRpbWVzKSB1c2VmdWxsIG1hY3Jvcy4gIFRoaXMgbWFjcm8gY29udmVydCBpbmRleCBleHByZXNzaW9uIHRvCisgYXJyYXkgZXhwcmVzc2lvbi4gKi8KKy8qIFJlZmVyZW5jZSBzbG90IGF0IGdpdmVuIGluZGV4LCBjYWxsZXIgbXVzdCBlbnN1cmUgc2xvdCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgdmVjdG9yX3Nsb3QoVixJKSAgKChWKS0+aW5kZXhbKEkpXSkKKy8qIE51bWJlciBvZiBhY3RpdmUgc2xvdHMuCisgKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gdmVjdG9yX2NvdW50KCkgYXMgaXQgdGhlIGNvdW50IHJldHVybmVkCisgKiB3aWxsIGluY2x1ZGUgYW55IGVtcHR5IHNsb3RzCisgKi8KKyNkZWZpbmUgdmVjdG9yX2FjdGl2ZShWKSAoKFYpLT5hY3RpdmUpCisKKy8qIFByb3RvdHlwZXMuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpOwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKTsKK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3Igdik7CitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKTsKK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKTsKK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSk7Cit1bnNpZ25lZCBpbnQgdmVjdG9yX2NvdW50KHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfaW5kZXhfZnJlZSh2b2lkICppbmRleCk7Cit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KTsKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3Igdik7CisKK3ZvaWQgKnZlY3Rvcl9sb29rdXAodmVjdG9yLCB1bnNpZ25lZCBpbnQpOwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yLCB1bnNpZ25lZCBpbnQpOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9WRUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MWZjNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX1ZUWV9ICisjZGVmaW5lIF9WVFlfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR0NDIGhhdmUgcHJpbnRmIHR5cGUgYXR0cmlidXRlIGNoZWNrLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCBhLCBiKSkpCisjZWxzZQorI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpCisjZW5kaWYJCQkJLyogX19HTlVDX18gKi8KKworLyogRG9lcyB0aGUgSS9PIGVycm9yIGluZGljYXRlIHRoYXQgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZCBsYXRlcj8gKi8KKyNkZWZpbmUgRVJSTk9fSU9fUkVUUlkoRU4pIFwKKwkoKChFTikgPT0gRUFHQUlOKSB8fCAoKEVOKSA9PSBFV09VTERCTE9DSykgfHwgKChFTikgPT0gRUlOVFIpKQorCisvKiBWdHkgcmVhZCBidWZmZXIgc2l6ZS4gKi8KKyNkZWZpbmUgVlRZX1JFQURfQlVGU0laIDUxMgorCisjZGVmaW5lIFZUWV9CVUZTSVogNTEyCisjZGVmaW5lIFZUWV9NQVhISVNUIDIwCisKKy8qIFZ0eSBldmVudHMgKi8KK2VudW0gZXZlbnQgeworCVZUWV9TRVJWLAorCVZUWV9SRUFELAorCVZUWV9XUklURSwKKwlWVFlfQ0xPU0VELAorCVZUWV9USU1FT1VUX1JFU0VULAorI2lmZGVmIFZUWVNICisJVlRZU0hfU0VSViwKKwlWVFlTSF9SRUFELAorCVZUWVNIX1dSSVRFCisjZW5kaWYJCQkJLyogVlRZU0ggKi8KK307CisKK3N0cnVjdCB2dHkgeworCUZJTEUgKmZpbGU7CisKKwkvKiBwcml2YXRlIGRhdGEsIHNwZWNpZmllZCBieSBjcmVhdG9yICovCisJdm9pZCAqcHJpdjsKKworCS8qIEZpbGUgZGVzY3JpcHRlciBvZiB0aGlzIHZ0eS4gKi8KKwlpbnQgZmQ7CisKKwkvKiBJcyB0aGlzIHZ0eSBjb25uZWN0IHRvIGZpbGUgb3Igbm90ICovCisJZW51bSB7IFZUWV9URVJNLCBWVFlfRklMRSwgVlRZX1NIRUxMLCBWVFlfU0hFTExfU0VSViB9IHR5cGU7CisKKwkvKiBOb2RlIHN0YXR1cyBvZiB0aGlzIHZ0eSAqLworCWludCBub2RlOworCisJLyogRmFpbHVyZSBjb3VudCAqLworCWludCBmYWlsOworCisJLyogT3V0cHV0IGJ1ZmZlci4gKi8KKwlzdHJ1Y3QgYnVmZmVyICpvYnVmOworCisJLyogQ29tbWFuZCBpbnB1dCBidWZmZXIgKi8KKwljaGFyICpidWY7CisKKwkvKiBDb21tYW5kIGN1cnNvciBwb2ludCAqLworCWludCBjcDsKKworCS8qIENvbW1hbmQgbGVuZ3RoICovCisJaW50IGxlbmd0aDsKKworCS8qIENvbW1hbmQgbWF4IGxlbmd0aC4gKi8KKwlpbnQgbWF4OworCisJLyogSGlzdHJ5IG9mIGNvbW1hbmQgKi8KKwljaGFyICpoaXN0W1ZUWV9NQVhISVNUXTsKKworCS8qIEhpc3RvcnkgbG9va3VwIGN1cnJlbnQgcG9pbnQgKi8KKwlpbnQgaHA7CisKKwkvKiBIaXN0b3J5IGluc2VydCBlbmQgcG9pbnQgKi8KKwlpbnQgaGluZGV4OworCisJLyogRm9yIGN1cnJlbnQgcmVmZXJlbmNpbmcgcG9pbnQgb2YgaW50ZXJmYWNlLCByb3V0ZS1tYXAsCisJICAgYWNjZXNzLWxpc3QgZXRjLi4uICovCisJdm9pZCAqaW5kZXg7CisKKwkvKiBGb3IgbXVsdGlwbGUgbGV2ZWwgaW5kZXggdHJlYXRtZW50IHN1Y2ggYXMga2V5IGNoYWluIGFuZCBrZXkuICovCisJdm9pZCAqaW5kZXhfc3ViOworCisJLyogRm9yIGVzY2FwZSBjaGFyYWN0ZXIuICovCisJdW5zaWduZWQgY2hhciBlc2NhcGU7CisKKwkvKiBDdXJyZW50IHZ0eSBzdGF0dXMuICovCisJZW51bSB7IFZUWV9OT1JNQUwsIFZUWV9DTE9TRSwgVlRZX01PUkUsIFZUWV9NT1JFTElORSB9IHN0YXR1czsKKworCS8qIElBQyBoYW5kbGluZzogd2FzIHRoZSBsYXN0IGNoYXJhY3RlciByZWNlaXZlZCB0aGUgSUFDCisJICogKGludGVycHJldC1hcy1jb21tYW5kKSBlc2NhcGUgY2hhcmFjdGVyIChhbmQgdGhlcmVmb3JlIHRoZSBuZXh0CisJICogY2hhcmFjdGVyIHdpbGwgYmUgdGhlIGNvbW1hbmQgY29kZSk/ICBSZWZlciB0byBUZWxuZXQgUkZDIDg1NC4gKi8KKwl1bnNpZ25lZCBjaGFyIGlhYzsKKworCS8qIElBQyBTQiAob3B0aW9uIHN1Ym5lZ290aWF0aW9uKSBoYW5kbGluZyAqLworCXVuc2lnbmVkIGNoYXIgaWFjX3NiX2luX3Byb2dyZXNzOworCS8qIEF0IHRoZSBtb21lbnQsIHdlIGNhcmUgb25seSBhYm91dCB0aGUgTkFXUyAod2luZG93IHNpemUpIG5lZ290aWF0aW9uLAorCSAqIGFuZCB0aGF0IHJlcXVpcmVzIGp1c3QgYSA1LWNoYXJhY3RlciBidWZmZXIgKFJGQyAxMDczKToKKwkgKiA8TkFXUyBjaGFyPiA8MTYtYml0IHdpZHRoPiA8MTYtYml0IGhlaWdodD4gKi8KKyNkZWZpbmUgVEVMTkVUX05BV1NfU0JfTEVOIDUKKwl1bnNpZ25lZCBjaGFyIHNiX2J1ZltURUxORVRfTkFXU19TQl9MRU5dOworCS8qIEhvdyBtYW55IHN1Ym5lZ290aWF0aW9uIGNoYXJhY3RlcnMgaGF2ZSB3ZSByZWNlaXZlZD8gIFdlIGp1c3QgZHJvcAorCSAqIHRob3NlIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgYnVmZmVyLiAqLworCXNpemVfdCBzYl9sZW47CisKKwkvKiBXaW5kb3cgd2lkdGgvaGVpZ2h0LiAqLworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJLyogQ29uZmlndXJlIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCWludCBtb25pdG9yOworCisJLyogSW4gY29uZmlndXJlIG1vZGUuICovCisJaW50IGNvbmZpZzsKK307CisKKy8qIFNtYWxsIG1hY3JvIHRvIGRldGVybWluZSBuZXdsaW5lIGlzIG5ld2xpbmUgb25seSBvciBsaW5lZmVlZCBuZWVkZWQuICovCisjZGVmaW5lIFZUWV9ORVdMSU5FICAoKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkgPyAiXHJcbiIgOiAiXG4iKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnZ0eV9uZXdsaW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gVlRZX05FV0xJTkU7Cit9CisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIHZ0eV9pbml0ICh2b2lkKTsKK2ludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpOwordm9pZCB2dHlfaW5pdF92dHlzaCAodm9pZCk7Cit2b2lkIHZ0eV9yZXNldCAodm9pZCk7CitzdHJ1Y3QgdnR5ICp2dHlfbmV3ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdik7CitpbnQgdnR5X291dCAoc3RydWN0IHZ0eSAqLCBjb25zdCBjaGFyICosIC4uLikgVlRZX1BSSU5URl9BVFRSSUJVVEUoMiwgMyk7CitpbnQgdnR5X291dF9uZXdsaW5lKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KTsKKy8vdm9pZCB2dHlfdGltZV9wcmludCAoc3RydWN0IHZ0eSAqLCBpbnQpOwordm9pZCB2dHlfY2xvc2UgKHN0cnVjdCB2dHkgKik7CitjaGFyICp2dHlfZ2V0X2N3ZCAodm9pZCk7Cit2b2lkIHZ0eV9sb2cgKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0KTsKK2ludCB2dHlfY29uZmlnX2xvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X2NvbmZpZ191bmxvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsIChzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9zaGVsbF9zZXJ2IChzdHJ1Y3QgdnR5ICopOwordm9pZCB2dHlfaGVsbG8gKHN0cnVjdCB2dHkgKik7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9saWJzY2NwLnBjLmluIGIvb3BlbmJzYy9saWJzY2NwLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYThkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IE9wZW5CU0MgU0NDUCBMaWIKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIFNDQ1AgTGliCitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sc2NjcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vCmRpZmYgLS1naXQgYS9vcGVuYnNjL29wZW5ic2MucGMuaW4gYi9vcGVuYnNjL29wZW5ic2MucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhMDdlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvCisKK05hbWU6IE9wZW5CU0MKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIGJhc2Ugc3RhdGlvbiBjb250cm9sbGVyCitSZXF1aXJlczoKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxvcGVuYnNjCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGFjOWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0OCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKK3NiaW5fUFJPR1JBTVMgPSBic2NfaGFjayBiczExX2NvbmZpZyBpcGFjY2Vzcy1maW5kIGlwYWNjZXNzLWNvbmZpZyBcCisgICAgICAgICAgICAgICAgaXNkbnN5bmMgYnNjX21nY3AgaXBhY2Nlc3MtcHJveHkKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJic2MuYSBsaWJtc2MuYSBsaWJ2dHkuYQorbm9pbnN0X0hFQURFUlMgPSB2dHkvY2FyZHNoZWxsLmgKKworYnNjZGlyID0gJChsaWJkaXIpCitic2NfTElCUkFSSUVTID0gbGlic2NjcC5hCisKK2xpYmJzY19hX1NPVVJDRVMgPSBhYmlzX3JzbC5jIGFiaXNfbm0uYyBnc21fZGF0YS5jIGdzbV8wNF8wOF91dGlscy5jIFwKKwkJY2hhbl9hbGxvYy5jIGRlYnVnLmMgXAorCQlnc21fc3Vic2NyaWJlcl9iYXNlLmMgc3ViY2hhbl9kZW11eC5jIGJzY19ybGwuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdHJhdV9mcmFtZS5jIHRyYXVfbXV4LmMgcGFnaW5nLmMgZTFfY29uZmlnLmMgZTFfaW5wdXQuYyBcCisJCWlucHV0L21pc2RuLmMgaW5wdXQvaXBhY2Nlc3MuYyBcCisJCXRhbGxvY19jdHguYyBzeXN0ZW1faW5mb3JtYXRpb24uYyByZXN0X29jdGV0cy5jIFwKKwkJcnRwX3Byb3h5LmMgYnRzX3NpZW1lbnNfYnMxMS5jIGJ0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCQlidHNfdW5rbm93bi5jCisKK2xpYm1zY19hX1NPVVJDRVMgPSBnc21fc3Vic2NyaWJlci5jIGRiLmMgdGVsbmV0X2ludGVyZmFjZS5jIFwKKwkJbW5jYy5jIGdzbV8wNF8wOC5jIGdzbV8wNF8xMS5jIHRyYW5zYWN0aW9uLmMgXAorCQl0b2tlbl9hdXRoLmMgcnJscC5jIGdzbV8wNF84MC5jIHVzc2QuYyBzaWxlbnRfY2FsbC5jIFwKKwkJaGFuZG92ZXJfbG9naWMuYyBoYW5kb3Zlcl9kZWNpc2lvbi5jIG1lYXNfcmVwLmMKKworbGlidnR5X2FfU09VUkNFUyA9IHZ0eS9idWZmZXIuYyB2dHkvY29tbWFuZC5jIHZ0eS92ZWN0b3IuYyB2dHkvdnR5LmMKKworbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYworCitic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIHZ0eV9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCitic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworYnMxMV9jb25maWdfU09VUkNFUyA9IGJzMTFfY29uZmlnLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZGVidWcuYyBcCisJCSAgICAgIHJzMjMyLmMgYnRzX3NpZW1lbnNfYnMxMS5jCisKK2lwYWNjZXNzX2ZpbmRfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYworCitpcGFjY2Vzc19jb25maWdfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGlwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKK2lwYWNjZXNzX2NvbmZpZ19MREFERCA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYmJzYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworaXNkbnN5bmNfU09VUkNFUyA9IGlzZG5zeW5jLmMKKworYnNjX21nY3BfU09VUkNFUyA9IG1nY3AvbWdjcF9tYWluLmMgbWdjcC9tZ2NwX3Byb3RvY29sLmMgbWdjcC9tZ2NwX25ldHdvcmsuYyBtZ2NwL21nY3BfdnR5LmMgXAorCQkgICBkZWJ1Zy5jIHRlbG5ldF9pbnRlcmZhY2UuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYQorCitpcGFjY2Vzc19wcm94eV9TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYyBkZWJ1Zy5jCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX25tLmMgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1ZTFjOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpAQCAtMCwwICsxLDMwMDIgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2RlZmluZSBPTV9BTExPQ19TSVpFCQkxMDI0CisjZGVmaW5lIE9NX0hFQURST09NX1NJWkUJMTI4CisjZGVmaW5lIElQQUNDX1NFR01FTlRfU0laRQkyNDUKKworLyogdW5pZGlyZWN0aW9uYWwgbWVzc2FnZXMgZnJvbSBCVFMgdG8gQlNDICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgcmVwb3J0c1tdID0geworCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCisJTk1fTVRfVEVTVF9SRVAsCisJTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQLAorCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorfTsKKworLyogbWVzc2FnZXMgd2l0aG91dCBBQ0svTkFDSyAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIG5vX2Fja19uYWNrW10gPSB7CisJTk1fTVRfTUVBU19SRVNfUkVRLAorCU5NX01UX1NUT1BfTUVBUywKKwlOTV9NVF9TVEFSVF9NRUFTLAorfTsKKworLyogTWVzc2FnZXMgcmVsYXRlZCB0byBzb2Z0d2FyZSBsb2FkICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgc3dfbG9hZF9tc2dzW10gPSB7CisJTk1fTVRfTE9BRF9JTklUX0FDSywKKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisJTk1fTVRfTE9BRF9BQk9SVCwKKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisJTk1fTVRfTE9BRF9FTkRfTkFDSywKKwkvL05NX01UX1NXX0FDVF9SRVEsCisJTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBuYWNrc1tdID0geworCU5NX01UX0xPQURfSU5JVF9OQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorCU5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCisJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorCU5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCisJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisJTk1fTVRfUEVSRl9URVNUX05BQ0ssCisJTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAorCU5NX01UX1NUT1BfVEVTVF9OQUNLLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCisJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorCU5NX01UX09QU1RBUlRfTkFDSywKKwlOTV9NVF9SRUlOSVRfTkFDSywKKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorCU5NX01UX0dFVF9BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCisJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCisJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmFja19uYW1lc1sweGZmXSA9IHsKKwlbTk1fTVRfTE9BRF9JTklUX05BQ0tdCQk9ICJTT0ZUV0FSRSBMT0FEIElOSVQiLAorCVtOTV9NVF9MT0FEX0VORF9OQUNLXQkJPSAiU09GVFdBUkUgTE9BRCBFTkQiLAorCVtOTV9NVF9TV19BQ1RfUkVRX05BQ0tdCQk9ICJTT0ZUV0FSRSBBQ1RJVkFURSBSRVFVRVNUIiwKKwlbTk1fTVRfQUNUSVZBVEVfU1dfTkFDS10JPSAiQUNUSVZBVEUgU09GVFdBUkUiLAorCVtOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0tdCT0gIkVTVEFCTElTSCBURUkiLAorCVtOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLXQk9ICJDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciLAorCVtOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLXQk9ICJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciLAorCVtOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLXQk9ICJDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiLAorCVtOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLXQk9ICJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiLAorCVtOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDS10JPSAiQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiLAorCVtOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDS10JPSAiRElTQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiLAorCVtOTV9NVF9TRVRfQlRTX0FUVFJfTkFDS10JPSAiU0VUIEJUUyBBVFRSSUJVVEUiLAorCVtOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLXQk9ICJTRVQgUkFESU8gQVRUUklCVVRFIiwKKwlbTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLXQk9ICJTRVQgQ0hBTk5FTCBBVFRSSUJVVEUiLAorCVtOTV9NVF9QRVJGX1RFU1RfTkFDS10JCT0gIlBFUkZPUk0gVEVTVCIsCisJW05NX01UX1NFTkRfVEVTVF9SRVBfTkFDS10JPSAiU0VORCBURVNUIFJFUE9SVCIsCisJW05NX01UX1NUT1BfVEVTVF9OQUNLXQkJPSAiU1RPUCBURVNUIiwKKwlbTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDS10JPSAiU1RPUCBFVkVOVCBSRVBPUlQiLAorCVtOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLXQk9ICJSRVNFVCBFVkVOVCBSRVBPUlQiLAorCVtOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0tdCT0gIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSIsCisJW05NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0tdCT0gIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSBSRVFVRVNUIiwKKwlbTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLXQk9ICJSRVBPUlQgT1VUU1RBTkRJTkcgQUxBUk1TIiwKKwlbTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLXQkJPSAiQ0hBTkdFT1ZFUiIsCisJW05NX01UX09QU1RBUlRfTkFDS10JCT0gIk9QU1RBUlQiLAorCVtOTV9NVF9SRUlOSVRfTkFDS10JCT0gIlJFSU5JVCIsCisJW05NX01UX1NFVF9TSVRFX09VVF9OQUNLXQk9ICJTRVQgU0lURSBPVVRQVVQiLAorCVtOTV9NVF9DSEdfSFdfQ09ORl9OQUNLXQk9ICJDSEFOR0UgSEFSRFdBUkUgQ09ORklHVVJBVElPTiIsCisJW05NX01UX0dFVF9BVFRSX05BQ0tdCQk9ICJHRVQgQVRUUklCVVRFIiwKKwlbTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0tdCT0gIlNFVCBBTEFSTSBUSFJFU0hPTEQiLAorCVtOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0tdCT0gIkJTMTEgQkVHSU4gREFUQUJBU0UgVFJBTlNNSVNTSU9OIiwKKwlbTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDS10JPSAiQlMxMSBFTkQgREFUQUJBU0UgVFJBTlNNSVNTSU9OIiwKKwlbTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0tdCT0gIkJTMTEgQ1JFQVRFIE9CSkVDVCIsCisJW05NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLXQk9ICJCUzExIERFTEVURSBPQkpFQ1QiLAorfTsKKworLyogQ2hhcHRlciA5LjQuMzYgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWVzW10gPSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCVtOTV9OQUNLX0lOQ09SUl9TVFJVQ1RdCQk9ICJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiLAorCVtOTV9OQUNLX01TR1RZUEVfSU5WQUxdCQk9ICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIsCisJW05NX05BQ0tfT0JKQ0xBU1NfSU5WQUxdCT0gIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiwKKwlbTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQXQk9ICJPYmplY3QgY2xhc3Mgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQlRTTlJfVU5LTl0JCT0gIkJUUyBuby4gdW5rbm93biIsCisJW05NX05BQ0tfVFJYTlJfVU5LTl0JCT0gIkJhc2ViYW5kIFRyYW5zY2VpdmVyIG5vLiB1bmtub3duIiwKKwlbTk1fTkFDS19PQkpJTlNUX1VOS05dCQk9ICJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIsCisJW05NX05BQ0tfQVRUUklEX0lOVkFMXQkJPSAiSW52YWxpZCBhdHRyaWJ1dGUgaWRlbnRpZmllciB2YWx1ZSIsCisJW05NX05BQ0tfQVRUUklEX05PVFNVUFBdCT0gIkF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBzdXBwb3J0ZWQiLAorCVtOTV9OQUNLX1BBUkFNX1JBTkdFXQkJPSAiUGFyYW1ldGVyIHZhbHVlIG91dHNpZGUgcGVybWl0dGVkIHJhbmdlIiwKKwlbTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlRdCT0gIkluY29uc2lzdGVuY3kgaW4gYXR0cmlidXRlIGxpc3QiLAorCVtOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQXQk9ICJTcGVjaWZpZWQgaW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQ0FOVF9QRVJGT1JNXQkJPSAiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiwKKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworCVtOTV9OQUNLX1JFU19OT1RJTVBMXQkJPSAiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiwKKwlbTk1fTkFDS19SRVNfTk9UQVZBSUxdCQk9ICJSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiwKKwlbTk1fTkFDS19GUkVRX05PVEFWQUlMXQkJPSAiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiLAorCVtOTV9OQUNLX1RFU1RfTk9UU1VQUF0JCT0gIlRlc3Qgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQ0FQQUNJVFlfUkVTVFJdCT0gIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIsCisJW05NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNXQk9ICJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQiLAorCVtOTV9OQUNLX1RFU1RfTk9USU5JVF0JCT0gIlRlc3Qgbm90IGluaXRpYXRlZCIsCisJW05NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFXQk9ICJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSByZXN0b3JlZCIsCisJW05NX05BQ0tfVEVTVF9OT1NVQ0hdCQk9ICJObyBzdWNoIHRlc3QiLAorCVtOTV9OQUNLX1RFU1RfTk9TVE9QXQkJPSAiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIsCisJW05NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkddCT0gIk1lc3NhZ2UgaW5jb25zaXN0ZW50IHdpdGggcGh5c2ljYWwgY29uZmlndXJhdGlvbiIsCisJW05NX05BQ0tfRklMRV9JTkNPTVBMRVRFXQk9ICJDb21wbGV0ZSBmaWxlIG5vdHJlY2VpdmVkIiwKKwlbTk1fTkFDS19GSUxFX05PVEFWQUlMXQkJPSAiRmlsZSBub3QgYXZhaWxhYmxlIGF0IGRlc3RpbmF0aW9uIiwKKwlbTk1fTkFDS19GSUxFX05PVEFDVElWQVRFXQk9ICJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZSIsCisJW05NX05BQ0tfUkVRX05PVF9HUkFOVF0JCT0gIlJlcXVlc3Qgbm90IGdyYW50ZWQiLAorCVtOTV9OQUNLX1dBSVRdCQkJPSAiV2FpdCIsCisJW05NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1RdCT0gIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIsCisJW05NX05BQ0tfTUVBU19OT1RTVVBQXQkJPSAiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfTUVBU19OT1RTVEFSVF0JCT0gIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiwKK307CisKK3N0YXRpYyBjaGFyIG5hbWVidWZbMjU1XTsKK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJaWYgKGNhdXNlIDwgQVJSQVlfU0laRShuYWNrX2NhdXNlX25hbWVzKSAmJiBuYWNrX2NhdXNlX25hbWVzW2NhdXNlXSkKKwkJcmV0dXJuIG5hY2tfY2F1c2VfbmFtZXNbY2F1c2VdOworCisJc25wcmludGYobmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLCAiMHglMDJ4XG4iLCBjYXVzZSk7CisJcmV0dXJuIG5hbWVidWY7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE2OiBFdmVudCBUeXBlICovCitzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRfdHlwZV9uYW1lc1tdID0geworCVtOTV9FVlRfQ09NTV9GQUlMXQkJPSAiY29tbXVuaWNhdGlvbiBmYWlsdXJlIiwKKwlbTk1fRVZUX1FPU19GQUlMXQkJPSAicXVhbGl0eSBvZiBzZXJ2aWNlIGZhaWx1cmUiLAorCVtOTV9FVlRfUFJPQ19GQUlMXQkJPSAicHJvY2Vzc2luZyBmYWlsdXJlIiwKKwlbTk1fRVZUX0VRVUlQX0ZBSUxdCQk9ICJlcXVpcG1lbnQgZmFpbHVyZSIsCisJW05NX0VWVF9FTlZfRkFJTF0JCT0gImVudmlyb25tZW50IGZhaWx1cmUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50X3R5cGVfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlpZiAoY2F1c2UgPCBBUlJBWV9TSVpFKGV2ZW50X3R5cGVfbmFtZXMpICYmIGV2ZW50X3R5cGVfbmFtZXNbY2F1c2VdKQorCQlyZXR1cm4gZXZlbnRfdHlwZV9uYW1lc1tjYXVzZV07CisKKwlzbnByaW50ZihuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksICIweCUwMnhcbiIsIGNhdXNlKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworLyogQ2hhcHRlciA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworc3RhdGljIGNvbnN0IGNoYXIgKnNldmVyaXR5X25hbWVzW10gPSB7CisJW05NX1NFVkVSX0NFQVNFRF0JCT0gImZhaWx1cmUgY2Vhc2VkIiwKKwlbTk1fU0VWRVJfQ1JJVElDQUxdCQk9ICJjcml0aWNhbCBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfTUFKT1JdCQk9ICJtYWpvciBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfTUlOT1JdCQk9ICJtaW5vciBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfV0FSTklOR10JCT0gIndhcm5pbmcgbGV2ZWwgZmFpbHVyZSIsCisJW05NX1NFVkVSX0lOREVURVJNSU5BVEVdCT0gImluZGV0ZXJtaW5hdGUgZmFpbHVyZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc2V2ZXJpdHlfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlpZiAoY2F1c2UgPCBBUlJBWV9TSVpFKHNldmVyaXR5X25hbWVzKSAmJiBzZXZlcml0eV9uYW1lc1tjYXVzZV0pCisJCXJldHVybiBzZXZlcml0eV9uYW1lc1tjYXVzZV07CisKKwlzbnByaW50ZihuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksICIweCUwMnhcbiIsIGNhdXNlKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworLyogQXR0cmlidXRlcyB0aGF0IHRoZSBCU0MgY2FuIHNldCwgbm90IG9ubHkgZ2V0LCBhY2NvcmRpbmcgdG8gU2VjdGlvbiA5LjQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fYXR0ciBubV9hdHRfc2V0dGFibGVbXSA9IHsKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9ERVNULAorCU5NX0FUVF9FVkVOVF9UWVBFLAorCU5NX0FUVF9GSUxFX0RBVEEsCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NRFJPUF9MSU5LLAorCU5NX0FUVF9NRFJPUF9ORVhULAorCU5NX0FUVF9OQUNLX0NBVVNFUywKKwlOTV9BVFRfT1VUU1RfQUxBUk0sCisJTk1fQVRUX1BIWVNfQ09ORiwKKwlOTV9BVFRfUFJPQl9DQVVTRSwKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1NPVVJDRSwKKwlOTV9BVFRfU1BFQ19QUk9CLAorCU5NX0FUVF9TVEFSVF9USU1FLAorCU5NX0FUVF9URVNUX0RVUiwKKwlOTV9BVFRfVEVTVF9OTywKKwlOTV9BVFRfVEVTVF9SRVBPUlQsCisJTk1fQVRUX1dJTkRPV19TSVpFLAorCU5NX0FUVF9TRVZFUklUWSwKKwlOTV9BVFRfTUVBU19SRVMsCisJTk1fQVRUX01FQVNfVFlQRSwKK307CisKK2NvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNoY29tYjRwY2hhbltdID0geworCVtHU01fUENIQU5fQ0NDSF0JPSBOTV9DSEFOQ19tYWluQkNDSCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XQk9IE5NX0NIQU5DX0JDQ0hDb21iLAorCVtHU01fUENIQU5fVENIX0ZdCT0gTk1fQ0hBTkNfVENIRnVsbCwKKwlbR1NNX1BDSEFOX1RDSF9IXQk9IE5NX0NIQU5DX1RDSEhhbGYsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSBOTV9DSEFOQ19TRENDSCwKKwlbR1NNX1BDSEFOX1BEQ0hdCT0gTk1fQ0hBTkNfSVBBQ19QRENILAorCVtHU01fUENIQU5fVENIX0ZfUERDSF0JPSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCwKKwkvKiBGSVhNRTogYm91bmRzIGNoZWNrICovCit9OworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpZiAocGNoYW4gPCBBUlJBWV9TSVpFKGNoY29tYjRwY2hhbikpCisJCXJldHVybiBjaGNvbWI0cGNoYW5bcGNoYW5dOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhYmlzX25tX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IHVfaW50OF90ICpidWYsIGludCBsZW4pCit7CisJaWYgKCFidHMtPm1vZGVsKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdGx2X3BhcnNlKHRwLCAmYnRzLT5tb2RlbC0+bm1fYXR0X3RsdmRlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCitzdGF0aWMgaW50IGlzX2luX2FycihlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCwgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgKmFyciwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChhcnJbaV0gPT0gbXQpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIGlzIHRoaXMgbXNndHlwZSB0aGUgdXN1YWwgQUNLL05BQ0sgdHlwZSA/ICovCitzdGF0aWMgaW50IGlzX2Fja19uYWNrKGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiAhaXNfaW5fYXJyKG10LCBub19hY2tfbmFjaywgQVJSQVlfU0laRShub19hY2tfbmFjaykpOworfQorI2VuZGlmCisKKy8qIGlzIHRoaXMgbXNndHlwZSBhIHJlcG9ydCA/ICovCitzdGF0aWMgaW50IGlzX3JlcG9ydChlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCkKK3sKKwlyZXR1cm4gaXNfaW5fYXJyKG10LCByZXBvcnRzLCBBUlJBWV9TSVpFKHJlcG9ydHMpKTsKK30KKworI2RlZmluZSBNVF9BQ0soeCkJKHgrMSkKKyNkZWZpbmUgTVRfTkFDSyh4KQkoeCsyKQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4pCit7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19GT007CisJb2gtPnBsYWNlbWVudCA9IEFCSVNfT01fUExBQ0VNRU5UX09OTFk7CisJb2gtPnNlcXVlbmNlID0gMDsKKwlvaC0+bGVuZ3RoID0gbGVuOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2ZvbV9oZHIoc3RydWN0IGFiaXNfb21faGRyICpvaCwgdV9pbnQ4X3QgbGVuLAorCQkJICAgIHVfaW50OF90IG1zZ190eXBlLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICAgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9CisJCQkoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKworCWZpbGxfb21faGRyKG9oLCBsZW4rc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKm5tX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShPTV9BTExPQ19TSVpFLCBPTV9IRUFEUk9PTV9TSVpFLAorCQkJCSAgICJPTUwiKTsKK30KKworLyogU2VuZCBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlNDIHRvIEJUUyAqLworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBfYWJpc19ubV9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm9ial9jbGFzc19uYW1lKHVfaW50OF90IG9jKQoreworCXN3aXRjaCAob2MpIHsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJcmV0dXJuICJTSVRFIE1BTkFHRVIiOworCWNhc2UgTk1fT0NfQlRTOgorCQlyZXR1cm4gIkJUUyI7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgorCQlyZXR1cm4gIlJBRElPIENBUlJJRVIiOworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlyZXR1cm4gIkJBU0VCQU5EIFRSQU5TQ0VJVkVSIjsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCXJldHVybiAiQ0hBTk5FTCI7CisJY2FzZSBOTV9PQ19CUzExX0FESkM6CisJCXJldHVybiAiQURKQyI7CisJY2FzZSBOTV9PQ19CUzExX0hBTkRPVkVSOgorCQlyZXR1cm4gIkhBTkRPVkVSIjsKKwljYXNlIE5NX09DX0JTMTFfUFdSX0NUUkw6CisJCXJldHVybiAiUE9XRVIgQ09OVFJPTCI7CisJY2FzZSBOTV9PQ19CUzExX0JUU0U6CisJCXJldHVybiAiQlRTRSI7CisJY2FzZSBOTV9PQ19CUzExX1JBQ0s6CisJCXJldHVybiAiUkFDSyI7CisJY2FzZSBOTV9PQ19CUzExX1RFU1Q6CisJCXJldHVybiAiVEVTVCI7CisJY2FzZSBOTV9PQ19CUzExX0VOVkFCVFNFOgorCQlyZXR1cm4gIkVOVkFCVFNFIjsKKwljYXNlIE5NX09DX0JTMTFfQlBPUlQ6CisJCXJldHVybiAiQlBPUlQiOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCXJldHVybiAiR1BSUyBOU0UiOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlyZXR1cm4gIkdQUlMgQ0VMTCI7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCXJldHVybiAiR1BSUyBOU1ZDIjsKKwljYXNlIE5NX09DX0JTMTE6CisJCXJldHVybiAiU0lFTUVOU0hXIjsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpCit7CisJc3dpdGNoIChvcykgeworCWNhc2UgTk1fT1BTVEFURV9ESVNBQkxFRDoKKwkJcmV0dXJuICJEaXNhYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX0VOQUJMRUQ6CisJCXJldHVybiAiRW5hYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX05VTEw6CisJCXJldHVybiAiTlVMTCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJSRlUiOworCX0KK30KKworLyogQ2hhcHRlciA5LjQuNyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF2YWlsX25hbWVzW10gPSB7CisJIkluIHRlc3QiLAorCSJGYWlsZWQiLAorCSJQb3dlciBvZmYiLAorCSJPZmYgbGluZSIsCisJIjxub3QgdXNlZD4iLAorCSJEZXBlbmRlbmN5IiwKKwkiRGVncmFkZWQiLAorCSJOb3QgaW5zdGFsbGVkIiwKK307CisKK2NvbnN0IGNoYXIgKm5tX2F2YWlsX25hbWUodV9pbnQ4X3QgYXZhaWwpCit7CisJaWYgKGF2YWlsID09IDB4ZmYpCisJCXJldHVybiAiT0siOworCWlmIChhdmFpbCA+PSBBUlJBWV9TSVpFKGF2YWlsX25hbWVzKSkKKwkJcmV0dXJuICJVTktOT1dOIjsKKwlyZXR1cm4gYXZhaWxfbmFtZXNbYXZhaWxdOworfQorCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyB0ZXN0X25hbWVzW10gPSB7CisJLyogRklYTUU6IHN0YW5kYXJkIHRlc3QgbmFtZXMgKi8KKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLCAiQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLCAiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sICJCQ0NIIEluZm8iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLCAiVHJhbnNtaXQgQmVhY29uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c3RlbSBJbmZvIE1vbml0b3IiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggTW9uaXRvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYWRtX25hbWUodV9pbnQ4X3QgYWRtKQoreworCXN3aXRjaCAoYWRtKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gIkxvY2tlZCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIlVubG9ja2VkIjsKKwljYXNlIDM6CisJCXJldHVybiAiU2h1dGRvd24iOworCWRlZmF1bHQ6CisJCXJldHVybiAiPG5vdCB1c2VkPiI7CisJfQorfQorCitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKSB7CisJcmV0dXJuIChzLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0VOQUJMRUQpICYmICgKKwkJKHMtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAorCQkocy0+YXZhaWxhYmlsaXR5ID09IDB4ZmYpCisJKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdwX2ZvaChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJREVCVUdQKEROTSwgIk9DPSVzKCUwMngpIElOU1Q9KCUwMngsJTAyeCwlMDJ4KSAiLAorCQlvYmpfY2xhc3NfbmFtZShmb2gtPm9ial9jbGFzcyksIGZvaC0+b2JqX2NsYXNzLCAKKwkJZm9oLT5vYmpfaW5zdC5idHNfbnIsIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKK30KKworLyogb2J0YWluIHRoZSBnc21fbm1fc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gb2JqZWN0IGluc3RhbmNlICovCitzdGF0aWMgc3RydWN0IGdzbV9ubV9zdGF0ZSAqCitvYmpjbGFzczJubXN0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSA9IE5VTEw7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlRTOgorCQlubV9zdGF0ZSA9ICZidHMtPm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZ0cngtPnRzW29ial9pbnN0LT50c19ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlubV9zdGF0ZSA9ICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTE6CisJCXN3aXRjaCAob2JqX2luc3QtPmJ0c19ucikgeworCQljYXNlIEJTMTFfT0JKX0NDTEs6CisJCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuY2Nsay5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX0JCU0lHOgorCQkJaWYgKG9ial9pbnN0LT50c19uciA+IGJ0cy0+bnVtX3RyeCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQkJbm1fc3RhdGUgPSAmdHJ4LT5iczExLmJic2lnLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfUEE6CisJCQlpZiAob2JqX2luc3QtPnRzX25yID4gYnRzLT5udW1fdHJ4KQorCQkJCXJldHVybiBOVUxMOworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCQlubV9zdGF0ZSA9ICZ0cngtPmJzMTEucGEubm1fc3RhdGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJY2FzZSBOTV9PQ19CUzExX1JBQ0s6CisJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5yYWNrLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTFfRU5WQUJUU0U6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5iczExLmVudmFidHNlKSkKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuZW52YWJ0c2Vbb2JqX2luc3QtPnRyeF9ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc2Uubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlubV9zdGF0ZSA9ICZidHMtPmdwcnMuY2VsbC5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdLm5tX3N0YXRlOworCQlicmVhazsKKwl9CisJcmV0dXJuIG5tX3N0YXRlOworfQorCisvKiBvYnRhaW4gdGhlIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZSBvZiBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQgKgorb2JqY2xhc3Myb2JqKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkgICAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwl2b2lkICpvYmogPSBOVUxMOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JUUzoKKwkJb2JqID0gYnRzOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJb2JqID0gdHJ4OworCQlicmVhazsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlvYmogPSAmdHJ4LT5iYl90cmFuc2M7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmdHJ4LT50c1tvYmpfaW5zdC0+dHNfbnJdOworCQlicmVhazsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJb2JqID0gJmJ0cy0+c2l0ZV9tZ3I7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW9iaiA9ICZidHMtPmdwcnMubnNlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJb2JqID0gJmJ0cy0+Z3Bycy5jZWxsOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnN2YykpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2JqID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdOworCQlicmVhazsKKwl9CisJcmV0dXJuIG9iajsKK30KKworLyogVXBkYXRlIHRoZSBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSBvZiBhIGdpdmVuIG9iamVjdCBpbiBvdXIgaW4tbWVtb3J5IGRhdGEKKyAqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworc3RhdGljIGludCB1cGRhdGVfYWRtc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0LCB1X2ludDhfdCBhZG1fc3RhdGUpCit7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwl2b2lkICpvYmo7CisJaW50IHJjOworCisJb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRUlOVkFMOworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIG9ial9jbGFzcywgb2JqX2luc3QpOworCWlmICghbm1fc3RhdGUpCisJCXJldHVybiAtMTsKKworCW5ld19zdGF0ZSA9ICpubV9zdGF0ZTsKKwluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19BRE0sIG9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSk7CisKKwlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlLCBuZXdfc3RhdGU7CisJaW50IHJjOworCisJREVCVUdQQyhETk0sICJTVEFURSBDSEc6ICIpOworCisJbWVtc2V0KCZuZXdfc3RhdGUsIDAsIHNpemVvZihuZXdfc3RhdGUpKTsKKworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkgeworCQlERUJVR1BDKEROTSwgInVua25vd24gb2JqZWN0IGNsYXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5vcGVyYXRpb25hbCA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9PUEVSX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJPUF9TVEFURT0lcyAiLCBubV9vcHN0YXRlX25hbWUobmV3X3N0YXRlLm9wZXJhdGlvbmFsKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSkgeworCQlpZiAoVExWUF9MRU4oJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSA9PSAwKQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJCWVsc2UKKwkJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKTsKKwkJREVCVUdQQyhETk0sICJBVkFJTD0lcyglMDJ4KSAiLCBubV9hdmFpbF9uYW1lKG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkpLAorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSk7CisJfSBlbHNlCisJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAweGZmOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkgeworCQluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJBRE09JTJzICIsIG5tX2FkbV9uYW1lKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSkpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlpZiAoKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSAhPSAwICYmIG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKSB8fAorCSAgICBuZXdfc3RhdGUub3BlcmF0aW9uYWwgIT0gbm1fc3RhdGUtPm9wZXJhdGlvbmFsIHx8CisJICAgIG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgIT0gbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSkgeworCQkvKiBVcGRhdGUgdGhlIG9wZXJhdGlvbmFsIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorIAkJKiBzdHJ1Y3R1cmVzIGFuZCBzZW5kIGFuIGV2ZW50IHRvIHRoZSBoaWdoZXIgbGF5ZXIgKi8KKwkJdm9pZCAqb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwkJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfT1BFUiwgZm9oLT5vYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUpOworCQlubV9zdGF0ZS0+b3BlcmF0aW9uYWwgPSBuZXdfc3RhdGUub3BlcmF0aW9uYWw7CisJCW5tX3N0YXRlLT5hdmFpbGFiaWxpdHkgPSBuZXdfc3RhdGUuYXZhaWxhYmlsaXR5OworCQlpZiAobm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApCisJCQlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmU7CisJfQorI2lmIDAKKwlpZiAob3Bfc3RhdGUgPT0gMSkgeworCQkvKiB0cnkgdG8gZW5hYmxlIG9iamVjdHMgdGhhdCBhcmUgZGlzYWJsZWQgKi8KKwkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZmFpbF9ldnRfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1BDKEROTSwgIkZhaWx1cmUgRXZlbnQgUmVwb3J0ICIpOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpCisJCURFQlVHUEMoRE5NLCAiVHlwZT0lcyAiLCBldmVudF90eXBlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpCisJCURFQlVHUEMoRE5NLCAiU2V2ZXJpdHk9JXMgIiwgc2V2ZXJpdHlfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKSk7CisKKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19yZXBvcnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCS8vbm1oLT5jZmctPnJlcG9ydF9jYihtYiwgZm9oKTsKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUDoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3RhdGVjaGdfcmVwKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RJVkFURURfUkVQOgorCQlERUJVR1BDKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fU1dfQUNUSVZfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVA6CisJCXJ4X2ZhaWxfZXZ0X3JlcChtYik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9GQUlMX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1RFU1RfUkVQOgorCQlERUJVR1BDKEROTSwgIlRlc3QgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1RFU1RfUkVQLCBtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAicmVwb3J0aW5nIE5NIE1UIDB4JTAyeFxuIiwgbXQpOworCQlicmVhazsKKwkJCisJfTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBpcGFjY19zd19hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwKKwkJCSAgICAgdV9pbnQ4X3QgaTIsIGNvbnN0IHVfaW50OF90ICpzd19kZXNjLCB1X2ludDhfdCBzd2Rlc2NfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSBzd2Rlc2NfbGVuOworCXVfaW50OF90ICp0cmFpbGVyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCXRyYWlsZXIgPSBtc2diX3B1dChtc2csIHN3ZGVzY19sZW4pOworCW1lbWNweSh0cmFpbGVyLCBzd19kZXNjLCBzd2Rlc2NfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfc3dfYWN0X3JlcShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWNvbnN0IHVfaW50OF90ICpzd19jb25maWc7CisJaW50IHN3X2NvbmZpZ19sZW47CisJaW50IGZpbGVfaWRfbGVuOworCWludCByZXQ7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIlNXIEFjdGl2YXRlIFJlcXVlc3Q6ICIpOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QsIEFDS2luZyBhbmQgQWN0aXZhdGluZ1xuIik7CisKKwlyZXQgPSBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50c19uciwgMCwKKwkJCQkgICAgICBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlzd19jb25maWcgPSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCXN3X2NvbmZpZ19sZW4gPSBUTFZQX0xFTigmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRykpIHsKKwkJREVCVUdQKEROTSwgIlNXIGNvbmZpZyBub3QgZm91bmQhIENhbid0IGNvbnRpbnVlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChETk0sICJGb3VuZCBTVyBjb25maWc6ICVzXG4iLCBoZXhkdW1wKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbikpOworCX0KKworCWlmIChzd19jb25maWdbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKQorCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJaWYgKHN3X2NvbmZpZ1sxXSAhPSBOTV9BVFRfRklMRV9JRCkKKwkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJZmlsZV9pZF9sZW4gPSBzd19jb25maWdbMl0gKiAyNTYgKyBzd19jb25maWdbM107CisKKwkvKiBBc3N1bWVzIGZpcnN0IFNXIGZpbGUgaW4gbGlzdCBpcyB0aGUgb25lIHRvIGJlIGFjdGl2YXRlZCAqLworCS8qIHN3X2NvbmZpZyArIDQgdG8gc2tpcCBvdmVyIDIgYXR0cmlidXRlIElEIGJ5dGVzIGFuZCAxNi1iaXQgbGVuZ3RoIGZpZWxkICovCisJcmV0dXJuIGlwYWNjX3N3X2FjdGl2YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50c19uciwKKwkJCQkgc3dfY29uZmlnICsgNCwKKwkJCQkgZmlsZV9pZF9sZW4pOworfQorCisvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLworc3RhdGljIGludCBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdV9pbnQ4X3QgYWRtX3N0YXRlOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0FETV9TVEFURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRtX3N0YXRlID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0FETV9TVEFURSk7CisKKwlyZXR1cm4gdXBkYXRlX2FkbXN0YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0LCBhZG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfbG10X2V2ZW50KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE5NLCAiTE1UIEV2ZW50ICIpOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pID49IDEpIHsKKwkJdV9pbnQ4X3Qgb25vZmYgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTik7CisJCURFQlVHUEMoRE5NLCAiTE9HJXMgIiwgb25vZmYgPyAiT04iIDogIk9GRiIpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSA+PSAxKSB7CisJCXVfaW50OF90IGxldmVsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVik7CisJCURFQlVHUEMoRE5NLCAiTGV2ZWw9JXUgIiwgbGV2ZWwpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSA+PSAxKSB7CisJCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpOworCQlERUJVR1BDKEROTSwgIlVzZXJuYW1lPSVzICIsIG5hbWUpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisJLyogRklYTUU6IHBhcnNlIExNVCBMT0dPTiBUSU1FICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJUUyAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19mb20oc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwkvKiBjaGVjayBmb3IgdW5zb2xpY2l0ZWQgbWVzc2FnZSAqLworCWlmIChpc19yZXBvcnQobXQpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfcmVwb3J0KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIHN3X2xvYWRfbXNncywgQVJSQVlfU0laRShzd19sb2FkX21zZ3MpKSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3N3KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIG5hY2tzLCBBUlJBWV9TSVpFKG5hY2tzKSkpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkJZGVidWdwX2ZvaChmb2gpOworCisJCWlmIChuYWNrX25hbWVzW210XSkKKwkJCURFQlVHUEMoRE5NLCAiJXMgTkFDSyAiLCBuYWNrX25hbWVzW210XSk7CisJCQkvKiBGSVhNRTogTkFDSyBjYXVzZSAqLworCQllbHNlCisJCQlERUJVR1BDKEROTSwgIk5BQ0sgMHglMDJ4ICIsIG10KTsKKworCQlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICJDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9OQUNLLCAodm9pZCopICZtdCk7CisJCXJldHVybiAwOworCX0KKyNpZiAwCisJLyogY2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIHRvIGJlIGFja2VkICovCisJaWYgKGlzX2Fja19uYWNrKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQlpZiAobXQgPT0gTVRfQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIEFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogd2UgZ290IG91ciBBQ0ssIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQgbXNnICovCisJCX0gZWxzZSBpZiAobXQgPT0gTVRfTkFDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCS8qIHdlIGdvdCBhIE5BQ0ssIHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBOQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiBGSVhNRTogc29tZWhvdyBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCX0gZWxzZSB7CisJCQkvKiByZWFsbHkgc3RyYW5nZSB0aGluZ3MgaGFwcGVuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgorCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0s6CisJCXJldHVybiBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RfUkVROgorCQlyZXR1cm4gYWJpc19ubV9yeF9zd19hY3RfcmVxKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9TRVNTSU9OOgorCQlyZXR1cm4gYWJpc19ubV9yeF9sbXRfZXZlbnQobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0NPTk5fTURST1BfTElOS19BQ0s6CisJCURFQlVHUChETk0sICJDT05OIE1EUk9QIExJTksgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfbWFudWYoc3RydWN0IG1zZ2IgKm1iKQoreworCWludCByYzsKKwlpbnQgYnRzX3R5cGUgPSBtYi0+dHJ4LT5idHMtPnR5cGU7CisKKwlzd2l0Y2ggKGJ0c190eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmMgPSBhYmlzX25tX3J4X2lwYWNjKG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byBwYXJzZSBPTUwgZm9yIHRoaXMgIgorCQkgICAgICJCVFMgdHlwZSAoJXUpXG4iLCBidHNfdHlwZSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIaWdoLUxldmVsIEFQSSAqLworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgT01MIGZyb20gQlRTIGVudGVycyB0aGUgTk0gY29kZSAqLworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJLyogVmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAob2gtPnBsYWNlbWVudCAhPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgcGxhY2VtZW50IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCW9oLT5wbGFjZW1lbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5zZXF1ZW5jZSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgc2VxdWVuY2UgMHgleCAhPSAweDAwXG4iLAorCQkJb2gtPnNlcXVlbmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmIDAKKwl1bnNpZ25lZCBpbnQgbDJfbGVuID0gbXNnLT50YWlsIC0gKHVfaW50OF90ICopbXNnYl9sMihtc2cpOworCXVuc2lnbmVkIGludCBobGVuID0gc2l6ZW9mKCpvaCkgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcik7CisJaWYgKG9oLT5sZW5ndGggKyBobGVuID4gbDJfbGVuKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgdHJ1bmNhdGVkIG1lc3NhZ2UgKCV1ID4gJXUpXG4iLAorCQkJb2gtPmxlbmd0aCArIHNpemVvZigqb2gpLCBsMl9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5sZW5ndGggKyBobGVuIDwgbDJfbGVuKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIG1lc3NhZ2Ugd2l0aCBleHRyYSB0cmFpbGVyPyE/IChvaC0+bGVuPSVkLCBzaXplb2Zfb2g9JWQgbDJfbGVuPSVkXG4iLCBvaC0+bGVuZ3RoLCBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKyNlbmRpZgorCW1zZy0+bDNoID0gKHVuc2lnbmVkIGNoYXIgKilvaCArIHNpemVvZigqb2gpOworCisJc3dpdGNoIChvaC0+bWRpc2MpIHsKKwljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX2ZvbShtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfbWFudWYobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01NSToKKwljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmtub3duIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogaW5pdGlhbGl6ZWQgYWxsIHJlc291cmNlcyAqLworc3RydWN0IGFiaXNfbm1faCAqYWJpc19ubV9pbml0KHN0cnVjdCBhYmlzX25tX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKworCW5taCA9IG1hbGxvYyhzaXplb2YoKm5taCkpOworCWlmICghbm1oKQorCQlyZXR1cm4gTlVMTDsKKworCW5taC0+Y2ZnID0gY2ZnOworCisJcmV0dXJuIG5taDsKK30KKworLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCit2b2lkIGFiaXNfbm1fZmluaShzdHJ1Y3QgYWJpc19ubV9oICpubWgpCit7CisJZnJlZShubWgpOworfQorI2VuZGlmCisKKy8qIEhlcmUgd2UgYXJlIHRyeWluZyB0byBkZWZpbmUgYSBoaWdoLWxldmVsIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgYWN0dWFsIEJTQyBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoZSBhcmNoaXRlY3R1cmUgaXMgY3VycmVudGx5CisgKiBzdGlsbCB1bmRlciBkZXNpZ24uICBJZGVhbGx5IHRoZSBjYWxscyB0byB0aGlzIEFQSSB3b3VsZCBiZSBzeW5jaHJvbm91cywKKyAqIHdoaWxlIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGJlaGluZCB0aGUgQVBpIHJ1bnMgaW4gYSB0cmFkaXRpb25hbCBzZWxlY3QKKyAqIGJhc2VkIHN0YXRlIG1hY2hpbmUuCisgKi8KKworLyogNi4yIFNvZnR3YXJlIExvYWQ6ICovCitlbnVtIHN3X3N0YXRlIHsKKwlTV19TVEFURV9OT05FLAorCVNXX1NUQVRFX1dBSVRfSU5JVEFDSywKKwlTV19TVEFURV9XQUlUX1NFR0FDSywKKwlTV19TVEFURV9XQUlUX0VOREFDSywKKwlTV19TVEFURV9XQUlUX0FDVEFDSywKKwlTV19TVEFURV9FUlJPUiwKK307CisKK3N0cnVjdCBhYmlzX25tX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiX2RhdGE7CisJaW50IGZvcmNlZDsKKworCS8qIHRoaXMgd2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgU1cgTE9BRCBJTklUSUFURSAqLworCXVfaW50OF90IG9ial9jbGFzczsKKwl1X2ludDhfdCBvYmpfaW5zdGFuY2VbM107CisKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworCisJdV9pbnQ4X3Qgd2luZG93X3NpemU7CisJdV9pbnQ4X3Qgc2VnX2luX3dpbmRvdzsKKworCWludCBmZDsKKwlGSUxFICpzdHJlYW07CisJZW51bSBzd19zdGF0ZSBzdGF0ZTsKKwlpbnQgbGFzdF9zZWc7Cit9OworCitzdGF0aWMgc3RydWN0IGFiaXNfbm1fc3cgZ19zdzsKKworc3RhdGljIHZvaWQgc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX05BTk9CVFMpIHsKKwkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSBpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlBsZWFzZSBpbXBsZW1lbnQgdGhpcyBmb3IgdGhlIEJUUy5cbiIpOworCX0KK30KKworLyogNi4yLjEgLyA4LjMuMTogTG9hZCBEYXRhIEluaXRpYXRlICovCitzdGF0aWMgaW50IHN3X2xvYWRfaW5pdChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDMqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0lOSVQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1dJTkRPV19TSVpFLCBzdy0+d2luZG93X3NpemUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBpc19sYXN0X2xpbmUoRklMRSAqc3RyZWFtKQoreworCWNoYXIgbmV4dF9zZWdfYnVmWzI1Nl07CisJbG9uZyBwb3M7CisKKwkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwlwb3MgPSBmdGVsbChzdHJlYW0pOworCWlmICghZmdldHMobmV4dF9zZWdfYnVmLCBzaXplb2YobmV4dF9zZWdfYnVmKS0yLCBzdHJlYW0pKSB7CisJCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJCXJldHVybiAxOworCX0KKworCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDYuMi4yIC8gOC4zLjIgTG9hZCBEYXRhIFNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9zZWdtZW50KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJY2hhciBzZWdfYnVmWzI1Nl07CisJY2hhciAqbGluZV9idWYgPSBzZWdfYnVmKzI7CisJdW5zaWduZWQgY2hhciAqdGx2OworCXVfaW50OF90IGxlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWlmIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mKHNlZ19idWYpLTIsIHN3LT5zdHJlYW0pID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmdldHMgcmVhZGluZyBzZWdtZW50Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZWdfYnVmWzBdID0gMHgwMDsKKworCQkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwkJc3ctPmxhc3Rfc2VnID0gaXNfbGFzdF9saW5lKHN3LT5zdHJlYW0pOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJc2VnX2J1ZlsxXSA9IDA7CisJCWVsc2UKKwkJCXNlZ19idWZbMV0gPSAxICsgc3ctPnNlZ19pbl93aW5kb3crKzsKKworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpICsgMjsKKwkJdGx2ID0gbXNnYl9wdXQobXNnLCBUTFZfR1JPU1NfTEVOKGxlbikpOworCQl0bHZfcHV0KHRsdiwgTk1fQVRUX0JTMTFfRklMRV9EQVRBLCBsZW4sICh1X2ludDhfdCAqKXNlZ19idWYpOworCQkvKiBCUzExIHdhbnRzIENSICsgTEYgaW4gZXhjZXNzIG9mIHRoZSBUTFYgbGVuZ3RoICE/ISAqLworCQl0bHZbMV0gLT0gMjsKKworCQkvKiB3ZSBvbmx5IG5vdyBrbm93IHRoZSBleGFjdCBsZW5ndGggZm9yIHRoZSBPTSBoZHIgKi8KKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSsyOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOiB7CisJCXN0YXRpY19hc3NlcnQoc2l6ZW9mKHNlZ19idWYpID49IElQQUNDX1NFR01FTlRfU0laRSwgYnVmZmVyX2JpZ19lbm91Z2gpOworCQlsZW4gPSByZWFkKHN3LT5mZCwgJnNlZ19idWYsIElQQUNDX1NFR01FTlRfU0laRSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwZXJyb3IoInJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChsZW4gIT0gSVBBQ0NfU0VHTUVOVF9TSVpFKQorCQkJc3ctPmxhc3Rfc2VnID0gMTsKKworCQkrK3N3LT5zZWdfaW5fd2luZG93OworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsIGxlbiwgKGNvbnN0IHVfaW50OF90ICopIHNlZ19idWYpOworCQlsZW4gKz0gMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAic3dfbG9hZF9zZWdtZW50IG5lZWRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQlRTLlxuIik7CisJCS8qIEZJWE1FOiBPdGhlciBCVFMgdHlwZXMgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX1NFRywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogNi4yLjQgLyA4LjMuNCBMb2FkIERhdGEgRW5kICovCitzdGF0aWMgaW50IHN3X2xvYWRfZW5kKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfRU5ELCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IHN3X2FjdGl2YXRlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJLyogRklYTUU6IHRoaXMgaXMgQlMxMSBzcGVjaWZpYyBmb3JtYXQgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzRdOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHBhcnNlX3NkcF9oZWFkZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaGVhZGVyOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJcmMgPSByZWFkKHN3LT5mZCwgJmZpcm13YXJlX2hlYWRlciwgc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyAhPSBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWFkIFNEUCBmaWxlIGhlYWRlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbWFnaWMgbnVtYmVyMSBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzBdICE9IDB4MTAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMV0gIT0gMHgwMiB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1syXSAhPSAweDAwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzNdICE9IDB4MDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbW9yZSBtYWdpYyBudW1iZXIgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKGZzdGF0KHN3LT5mZCwgJnN0YXQpID09IC0xKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHN0YXQgdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXIuZmlsZV9sZW5ndGgpICE9IHN0YXQuc3Rfc2l6ZSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBmaWxlc2l6ZXMgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIHRoZSBzdGFydCBhcyB3ZSBjaGVja2VkIHRoZSB3aG9sZSBmaWxlc2l6ZS4uICovCisJbHNlZWsoc3ctPmZkLCAwbCwgU0VFS19TRVQpOworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgIlRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyIGlzIG5vdCBmdWxseSB1bmRlcnN0b29kLlxuIgorCQkJICAgICAgICJUaGVyZSBtaWdodCBiZSBjaGVja3N1bXMgaW4gdGhlIGZpbGUgdGhhdCBhcmUgbm90XG4iCisJCQkgICAgICAgInZlcmlmaWVkIGFuZCBpbmNvbXBsZXRlIGZpcm13YXJlIG1pZ2h0IGJlIGZsYXNoZWQuXG4iCisJCQkgICAgICAgIlRoZXJlIGlzIGFic29sdXRlbHkgbm8gV0FSUkFOVFkgdGhhdCBmbGFzaGluZyB3aWxsXG4iCisJCQkgICAgICAgIndvcmsuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19vcGVuX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyIGZpbGVfaWRbMTIrMV07CisJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJaW50IHJjOworCisJc3ctPmZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChzdy0+ZmQgPCAwKQorCQlyZXR1cm4gc3ctPmZkOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPnN0cmVhbSA9IGZkb3Blbihzdy0+ZmQsICJyIik7CisJCWlmICghc3ctPnN0cmVhbSkgeworCQkJcGVycm9yKCJmZG9wZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiByZWFkIGZpcnN0IGxpbmUgYW5kIHBhcnNlIGZpbGUgSUQgYW5kIFZFUlNJT04gKi8KKwkJcmMgPSBmc2NhbmYoc3ctPnN0cmVhbSwgIkAoIyklMTJzOiU4MHNcclxuIiwgCisJCQkgICAgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjICE9IDIpIHsKKwkJCXBlcnJvcigicGFyc2luZyBoZWFkZXIgbGluZSBvZiBzb2Z0d2FyZSBmaWxlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfaWQsIGZpbGVfaWQpOworCQlzdy0+ZmlsZV9pZF9sZW4gPSBzdHJsZW4oZmlsZV9pZCk7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sIGZpbGVfdmVyc2lvbik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGZpbGVfdmVyc2lvbik7CisJCS8qIHJld2luZCB0byBzdGFydCBvZiBmaWxlICovCisJCXJld2luZChzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CQorCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCS8qIFRPRE86IGV4dHJhY3QgdGhhdCBmcm9tIHRoZSBmaWxlbmFtZSBvciBjb250ZW50ICovCisJCXJjID0gcGFyc2Vfc2RwX2hlYWRlcihzdyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHBhcnNlIHRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCAiaWQiKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gMzsKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfdmVyc2lvbiwgInZlcnNpb24iKTsKKwkJc3ctPmZpbGVfdmVyc2lvbl9sZW4gPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCBrbm93IGhvdyB0byB0cmVhdCB0aGVtIHlldCAqLworCQljbG9zZShzdy0+ZmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyB2b2lkIHN3X2Nsb3NlX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWZjbG9zZShzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2xvc2Uoc3ctPmZkKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBGaWxsIHRoZSB3aW5kb3cgKi8KK3N0YXRpYyBpbnQgc3dfZmlsbF93aW5kb3coc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCWludCByYzsKKworCXdoaWxlIChzdy0+c2VnX2luX3dpbmRvdyA8IHN3LT53aW5kb3dfc2l6ZSkgeworCQlyYyA9IHN3X2xvYWRfc2VnbWVudChzdyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWlmIChzdy0+bGFzdF9zZWcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gYWJpc19ubV9yY3Ztc2coKSBoYW5kbGVyICovCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3N3KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlpbnQgcmMgPSAtMTsKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwllbnVtIHN3X3N0YXRlIG9sZF9zdGF0ZSA9IHN3LT5zdGF0ZTsKKwkKKwkvL0RFQlVHUChETk0sICJzdGF0ZSAldSwgTk0gTVQgMHglMDJ4XG4iLCBzdy0+c3RhdGUsIGZvaC0+bXNnX3R5cGUpOworCisJc3dpdGNoIChzdy0+c3RhdGUpIHsKKwljYXNlIFNXX1NUQVRFX1dBSVRfSU5JVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJCS8qIGZpbGwgd2luZG93IHdpdGggc2VnbWVudHMgKi8KKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCAiCisJCQkJCSJJbml0IE5BQ0tcbiIpOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfSU5JVF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLXG4iKTsKKwkJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX1NFR0FDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfU0VHX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlzdy0+c2VnX2luX3dpbmRvdyA9IDA7CisJCQlpZiAoIXN3LT5sYXN0X3NlZykgeworCQkJCS8qIGZpbGwgd2luZG93IHdpdGggbW9yZSBzZWdtZW50cyAqLworCQkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJfSBlbHNlIHsKKwkJCQkvKiBlbmQgdGhlIHRyYW5zZmVyICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9FTkRBQ0s7CisJCQkJcmMgPSBzd19sb2FkX2VuZChzdyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfQUJPUlQsIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX0VOREFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQkJc3dfY2xvc2VfZmlsZShzdyk7CisJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgKEJUUyAldSlcbiIsCisJCQkJc3ctPmJ0cy0+bnIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCIKKwkJCQkJIkVuZCBOQUNLXG4iKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX0FDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9FTkRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX1dBSVRfQUNUQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCQkvKiB3ZSdyZSBkb25lICovCisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgRE9ORSFcbiIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCXJjID0gMDsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9BQ1RJVkFURV9TV19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJCURFQlVHUChETk0sICJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgU1dfU1RBVEVfTk9ORToKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9FUlJPUjoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjKQorCQlERUJVR1AoRE5NLCAidW5leHBlY3RlZCBOTSBNVCAweCUwMnggaW4gc3RhdGUgJXUgLT4gJXVcbiIsCisJCQlmb2gtPm1zZ190eXBlLCBvbGRfc3RhdGUsIHN3LT5zdGF0ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIExvYWQgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19CQVNFQl9UUkFOU0M7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweDAwOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHgwMDsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX1VOS05PV046CisJZGVmYXVsdDoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiU29mdHdhcmUgTG9hZCBub3QgcHJvcGVybHkgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisJc3ctPndpbmRvd19zaXplID0gd2luX3NpemU7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9JTklUQUNLOworCXN3LT5jYmZuID0gY2JmbjsKKwlzdy0+Y2JfZGF0YSA9IGNiX2RhdGE7CisJc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXJjID0gc3dfb3Blbl9maWxlKHN3LCBmbmFtZSk7CisJaWYgKHJjIDwgMCkgeworCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHN3X2xvYWRfaW5pdChzdyk7Cit9CisKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IHJjLCBwZXJjZW50OworCisJcmMgPSBmc3RhdChzdy0+ZmQsICZzdCk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVSUk9SIGR1cmluZyBzdGF0Iik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoc3ctPnN0cmVhbSkKKwkJcGVyY2VudCA9IChmdGVsbChzdy0+c3RyZWFtKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCWVsc2UKKwkJcGVyY2VudCA9IChsc2Vlayhzdy0+ZmQsIDAsIFNFRUtfQ1VSKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCXJldHVybiBwZXJjZW50OworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworaW50IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgICAgICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiQWN0aXZhdGluZyBTb2Z0d2FyZSAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisJc3ctPm9ial9jbGFzcyA9IE5NX09DX1NJVEVfTUFOQUdFUjsKKwlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0FDVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCisJLyogT3BlbiB0aGUgZmlsZSBpbiBvcmRlciB0byBmaWxsIHNvbWUgc3cgc3RydWN0IG1lbWJlcnMgKi8KKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKwlzd19jbG9zZV9maWxlKHN3KTsKKworCXJldHVybiBzd19hY3RpdmF0ZShzdyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbm1fY2hhbm5lbChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaCwgdV9pbnQ4X3QgYnRzX3BvcnQsCisJCSAgICAgICB1X2ludDhfdCB0c19uciwgdV9pbnQ4X3Qgc3Vic2xvdF9ucikKK3sKKwljaC0+YXR0cmliID0gTk1fQVRUX0FCSVNfQ0hBTk5FTDsKKwljaC0+YnRzX3BvcnQgPSBidHNfcG9ydDsKKwljaC0+dGltZXNsb3QgPSB0c19ucjsKKwljaC0+c3Vic2xvdCA9IHN1YnNsb3RfbnI7CQorfQorCitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXVfaW50OF90IGxlbiA9IHNpemVvZigqY2gpICsgMjsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9FU1RBQkxJU0hfVEVJLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJYnRzLT5idHNfbnIsIHRyeF9uciwgMHhmZik7CisJCisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBjb25uZWN0IHNpZ25hbGxpbmcgb2Ygb25lIChCVFMsVFJYKSB0byBhIHBhcnRpY3VsYXIgdGltZXNsb3Qgb24gdGhlIEUxICovCitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1NJR04sCisJCQlOTV9PQ19SQURJT19DQVJSSUVSLCBidHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisjaWYgMAoraW50IGFiaXNfbm1fZGlzY190ZXJyX3NpZ24oc3RydWN0IGFiaXNfbm1faCAqaCwgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYWJpc19ubV9hYmlzX2NoYW5uZWwgKmNoYW4pCit7Cit9CisjZW5kaWYKKworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIHNpemVvZigqY2gpLCBOTV9NVF9DT05OX1RFUlJfVFJBRiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBURVJSIFRSQUYgVW09JXMgRTE9KCV1LCV1LCV1KVxuIiwKKwkJZ3NtX3RzX25hbWUodHMpLAorCQllMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl90cmFmKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuLAorCQkJICAgdV9pbnQ4X3Qgc3ViY2hhbikKK3sKK30KKyNlbmRpZgorCisvKiBDaGFwdGVyIDguNi4xICovCitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgQlRTIEF0dHIgKGJ0cz0lZClcbiIsIGJ0cy0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9CVFNfQVRUUiwgTk1fT0NfQlRTLCBidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC42LjIgKi8KK2ludCBhYmlzX25tX3NldF9yYWRpb19hdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJREVCVUdQKEROTSwgIlNldCBUUlggQXR0ciAoYnRzPSVkLHRyeD0lZClcbiIsIHRyeC0+YnRzLT5uciwgdHJ4LT5ucik7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfU0VUX1JBRElPX0FUVFIsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaGFuX2NvbWIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKQoreworCWludCBpOworCisJLyogQXMgaXQgdHVybnMgb3V0LCB0aGUgQlMtMTEgaGFzIHNvbWUgdmVyeSBwZWN1bGlhciByZXN0cmljdGlvbnMKKwkgKiBvbiB0aGUgY2hhbm5lbCBjb21iaW5hdGlvbnMgaXQgYWxsb3dzICovCisJc3dpdGNoICh0cy0+dHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjI6CisJCQkvKiBub3Qgc3VwcG9ydGVkICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCS8qIG9ubHkgb25lIFNEQ0NILzggcGVyIFRSWCAqLworCQkJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHMtPm5yKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAodHMtPnRyeC0+dHNbaV0ubm1fY2hhbl9jb21iID09CisJCQkJICAgIE5NX0NIQU5DX1NEQ0NIKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIG5vdCBhbGxvd2VkIGZvciBUUzAgb2YgQkNDSC1UUlggKi8KKwkJCWlmICh0cy0+dHJ4ID09IHRzLT50cngtPmJ0cy0+YzAgJiYKKwkJCSAgICB0cy0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBub3Qgb24gdGhlIHNhbWUgVFJYIHRoYXQgaGFzIGEgQkNDSCtTRENDSDQKKwkJCSAqIGNvbWJpbmF0aW9uICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgKHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA1IHx8CisJCQkgICAgIHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA4KSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMwIG9mIEMwICovCisJCQlpZiAodHMtPnRyeCAhPSB0cy0+dHJ4LT5idHMtPmMwIHx8CisJCQkgICAgdHMtPm5yICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJLyogYWxsb3dlZCBvbmx5IGZvciBUUyAyLzQvNiBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh0cy0+bnIgIT0gMiAmJiB0cy0+bnIgIT0gNCAmJgorCQkJICAgIHRzLT5uciAhPSA2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgODogLyogdGhpcyBpcyBub3QgbGlrZSAwOC41OCwgYnV0IGluIGZhY3QKKwkJCSAqIEZDQ0grU0NIK0JDQ0grQ0NDSCtTRENDSC80K1NBQ0NIL0M0K0NCQ0ggKi8KKwkJCS8qIEZJWE1FOiBvbmx5IG9uZSBDQkNIIGFsbG93ZWQgcGVyIGNlbGwgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3aXRjaCAodHMtPm5yKSB7CisJCWNhc2UgMDoKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJLyogb25seSBvbiBUUlgwICovCisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0hDb21iOgorCQkJCQlyZXR1cm4gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIX0NCQ0g6CisJCQkJCWlmICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0KKwkJCQkJICAgIE5NX0NIQU5DX21haW5CQ0NIKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19QRENIOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSDoKKwkJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gQlRTIHR5cGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNi4zICovCitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJdV9pbnQxNl90IGFyZmNuID0gaHRvbnModHMtPnRyeC0+YXJmY24pOworCXVfaW50OF90IHplcm8gPSAweDAwOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMiArIDI7CisKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQlsZW4gKz0gNCArIDIgKyAyICsgMzsKKworCURFQlVHUChETk0sICJTZXQgQ2hhbiBBdHRyICVzXG4iLCBnc21fdHNfbmFtZSh0cykpOworCWlmICh2ZXJpZnlfY2hhbl9jb21iKHRzLCBjaGFuX2NvbWIpIDwgMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJREVCVUdQKEROTSwgIkludmFsaWQgQ2hhbm5lbCBDb21iaW5hdGlvbiEhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0cy0+bm1fY2hhbl9jb21iID0gY2hhbl9jb21iOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9TRVRfQ0hBTl9BVFRSLAorCQkJTk1fT0NfQ0hBTk5FTCwgYnRzLT5idHNfbnIsCisJCQl0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKwkvKiBGSVhNRTogZG9uJ3Qgc2VuZCBBUkZDTiBsaXN0LCBob3BwaW5nIHNlcXVlbmNlLCBtQUlPLCAuLi4qLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2MTZfcHV0KG1zZywgTk1fQVRUX0FSRkNOX0xJU1QsIDEsICZhcmZjbik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQ0hBTl9DT01CLCBjaGFuX2NvbWIpOworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpIHsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfSFNOLCAweDAwKTsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTUFJTywgMHgwMCk7CisJfQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RTQywgYnRzLT50c2MpOwkvKiB0cmFpbmluZyBzZXF1ZW5jZSAqLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2X3B1dChtc2csIDB4NTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBtc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9BQ0s7CisJdV9pbnQ4X3QgbGVuID0gYXR0X2xlbjsKKworCWlmIChuYWNrKSB7CisJCWxlbiArPSAyOworCQltc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9OQUNLOworCX0KKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dF9sZW4sIG1zZ3R5cGUsIG9ial9jbGFzcywgaTEsIGkyLCBpMyk7CisKKwlpZiAoYXR0cikgeworCQl1X2ludDhfdCAqcHRyID0gbXNnYl9wdXQobXNnLCBhdHRfbGVuKTsKKwkJbWVtY3B5KHB0ciwgYXR0ciwgYXR0X2xlbik7CisJfQorCWlmIChuYWNrKQorCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9OQUNLX0NBVVNFUywgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICpyYXdtc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50OF90ICpkYXRhOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpvaCkpOworCWZpbGxfb21faGRyKG9oLCBsZW4pOworCWRhdGEgPSBtc2diX3B1dChtc2csIGxlbik7CisJbWVtY3B5KGRhdGEsIHJhd21zZywgbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTaWVtZW5zIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgaW50IF9fc2ltcGxlX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBtc2dfdHlwZSwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjkuMiAqLworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfT1BTVEFSVCwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCWRlYnVncF9mb2goKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgb2gtPmRhdGEpOworCURFQlVHUEMoRE5NLCAiU2VuZGluZyBPUFNUQVJUXG4iKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguOC41ICovCitpbnQgYWJpc19ubV9jaGdfYWRtX3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsCisJCQkgIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMiwgZW51bSBhYmlzX25tX2FkbV9zdGF0ZSBhZG1fc3RhdGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMiwgTk1fTVRfQ0hHX0FETV9TVEFURSwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BRE1fU1RBVEUsIGFkbV9zdGF0ZSk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmF0dHI7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBNRFJPUCBMSU5LIEUxPSgldSwldSkgLT4gRTE9KCV1LCAldSlcbiIsCisJCWUxX3BvcnQwLCB0czAsIGUxX3BvcnQxLCB0czEpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgNiwgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweDAwLCAweDAwLCAweDAwKTsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTElOSzsKKwlhdHRyWzFdID0gZTFfcG9ydDA7CisJYXR0clsyXSA9IHRzMDsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTkVYVDsKKwlhdHRyWzFdID0gZTFfcG9ydDE7CisJYXR0clsyXSA9IHRzMTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNy4xICovCitpbnQgYWJpc19ubV9wZXJmb3JtX3Rlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJIHVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCB0ZXN0X25yLCB1X2ludDhfdCBhdXRvbl9yZXBvcnQsCisJCQkgdV9pbnQ4X3QgKnBoeXNfY29uZmlnLCB1X2ludDE2X3QgcGh5c19jb25maWdfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlpbnQgbGVuID0gNDsgLyogMiBUViBhdHRyaWJ1dGVzICovCisKKwlERUJVR1AoRE5NLCAiUEVGT1JNIFRFU1RcbiIpOworCQorCWlmIChwaHlzX2NvbmZpZ19sZW4pCisJCWxlbiArPSAzICsgcGh5c19jb25maWdfbGVuOworCQorCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfUEVSRl9URVNULAorCQkJb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFU1RfTk8sIHRlc3RfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0FVVE9OX1JFUE9SVCwgYXV0b25fcmVwb3J0KTsKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9QSFlTX0NPTkYsIHBoeXNfY29uZmlnX2xlbiwKKwkJCQlwaHlzX2NvbmZpZyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJaWYgKG9uID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9TVE9QX0VWRU5UX1JFUCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfUkVTVF9FVkVOVF9SRVApOworfQorCisvKiBTaWVtZW5zIChvciBCUy0xMSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKworaW50IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVjb25uZWN0KQoreworCWlmIChyZWNvbm5lY3QgPT0gMCkKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfRElTQ09OTkVDVCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRUNPTk5FQ1QpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNUQVJUKTsKK30KKworCitzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgeworCXVfaW50MTZfdAl5ZWFyOworCXVfaW50OF90CW1vbnRoOworCXVfaW50OF90CWRheTsKKwl1X2ludDhfdAlob3VyOworCXVfaW50OF90CW1pbjsKKwl1X2ludDhfdAlzZWM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3ZvaWQgZ2V0X2JzMTFfZGF0ZV90aW1lKHN0cnVjdCBiczExX2RhdGVfdGltZSAqYWV0KQoreworCXRpbWVfdCB0OworCXN0cnVjdCB0bSAqdG07CisKKwl0ID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmdCk7CisJYWV0LT5zZWMgPSB0bS0+dG1fc2VjOworCWFldC0+bWluID0gdG0tPnRtX21pbjsKKwlhZXQtPmhvdXIgPSB0bS0+dG1faG91cjsKKwlhZXQtPmRheSA9IHRtLT50bV9tZGF5OworCWFldC0+bW9udGggPSB0bS0+dG1fbW9uOworCWFldC0+eWVhciA9IGh0b25zKDE5MDAgKyB0bS0+dG1feWVhcik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbikKK3sKKwlpZiAoYmVnaW4pCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0JFR0lOX0RCX1RYKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0VORF9EQl9UWCk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4LAorCQkJCXVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0RFTEVURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgemVybyA9IDB4MDA7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExX0VOVkFCVFNFLCAwLCBpZHgsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIDB4OTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgc21fYXR0cltdID0geyBOTV9BVFRfVEVJLCBOTV9BVFRfQUJJU19DSEFOTkVMIH07CitpbnQgYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2Yoc21fYXR0ciksIE5NX01UX0dFVF9BVFRSLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHNtX2F0dHIpLCBzbV9hdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBsaWtlIGFiaXNfbm1fY29ubl90ZXJyX3RyYWYgKyBzZXRfdGVpICovCitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LCAKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSsyLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweGZmLCAweGZmLCAweGZmKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9UWFBXUiwgMSwgJmxldmVsKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgYXR0ciA9IE5NX0FUVF9CUzExX1RYUFdSOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYXR0ciksIE5NX01UX0dFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfUEEsIDB4MDAsIHRyeC0+bnIpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksICZhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfUExMX01PREUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSwKKwkJCSAgICBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0NDTEssIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksIGF0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7CisKK30KKworLy9zdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnMxMV9sb2dvbl9jN1tdID0geyAweDA3LCAweGQ5LCAweDAxLCAweDExLCAweDBkLCAweDEwLCAweDIwIH07CisKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJcmV0dXJuIGFiaXNfbm1fYnMxMV9sb2dvbihidHMsIDB4MDIsICJGQUNUT1JZIiwgb24pOworfQorCitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAzLCAiRklFTEQgICIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYmR0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZiZHQpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWlmIChvbikgeworCQl1X2ludDhfdCBsZW4gPSAzKjIgKyBzaXplb2YoYmR0KQorCQkJCSsgMSArIHN0cmxlbihuYW1lKTsKKwkJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0JTMTFfTE1UX0xPR09OLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FLAorCQkJICAgICBzaXplb2YoYmR0KSwgKHVfaW50OF90ICopICZiZHQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWLAorCQkJICAgICAxLCAmbGV2ZWwpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCQkJICAgICBzdHJsZW4obmFtZSksICh1X2ludDhfdCAqKW5hbWUpOworCX0gZWxzZSB7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJfQorCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmIChzdHJsZW4ocGFzc3dvcmQpICE9IDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIAltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzdHJsZW4ocGFzc3dvcmQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLCAoY29uc3QgdV9pbnQ4X3QgKilwYXNzd29yZCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY2hhbmdlIHRoZSBCUy0xMSBQTEwgTW9kZSB0byBlaXRoZXIgbG9ja2VkIChFMSBkZXJpdmVkKSBvciBzdGFuZGFsb25lICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZTsKKwkKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKworCWlmIChsb2NrZWQpCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX0xPQ0tFRDsKKwllbHNlCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX1NUQU5EQUxPTkU7CisJCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMX01PREUsIDEsICZ0bHZfdmFsdWUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTZXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlIG9mIHRoZSBQTEwgKHdvcmsgdmFsdWUvc2V0IHZhbHVlKQorICogSXQgZGVwZW5kcyBvbiB0aGUgbG9naW4gd2hpY2ggb25lIGlzIGNoYW5nZWQgKi8KK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZVsyXTsKKworCW1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisKKwl0bHZfdmFsdWVbMF0gPSB2YWx1ZT4+ODsKKwl0bHZfdmFsdWVbMV0gPSB2YWx1ZSYweGZmOworCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMLCAyLCB0bHZfdmFsdWUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfR0VUX1NUQVRFKTsKK30KKworLyogQlMxMSBTV0wgKi8KKwordm9pZCAqdGFsbF9mbGVfY3R4OworCitzdHJ1Y3QgYWJpc19ubV9iczExX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWNoYXIgc3dsX2ZuYW1lW1BBVEhfTUFYXTsKKwl1X2ludDhfdCB3aW5fc2l6ZTsKKwlpbnQgZm9yY2VkOworCXN0cnVjdCBsbGlzdF9oZWFkIGZpbGVfbGlzdDsKKwlnc21fY2JmbiAqdXNlcl9jYjsJLyogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCit9Oworc3RhdGljIHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgX2dfYnMxMV9zdywgKmdfYnMxMV9zdyA9ICZfZ19iczExX3N3OworCitzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIGludCBiczExX3JlYWRfc3dsX2ZpbGUoc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdykKK3sKKwljaGFyIGxpbmVidWZbMjU1XTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGgsICpsaDI7CisJRklMRSAqc3dsOworCWludCByYyA9IDA7CisKKwlzd2wgPSBmb3BlbihiczExX3N3LT5zd2xfZm5hbWUsICJyIik7CisJaWYgKCFzd2wpCisJCXJldHVybiAtRU5PREVWOworCisJLyogemVybyB0aGUgc3RhbGUgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKwlsbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaDIsICZiczExX3N3LT5maWxlX2xpc3QpIHsKKwkJbGxpc3RfZGVsKGxoKTsKKwkJdGFsbG9jX2ZyZWUobGgpOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHN3bCkpIHsKKwkJY2hhciBmaWxlX2lkWzEyKzFdOworCQljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwkJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCQlzdGF0aWMgY2hhciBkaXJbUEFUSF9NQVhdOworCisJCWlmIChzdHJsZW4obGluZWJ1ZikgPCA0KQorCQkJY29udGludWU7CisJCisJCXJjID0gc3NjYW5mKGxpbmVidWYrNCwgIiUxMnM6JTgwc1xyXG4iLCBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUiBwYXJzaW5nIFNXTCBmaWxlIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMgPCAyKQorCQkJY29udGludWU7CisKKwkJZmxlID0gdGFsbG9jX3plcm8odGFsbF9mbGVfY3R4LCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5KTsKKwkJaWYgKCFmbGUpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogY29uc3RydWN0IG5ldyBmaWxlbmFtZSAqLworCQlzdHJuY3B5KGRpciwgYnMxMV9zdy0+c3dsX2ZuYW1lLCBzaXplb2YoZGlyKSk7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZGlybmFtZShkaXIpLCBzaXplb2YoZmxlLT5mbmFtZSkgLSAxKTsKKwkJc3RyY2F0KGZsZS0+Zm5hbWUsICIvIik7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZmlsZV9pZCwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSAtc3RybGVuKGZsZS0+Zm5hbWUpKTsKKwkJCisJCWxsaXN0X2FkZF90YWlsKCZmbGUtPmxpc3QsICZiczExX3N3LT5maWxlX2xpc3QpOworCX0KKworb3V0OgorCWZjbG9zZShzd2wpOworCXJldHVybiByYzsKK30KKworLyogYnMxMSBzd2xvYWQgc3BlY2lmaWMgY2FsbGJhY2ssIHBhc3NlZCB0byBhYmlzX25tIGNvcmUgc3dsb2FkICovCitzdGF0aWMgaW50IGJzMTFfc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZGF0YTsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwkJaWYgKGZsZSkgeworCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIGZsZS0+Zm5hbWUsCisJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKKwkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKKwkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwkJCXRhbGxvY19mcmVlKGZsZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhY3RpdmF0ZSB0aGUgU1dMICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoYnMxMV9zdy0+YnRzLAorCQkJCQkJCWJzMTFfc3ctPnN3bF9mbmFtZSwKKwkJCQkJCQliczExX3N3bG9hZF9jYmZuLAorCQkJCQkJCWJzMTFfc3cpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJZGVmYXVsdDoKKwkJLyogZmFsbHRocm91Z2ggdG8gdGhlIHVzZXIgY2FsbGJhY2sgKi8KKwkJaWYgKGJzMTFfc3ctPnVzZXJfY2IpCisJCQlyYyA9IGJzMTFfc3ctPnVzZXJfY2IoaG9vaywgZXZlbnQsIG1zZywgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogU2llbWVucyBwcm92aWRlcyBhIFNXTCBmaWxlIHRoYXQgaXMgYSBtZXJlIGxpc3Rpbmcgb2YgYWxsIHRoZSBvdGhlcgorICogZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBhIHNvZnR3YXJlIHJlbGVhc2UuICBXZSBuZWVkIHRvIHVwbG9hZCBmaXJzdAorICogdGhlIGxpc3QgZmlsZSwgYW5kIHRoZW4gZWFjaCBmaWxlIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBsaXN0IGZpbGUgKi8KK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2JmbikKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZ19iczExX3N3OworCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwlpbnQgcmMgPSAwOworCisJSU5JVF9MTElTVF9IRUFEKCZiczExX3N3LT5maWxlX2xpc3QpOworCWJzMTFfc3ctPmJ0cyA9IGJ0czsKKwliczExX3N3LT53aW5fc2l6ZSA9IHdpbl9zaXplOworCWJzMTFfc3ctPnVzZXJfY2IgPSBjYmZuOworCWJzMTFfc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXN0cm5jcHkoYnMxMV9zdy0+c3dsX2ZuYW1lLCBmbmFtZSwgc2l6ZW9mKGJzMTFfc3ctPnN3bF9mbmFtZSkpOworCXJjID0gYnMxMV9yZWFkX3N3bF9maWxlKGJzMTFfc3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGRlcXVldWUgbmV4dCBpdGVtIGluIGZpbGUgbGlzdCAqLworCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJaWYgKCFmbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCQkJCSAgIGJzMTFfc3dsb2FkX2NiZm4sIGJzMTFfc3cpOworCXRhbGxvY19mcmVlKGZsZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c2VbXSA9IHsKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCisJMHhhZiwgTk1fQVRUX0JTMTFfUlhfT0ZGU0VULCBOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQsIE5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZLAorCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQgfTsKKworc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c21bXSA9IHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMLCBOTV9BVFRfVEVJLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4Y2UsIE5NX0FUVF9GSUxFX0lELAorCU5NX0FUVF9GSUxFX1ZFUlNJT04sIE5NX0FUVF9PUEVSX1NUQVRFLCAweGU4LCBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAorCU5NX0FUVF9TV19ERVNDUiwgTk1fQVRUX0dFVF9BUkkgfTsKKyNlbmRpZgorCQorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyW10gPSB7IAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4YTgsIE5NX0FUVF9PUEVSX1NUQVRFLAorCTB4ZDUsIDB4YTEsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywKKwkweDQyLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwgTk1fQVRUX0JTMTFfUExMIH07CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHJlcV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQkweDAzLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHJlcV9hdHRyKSwgcmVxX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGFldCksIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIHNpemVvZihhZXQpLCAodV9pbnQ4X3QgKikgJmFldCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfQlBPUlQsCisJCQlicG9ydCwgMHhmZiwgMHgwMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MSU5FX0NGRywgbGluZV9jZmcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgY29uc3QgY2hhciBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisKKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgaWRzdHJsZW4gPSBvaC0+ZGF0YVswXTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHNpZ25hbDsKKworCWlmIChzdHJuY21wKChjaGFyICopJm9oLT5kYXRhWzFdLCBpcGFjY2Vzc19tYWdpYywgaWRzdHJsZW4pKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiaWQgc3RyaW5nIGlzIG5vdCBjb20uaXBhY2Nlc3MgIT8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgKG9oLT5kYXRhICsgMSArIGlkc3RybGVuKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1zZy0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJJUEFDQ0VTUygweCUwMngpOiAiLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLOgorCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQorCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAorCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKSAKKwkJCQkJVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpCisJCQlERUJVR1BDKEROTSwgIlBPUlQ9JXUgIiwKKwkJCQludG9ocygqKCh1X2ludDE2X3QgKikgCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQorCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCisJCQkJCSpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKTsKKwkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUlNMIENPTk5FQ1QgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIlNFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJHRVQgTlZBVFRSIEFDS1xuIik7CisJCS8qIEZJWE1FOiBkZWNvZGUgYW5kIHNob3cgdGhlIGFjdHVhbCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJHRVQgTlZBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgQVRUUiBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzaWduYWwgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX05BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZW5kIGFuIGlwLWFjY2VzcyBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgbWVzc2FnZSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90ICpkYXRhOworCisJLyogY29uc3RydWN0IHRoZSAxMi4yMSBPTSBoZWFkZXIsIG9ic2VydmUgdGhlIGVycm9uZW91cyBsZW5ndGggKi8KKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIHNpemVvZigqZm9oKSArIGF0dHJfbGVuKTsKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX01BTlVGOworCisJLyogYWRkIHRoZSBpcC5hY2Nlc3MgbWFnaWMgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKzEpOworCSpkYXRhKysgPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpOworCW1lbWNweShkYXRhLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSk7CisKKwkvKiBmaWxsIHRoZSAxMi4yMSBGT00gaGVhZGVyICovCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7CisKKwlpZiAoYXR0ciAmJiBhdHRyX2xlbikgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJCW1lbWNweShkYXRhLCBhdHRyLCBhdHRyX2xlbik7CisJfQorCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIHNldCBzb21lIGF0dHJpYnV0ZXMgaW4gTlZSQU0gKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgMCwgdHJ4LT5uciwgMHhmZiwgYXR0ciwKKwkJCQkgICAgYXR0cl9sZW4pOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULCAwLCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVAsIDAsIDAsIDAsIDAgfTsKKworCWludCBhdHRyX2xlbiA9IHNpemVvZihhdHRyKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlhdHRyWzFdID0gc3RyZWFtOworCWF0dHJbM10gPSBwb3J0ID4+IDg7CisJYXR0cls0XSA9IHBvcnQgJiAweGZmOworCSoodV9pbnQzMl90ICopKGF0dHIrNikgPSBpYS5zX2FkZHI7CisKKwkvKiBpZiBpcCA9PSAwLCB3ZSB1c2UgdGhlIGRlZmF1bHQgSVAgKi8KKwlpZiAoaXAgPT0gMCkKKwkJYXR0cl9sZW4gLT0gNTsKKworCURFQlVHUChETk0sICJpcC5hY2Nlc3MgUlNMIENPTk5FQ1QgSVA9JXMgUE9SVD0ldSBTVFJFQU09MHglMDJ4XG4iLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBzdHJlYW0pOworCisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwKKwkJCQkgICAgTk1fT0NfQkFTRUJfVFJBTlNDLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCSAgICB0cngtPm5yLCAweGZmLCBhdHRyLCBhdHRyX2xlbik7Cit9CisKKy8qIHJlc3RhcnQgLyByZWJvb3QgYW4gaXAuYWNjZXNzIG5hbm9CVFMgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfSVBBQ0NfUkVTVEFSVCk7Cit9CisKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKQoreworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyhidHMsIE5NX01UX0lQQUNDX1NFVF9BVFRSLAorCQkJCSAgICBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19uciwKKwkJCQkgICAgIGF0dHIsIGF0dHJfbGVuKTsKK30KKwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHdlIHNpbXBseSByZXVzZSB0aGUgR1NNNDggZnVuY3Rpb24gYW5kIG92ZXJ3cml0ZSB0aGUgUkFDCisJICogd2l0aCB0aGUgQ2VsbCBJRCAqLworCWdzbTQ4X3JhX2lkX2J5X2J0cyhidWYsIGJ0cyk7CisJKigodV9pbnQxNl90ICopKGJ1ZiArIDUpKSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7Cit9CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKQoreworCWludCBuZXdfc3RhdGUgPSBsb2NrZWQgPyBOTV9TVEFURV9MT0NLRUQgOiBOTV9TVEFURV9VTkxPQ0tFRDsKKworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGU7CisJaWYgKCF0cngtPmJ0cyB8fCAhdHJ4LT5idHMtPm9tbF9saW5rKQorCQlyZXR1cm47CisKKwlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJICAgICAgbmV3X3N0YXRlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZXNbXSA9IHsKKwlbTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTXQk9ICJTVUNDRVNTIiwKKwlbTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUXQk9ICJUSU1FT1VUIiwKKwlbTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOU10JPSAiTk8gQ0hBTk5FTFMiLAorCVtOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUxdCT0gIlBBUlRJQUwiLAorCVtOTV9JUEFDQ19URVNUUkVTX1NUT1BQRURdCT0gIlNUT1BQRUQiLAorfTsKKworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcykKK3sKKwlpZiAocmVzIDwgQVJSQVlfU0laRShpcGFjY190ZXN0cmVzX25hbWVzKSAmJgorCSAgICBpcGFjY190ZXN0cmVzX25hbWVzW3Jlc10pCisJCXJldHVybiBpcGFjY190ZXN0cmVzX25hbWVzW3Jlc107CisKKwlyZXR1cm4gInVua25vd24iOworfQorCit2b2lkIGlwYWNfcGFyc2VfY2dpKHN0cnVjdCBjZWxsX2dsb2JhbF9pZCAqY2lkLCBjb25zdCB1X2ludDhfdCAqYnVmKQoreworCWNpZC0+bWNjID0gKGJ1ZlswXSAmIDB4ZikgKiAxMDA7CisJY2lkLT5tY2MgKz0gKGJ1ZlswXSA+PiA0KSAqICAxMDsKKwljaWQtPm1jYyArPSAoYnVmWzFdICYgMHhmKSAqICAxOworCisJaWYgKGJ1ZlsxXSA+PiA0ID09IDB4ZikgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTsKKwl9IGVsc2UgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTAwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzFdID4+IDQpICogICAxOworCX0KKworCWNpZC0+bGFjID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1ZlszXSkpOworCWNpZC0+Y2kgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzVdKSk7Cit9CisKKy8qIHBhcnNlIEJDQ0ggaW5mb3JtYXRpb24gSUVJIGZyb20gd2lyZSBmb3JtYXQgdG8gc3RydWN0IGlwYWNfYmNjaF9pbmZvICovCitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKQoreworCXVfaW50OF90ICpjdXIgPSBidWY7CisJdV9pbnQxNl90IGxlbjsKKworCW1lbXNldChiaW5mLCAwLCBzaXplb2YoYmluZikpOworCisJaWYgKGN1clswXSAhPSBOTV9JUEFDX0VJRV9CQ0NIX0lORk8pCisJCXJldHVybiAtRUlOVkFMOworCWN1cisrOworCisJbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJYmluZi0+aW5mb190eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX3F1YWwgPSAqY3VyID4+IDI7CisKKwliaW5mLT5hcmZjbiA9ICpjdXIrKyAmIDMgPDwgODsKKwliaW5mLT5hcmZjbiB8PSAqY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYTEVWKQorCQliaW5mLT5yeF9sZXYgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhRVUFMKQorCQliaW5mLT5yeF9xdWFsID0gKmN1ciAmIDB4NzsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9lcnIgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfb2Zmc2V0ID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX25yX29mZnNldCA9IG50b2hsKCoodV9pbnQzMl90ICopY3VyKTsKKwljdXIgKz0gNDsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfQlNJQykKKwkJYmluZi0+YnNpYyA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaXBhY19wYXJzZV9jZ2koJmJpbmYtPmNnaSwgY3VyKTsKKwljdXIgKz0gNzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMiwgY3VyLCBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMik7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJiaXMpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyYmlzLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcyk7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kydGVyLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU2NGNmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpAQCAtMCwwICsxLDE2ODggQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KKworI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBSU0xfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgTUFYKGEsIGIpIChhKSA+PSAoYikgPyAoYSkgOiAoYikKKworc3RhdGljIHVfaW50OF90IG1kaXNjX2J5X21zZ3R5cGUodV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJLyogbWFzayBvZmYgdGhlIHRyYW5zcGFyZW50IGJpdCA/ICovCisJbXNnX3R5cGUgJj0gMHhmZTsKKworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDAwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfUkxMOworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDEwKSB7CisJCWlmIChtc2dfdHlwZSA+PSAweDE5ICYmIG1zZ190eXBlIDw9IDB4MjIpCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfVFJYOworCQllbHNlCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfQ09NX0NIQU47CisJfQorCWlmICgobXNnX3R5cGUgJiAweGUwKSA9PSAweDIwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJCisJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0xPQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGNoYW5faGRyKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoLAorCQkJCSAgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJZGgtPmMubXNnX2Rpc2NyID0gbWRpc2NfYnlfbXNndHlwZShtc2dfdHlwZSk7CisJZGgtPmMubXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlkaC0+aWVfY2hhbiA9IFJTTF9JRV9DSEFOX05SOworfQorCisvKiBkZXRlcm1pbmUgbG9naWNhbCBjaGFubmVsIGJhc2VkIG9uIFRSWCBhbmQgY2hhbm5lbCBudW1iZXIgSUUgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2xvb2t1cChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9ucikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCB0c19uciA9IGNoYW5fbnIgJiAweDA3OworCXVfaW50OF90IGNiaXRzID0gY2hhbl9uciA+PiAzOworCXVfaW50OF90IGxjaF9pZHg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCWlmIChjYml0cyA9PSAweDAxKSB7CisJCWxjaF9pZHggPSAwOwkvKiBUQ0gvRiAqLwkKKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0YgJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fUERDSCAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfRl9QRENIKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFlKSA9PSAweDAyKSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MTsJLyogVENIL0ggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0gpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MWMpID09IDB4MDQpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHgzOwkvKiBTRENDSC80ICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDE4KSA9PSAweDA4KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4NzsJLyogU0RDQ0gvOCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QykKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoY2JpdHMgPT0gMHgxMCB8fCBjYml0cyA9PSAweDExIHx8IGNiaXRzID09IDB4MTIpIHsKKwkJbGNoX2lkeCA9IDA7CisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBub3QgcmV0dXJuIGZpcnN0IHNkY2NoNCAhISEgKi8KKwl9IGVsc2UgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bmtub3duIGNoYW5fbnI9MHglMDJ4XG4iLCBjaGFuX25yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaF9pZHhdOworCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKKwlkZWJ1Z19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPnN1YnNjcik7CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIFNlZSBUYWJsZSAxMC41LjI1IG9mIEdTTTA0LjA4ICovCit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisJdV9pbnQ4X3QgY2JpdHMsIGNoYW5fbnI7CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1BEQ0g6CisJY2FzZSBHU01fUENIQU5fVENIX0ZfUERDSDoKKwkJY2JpdHMgPSAweDAxOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJY2JpdHMgPSAweDAyOworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OgorCQljYml0cyA9IDB4MDQ7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCWNiaXRzID0gMHgwODsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCWNiaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCisJY2hhbl9uciA9IChjYml0cyA8PCAzKSB8ICh0cy0+bnIgJiAweDcpOworCisJcmV0dXJuIGNoYW5fbnI7Cit9CisKKy8qIEFzIHBlciBUUyAwMy4wMyBTZWN0aW9uIDIuMiwgdGhlIElNU0kgaGFzICdub3QgbW9yZSB0aGFuIDE1IGRpZ2l0cycgKi8KK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cikKK3sKKwl1X2ludDY0X3QgcmV0OworCisJcmV0ID0gc3RydG91bGwoaW1zaV9zdHIsIE5VTEwsIDEwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRhYmxlIDUgQ2xhdXNlIDcgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKQoreworCWlmICghYnNfY2NjaF9zZGNjaF9jb21iKQorCQlyZXR1cm4gOSAtIGJzX2FnX2Jsa3NfcmVzOworCWVsc2UKKwkJcmV0dXJuIDMgLSBic19hZ19ibGtzX3JlczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9jY2NoX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgdW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcykKK3sKKwlyZXR1cm4gKGltc2kgJSAxMDAwKSAlIChic19jY19jaGFucyAqIG5fcGFnX2Jsb2NrcykgLyBuX3BhZ19ibG9ja3M7Cit9CisKKy8qIENoYXB0ZXIgNi41LjIgb2YgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAlIG5fcGFnX2Jsb2NrczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpyc2xfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKFJTTF9BTExPQ19TSVpFLCBSU0xfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIlJTTCIpOworfQorCisjZGVmaW5lIE1BQ0JMT0NLX1NJWkUJMjMKK3N0YXRpYyB2b2lkIHBhZF9tYWNibG9jayh1X2ludDhfdCAqb3V0LCBjb25zdCB1X2ludDhfdCAqaW4sIGludCBsZW4pCit7CisJbWVtY3B5KG91dCwgaW4sIGxlbik7CisKKwlpZiAobGVuIDwgTUFDQkxPQ0tfU0laRSkKKwkJbWVtc2V0KG91dCtsZW4sIDB4MmIsIE1BQ0JMT0NLX1NJWkUtbGVuKTsKK30KKworLyogQ2hhcHRlciA5LjMuNzogRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBidWlsZF9lbmNyX2luZm8odV9pbnQ4X3QgKm91dCwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJKm91dCsrID0gbGNoYW4tPmVuY3IuYWxnX2lkICYgMHhmZjsKKwlpZiAobGNoYW4tPmVuY3Iua2V5X2xlbikKKwkJbWVtY3B5KG91dCwgbGNoYW4tPmVuY3Iua2V5LCBsY2hhbi0+ZW5jci5rZXlfbGVuKTsKKwlyZXR1cm4gbGNoYW4tPmVuY3Iua2V5X2xlbiArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JzbF9jYXVzZShpbnQgbHZsLCBjb25zdCB1X2ludDhfdCAqY2F1c2VfdiwgdV9pbnQ4X3QgY2F1c2VfbGVuKQoreworCWludCBpOworCisJTE9HUEMoRFJTTCwgbHZsLCAiQ0FVU0U9MHglMDJ4KCVzKSAiLAorCQljYXVzZV92WzBdLCByc2xfZXJyX25hbWUoY2F1c2VfdlswXSkpOworCWZvciAoaSA9IDE7IGkgPCBjYXVzZV9sZW4tMTsgaSsrKSAKKwkJTE9HUEMoRFJTTCwgbHZsLCAiJTAyeCAiLCBjYXVzZV92W2ldKTsKK30KKworLyogU2VuZCBhIEJDQ0hfSU5GTyBtZXNzYWdlIGFzIHBlciBDaGFwdGVyIDguNS4xICovCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YqZGgpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQkNDSF9JTkZPKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX0JDQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TWVNJTkZPX1RZUEUsIHR5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0JDQ0hfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLCAKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJY2ggPSAoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJY2gtPm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1RSWDsKKwljaC0+bXNnX3R5cGUgPSBSU0xfTVRfU0FDQ0hfRklMTDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bDE2dl9wdXQobXNnLCBSU0xfSUVfTDNfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX2JzX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCWRiID0gYWJzKGRiKTsKKwlpZiAoZGIgPiAzMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPmJzX3Bvd2VyID0gZGIvMjsKKwlpZiAoZnBjKQorCQlsY2hhbi0+YnNfcG93ZXIgfD0gMHgxMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQlNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaW50IGN0bF9sdmw7CisKKwljdGxfbHZsID0gbXNfcHdyX2N0bF9sdmwobGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgZGJtKTsKKwlpZiAoY3RsX2x2bCA8IDApCisJCXJldHVybiBjdGxfbHZsOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5tc19wb3dlciA9IGN0bF9sdmw7CisKKwlpZiAoZnBjKQorCQlsY2hhbi0+bXNfcG93ZXIgfD0gMHgyMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTVNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBjaGFubmVsX21vZGVfZnJvbV9sY2hhbihzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY20sCisJCQkJICAgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbWVtc2V0KGNtLCAwLCBzaXplb2YoY20pKTsKKworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdpdGggZGF0YSBjYWxscyA/ICovCisJY20tPmR0eF9kdHUgPSAweDAwOworCisJLyogc2V0IFRDSCBTcGVlY2gvRGF0YSAqLworCWNtLT5zcGRfaW5kID0gbGNoYW4tPnJzbF9jbW9kZTsKKworCWlmIChsY2hhbi0+cnNsX2Ntb2RlID09IFJTTF9DTU9EX1NQRF9TSUdOICYmCisJICAgIGxjaGFuLT50Y2hfbW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZDogcnNsX21vZGUgPT0gc2lnbmFsbGluZywgIgorCQkJImJ1dCB0Y2hfbW9kZSAhPSBzaWduYWxsaW5nXG4iKTsKKworCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfU0RDQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfQm07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfTG07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX05PTkU6CisJY2FzZSBHU01fTENIQU5fVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJY20tPmNoYW5fcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMzsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xNGs1OworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzEyazA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF82azA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4xICovCisjaWYgMAoraW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKCpjaGFuX21vZGUpLAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX21vZGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX2lkZW50KTsKKyNpZiAwCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgMSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmVuY3JfaW5mbyk7CisjZW5kaWYKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgYnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBtc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKyNlbmRpZgorCitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjOworCisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgY2k7CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1lbXNldCgmY2ksIDAsIHNpemVvZihjaSkpOworCWNpLmNoYW5fZGVzYy5pZWkgPSAweDY0OworCWNpLmNoYW5fZGVzYy5jaGFuX25yID0gY2hhbl9ucjsKKwljaS5jaGFuX2Rlc2Mub2N0MyA9IChsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2MgPDwgNSkgfCAoKGFyZmNuICYgMHgzZmYpID4+IDgpOworCWNpLmNoYW5fZGVzYy5vY3Q0ID0gYXJmY24gJiAweGZmOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUGhhc2UgMSAqLworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSAmY2kpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlzd2l0Y2ggKGFjdF90eXBlKSB7CisJY2FzZSBSU0xfQUNUX0lOVEVSX0FTWU5DOgorCWNhc2UgUlNMX0FDVF9JTlRFUl9TWU5DOgorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9IQU5ET19SRUYsIGhvX3JlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBsY2hhbi0+YnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBsY2hhbi0+bXNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1RJTUlOR19BRFZBTkNFLCB0YSk7CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpCisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40Ljk6IE1vZGlmeSBjaGFubmVsIG1vZGUgb24gQlRTIHNpZGUgKi8KK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgY207CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX01PREVfTU9ESUZZX1JFUSk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKGNtKSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNtKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPiBSU0xfRU5DX0FMR19BNSgwKSkgeworCQl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCQlpZiAocmMgPiAwKQorCQkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisJfQorCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCX0KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC42OiBTZW5kIHRoZSBlbmNyeXB0aW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBMMyBpbmZvICovCitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJdV9pbnQ4X3QgbDNfbGVuID0gbXNnLT5sZW47CisJaW50IHJjOworCisJLyogRmlyc3QgcHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5ndGggKi8KKwltc2diX3R2MTZfcHVzaChtc2csIFJTTF9JRV9MM19JTkZPLCBsM19sZW4pOworCisJLyogdGhlbiB0aGUgbGluayBpZGVudGlmaWVyIChTQVBJMCwgbWFpbiBzaWduIGxpbmspICovCisJbXNnYl90dl9wdXNoKG1zZywgUlNMX0lFX0xJTktfSURFTlQsIDApOworCisJLyogdGhlbiBlbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJaWYgKHJjIDw9IDApCisJCXJldHVybiByYzsKKwltc2diX3Rsdl9wdXNoKG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisKKwkvKiBhbmQgZmluYWxseSB0aGUgRENIQU4gaGVhZGVyICovCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9FTkNSX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjUgLyA0LjY6IERlYWN0aXZhdGUgdGhlIFNBQ0NIIGFmdGVyIDA0LjA4IFJSIENIQU4gUkVMRUFTRSAqLworaW50IHJzbF9kZWFjdF9zYWNjaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9ERUFDVElWQVRFX1NBQ0NIKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIERFQUNUaXZhdGUgU0FDQ0ggQ01EXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuMTQgLyA0Ljc6IFRlbGwgQlRTIHRvIHJlbGVhc2UgdGhlIHJhZGlvIGNoYW5uZWwgKi8KK2ludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1JGX0NIQU5fUkVMKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIFJGIENoYW5uZWwgUmVsZWFzZSBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwkvKiBCVFMgd2lsbCByZXNwb25kIGJ5IFJGIENIQU4gUkVMIEFDSyAqLworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9QQUdJTkdfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX1BDSF9BR0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUEFHSU5HX0dST1VQLCBwYWdpbmdfZ3JvdXApOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NU19JREVOVElUWSwgbGVuLTIsIG1zX2lkZW50KzIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTkVFREVELCBjaGFuX25lZWRlZCk7CisKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZCwKKwkJCSAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisjaWYgMAorCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1X2ludDhfdCBwYWdpbmdfZ3JvdXA7CisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworaW50IGltc2lfc3RyMmJjZCh1X2ludDhfdCAqYmNkX291dCwgY29uc3QgY2hhciAqc3RyX2luKQoreworCWludCBpLCBsZW4gPSBzdHJsZW4oc3RyX2luKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbnVtID0gc3RyX2luW2ldIC0gMHgzMDsKKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gOSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGkgJSAyID09IDApCisJCQliY2Rfb3V0W2kvMl0gPSBudW07CisJCWVsc2UKKwkJCWJjZF9vdXRbaS8yXSB8PSAobnVtIDw8IDQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNS42ICovCitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDhfdCBidWZbTUFDQkxPQ0tfU0laRV07CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSU1NRURJQVRFX0FTU0lHTl9DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9JTU1fQVNTX0lORk8sIGxlbiwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgcGhhc2UgMiwgY29uc3RydWN0IGEgRlVMTF9JTU1fQVNTX0lORk8gKi8KKwkJcGFkX21hY2Jsb2NrKGJ1ZiwgdmFsLCBsZW4pOworCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORk8sIE1BQ0JMT0NLX1NJWkUsIGJ1Zik7CisJCWJyZWFrOworCX0KKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgU2llbWVucyBzcGVjaWZpYyBNUyBSRiBQb3dlciBDYXBhYmlsaXR5IEluZGljYXRpb24gKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfU0lFTUVOU19NUlBDSSk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TSUVNRU5TX01SUENJLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJREVCVUdQKERSU0wsICIlcyBUWCBTaWVtZW5zIE1SUENJIDB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKworLyogU2VuZCAiREFUQSBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCWlmIChtc2ctPmxjaGFuID09IE5VTEwpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2Fubm90IHNlbmQgREFUQSBSRVFVRVNUIHRvIHVua25vd24gbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc2xfcmxsX3B1c2hfbDMobXNnLCBSU0xfTVRfREFUQV9SRVEsIGxjaGFuMmNoYW5fbnIobXNnLT5sY2hhbiksCisJCQlsaW5rX2lkLCAxKTsKKworCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgIkVTVEFCTElTSCBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfRVNUX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguMy43IFJlcXVlc3QgdGhlIHJlbGVhc2Ugb2YgbXVsdGlmcmFtZSBtb2RlIG9mIFJMTCBjb25uZWN0aW9uLgorICAgVGhpcyBpcyB3aGF0IGhpZ2hlciBsYXllcnMgc2hvdWxkIGNhbGwuICBUaGUgQlRTIHRoZW4gcmVzcG9uZHMgd2l0aAorICAgUkVMRUFTRSBDT05GSVJNLCB3aGljaCB3ZSBpbiB0dXJuIHVzZSB0byB0cmlnZ2VyIFJTTCBDSEFOTkVMIFJFTEVBU0UsCisgICB3aGljaCBpbiB0dXJuIGlzIGFja25vd2xlZGdlZCBieSBSU0wgQ0hBTk5FTCBSRUxFQVNFIEFDSywgd2hpY2ggY2FsbHMKKyAgIGxjaGFuX2ZyZWUoKSAqLworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gcnNsX3JsbF9zaW1wbGUoUlNMX01UX1JFTF9SRVEsIGxjaGFuMmNoYW5fbnIobGNoYW4pLAorCQkJICAgICBsaW5rX2lkLCAwKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9SRUxFQVNFX01PREUsIDApOwkvKiBub3JtYWwgcmVsZWFzZSAqLworCisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19SRUxfUkVROworCS8qIEZJWE1FOiBzdGFydCBzb21lIHRpbWVyIGluIGNhc2Ugd2UgZG9uJ3QgcmVjZWl2ZSBhIFJFTCBBQ0sgPyAqLworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjI6IENoYW5uZWwgQWN0aXZhdGUgQWNrbm93bGVkZ2UgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisKKwkvKiBCVFMgaGFzIGNvbmZpcm1lZCBjaGFubmVsIGFjdGl2YXRpb24sIHdlIG5vdyBuZWVkCisJICogdG8gYXNzaWduIHRoZSBhY3RpdmF0ZWQgY2hhbm5lbCB0byB0aGUgTVMgKi8KKwlpZiAocnNsaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RfUkVRKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBBQ1QgQUNLLCBidXQgc3RhdGUgJXNcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RJVkU7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fQUNUSVZBVEVfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4zOiBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X25hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENIQU5ORUwgQUNUSVZBVEUgTkFDSyIsCisJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCS8qIEJUUyBoYXMgcmVqZWN0ZWQgY2hhbm5lbCBhY3RpdmF0aW9uID8hPyAqLworCWlmIChkaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNhdXNlID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpOworCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgY2F1c2UsCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKwkJaWYgKCpjYXVzZSAhPSBSU0xfRVJSX1JDSF9BTFJfQUNUVl9BTExPQykKKwkJCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworCX0gZWxzZQorCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKyAKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKKworCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjQ6IENvbm5lY3Rpb24gRmFpbHVyZSBJbmRpY2F0aW9uICovCitzdGF0aWMgaW50IHJzbF9yeF9jb25uX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCS8qIEZJWE1FOiBwcmludCB3aGljaCBjaGFubmVsICovCisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENPTk5FQ1RJT04gRkFJTDogUkVMRUFTSU5HICIsCisJICAgICBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfTk9USUNFLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfTk9USUNFLCAiXG4iKTsKKwkvKiBGSVhNRTogb25seSBmcmVlIGl0IGFmdGVyIGNoYW5uZWwgcmVsZWFzZSBBQ0sgKi8KKwlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXBfdW5pKHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJY29uc3QgY2hhciAqcHJlZml4KQoreworCURFQlVHUEMoRE1FQVMsICJSWEwtRlVMTC0lcz0lM2RkQm0gUlhMLVNVQi0lcz0lM2RkQm0gIiwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5mdWxsLnJ4X2xldiksCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCURFQlVHUEMoRE1FQVMsICJSWFEtRlVMTC0lcz0lZCBSWFEtU1VCLSVzPSVkICIsCisJCXByZWZpeCwgbXJ1LT5mdWxsLnJ4X3F1YWwsIHByZWZpeCwgbXJ1LT5zdWIucnhfcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpOworCisJREVCVUdQKERNRUFTLCAiTUVBU1VSRU1FTlQgUkVTVUxUIE5SPSVkICIsIG1yLT5ucik7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFhkICIpOworCisJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+dWwsICJ1bCIpOworCURFQlVHUEMoRE1FQVMsICJCU19QT1dFUj0lZCAiLCBtci0+YnNfcG93ZXIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQlERUJVR1BDKERNRUFTLCAiTVNfVE89JWQgIiwgbXItPm1zX3RpbWluZ19vZmZzZXQpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpIHsKKwkJREVCVUdQQyhETUVBUywgIkwxX01TX1BXUj0lM2RkQm0gIiwgbXItPm1zX2wxLnB3cik7CisJCURFQlVHUEMoRE1FQVMsICJMMV9GUEM9JXUgIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gMSA6IDApOworCQlERUJVR1BDKERNRUFTLCAiTDFfVEE9JXUgIiwgbXItPm1zX2wxLnRhKTsKKwl9CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFh1ICIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0JBMSkKKwkJREVCVUdQQyhETUVBUywgIkJBMSAiKTsKKwlpZiAoIShtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEKSkKKwkJREVCVUdQQyhETUVBUywgIk5PVCBWQUxJRCAiKTsKKwllbHNlCisJCXByaW50X21lYXNfcmVwX3VuaSgmbXItPmRsLCAiZGwiKTsKKworCURFQlVHUEMoRE1FQVMsICJOVU1fTkVJR0g9JXVcbiIsIG1yLT5udW1fY2VsbCk7CisJaWYgKG1yLT5udW1fY2VsbCA9PSA3KQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCQlERUJVR1AoRE1FQVMsICJJRFg9JXUgQVJGQ049JXUgQlNJQz0ldSA9PiAlZCBkQm1cbiIsCisJCQltcmMtPm5laWdoX2lkeCwgbXJjLT5hcmZjbiwgbXJjLT5ic2ljLCByeGxldjJkYm0obXJjLT5yeGxldikpOworCX0KK30KKworc3RhdGljIGludCByc2xfcnhfbWVhc19yZXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisJdV9pbnQ4X3QgbGVuOworCWNvbnN0IHVfaW50OF90ICp2YWw7CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIGFjdHVhbGx5IGFjdGl2ZSAqLworCS8qIEZJWE1FOiBtYXliZSB0aGlzIGNoZWNrIHNob3VsZCBiZSB3YXkgbW9yZSBnZW5lcmljL2NlbnRyYWxpemVkICovCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUSVZFKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlczogTUVBUyBSRVMgZm9yIGluYWN0aXZlIGNoYW5uZWxcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChtciwgMCwgc2l6ZW9mKCptcikpOworCW1yLT5sY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUikgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9CU19QT1dFUikpCisJCXJldHVybiAtRUlPOworCisJLyogTWFuZGF0b3J5IFBhcnRzICovCisJbXItPm5yID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKTsKKworCWxlbiA9IFRMVlBfTEVOKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJaWYgKGxlbiA+PSAzKSB7CisJCWlmICh2YWxbMF0gJiAweDQwKQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfRFRYOworCQltci0+dWwuZnVsbC5yeF9sZXYgPSB2YWxbMF0gJiAweDNmOworCQltci0+dWwuc3ViLnJ4X2xldiA9IHZhbFsxXSAmIDB4M2Y7CisJCW1yLT51bC5mdWxsLnJ4X3F1YWwgPSB2YWxbMl0+PjMgJiAweDc7CisJCW1yLT51bC5zdWIucnhfcXVhbCA9IHZhbFsyXSAmIDB4NzsKKwl9CisKKwltci0+YnNfcG93ZXIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfQlNfUE9XRVIpOworCisJLyogT3B0aW9uYWwgUGFydHMgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpKQorCQltci0+bXNfdGltaW5nX29mZnNldCA9CisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wxX0lORk8pKSB7CisJCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wxX0lORk8pOworCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9NU19MMTsKKwkJbXItPm1zX2wxLnB3ciA9IG1zX3B3cl9kYm0obXNnLT50cngtPmJ0cy0+YmFuZCwgdmFsWzBdID4+IDMpOworCQlpZiAodmFsWzBdICYgMHgwNCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0ZQQzsKKwkJbXItPm1zX2wxLnRhID0gdmFsWzFdOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wzX0lORk8pKSB7CisJCW1zZy0+bDNoID0gKHVfaW50OF90ICopIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wzX0lORk8pOworCQlyYyA9IGdzbTQ4X3BhcnNlX21lYXNfcmVwKG1yLCBtc2cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXByaW50X21lYXNfcmVwKG1yKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9NRUFTX1JFUCwgbXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjcgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2hhbmRvX2RldChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQKERSU0wsICIlcyBIQU5ET1ZFUiBERVRFQ1QgIiwgZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKQorCQlERUJVR1BDKERSU0wsICJhY2Nlc3MgZGVsYXkgPSAldVxuIiwKKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKTsKKwllbHNlCisJCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfREVURUNULCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2RjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBDSEFOTkVMIEFDVElWQVRFIEFDS1xuIiwgdHNfbmFtZSk7CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX05BQ0s6CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X25hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ09OTl9GQUlMOgorCQlyYyA9IHJzbF9yeF9jb25uX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTUVBU19SRVM6CisJCXJjID0gcnNsX3J4X21lYXNfcmVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0hBTkRPX0RFVDoKKwkJcmMgPSByc2xfcnhfaGFuZG9fZGV0KG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX0NIQU5fUkVMX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBSRiBDSEFOTkVMIFJFTEVBU0UgQUNLXG4iLCB0c19uYW1lKTsKKwkJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX1JFUSkKKwkJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIFJFTCBBQ0sgYnV0IHN0YXRlICVzXG4iLAorCQkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKwkJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9BQ0s6CisJCURFQlVHUEMoRFJTTCwgIiVzIElQQUMgUERDSCBBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUMgUERDSCBERUFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIERFQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9QSFlfQ09OVEVYVF9DT05GOgorCWNhc2UgUlNMX01UX1BSRVBST0NfTUVBU19SRVM6CisJY2FzZSBSU0xfTVRfVEFMS0VSX0RFVDoKKwljYXNlIFJTTF9NVF9MSVNURU5FUl9ERVQ6CisJY2FzZSBSU0xfTVRfUkVNT1RFX0NPREVDX0NPTkZfUkVQOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX1BFUjoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgRENoYW4gIgorCQkJIm1zZyAweCUwMnhcbiIsIHRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgdW5rbm93biBBYmlzIFJTTCBEQ2hhbiBtc2cgMHglMDJ4XG4iLAorCQkJdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByc2xfcnhfZXJyb3JfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBFUlJPUiBSRVBPUlQgIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgcnNsaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqcnNsaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfdHJ4KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAocnNsaC0+bXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9FUlJPUl9SRVBPUlQ6CisJCXJjID0gcnNsX3J4X2Vycm9yX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9SRVNfSU5EOgorCQkvKiBpbnRlcmZlcmVuY2Ugb24gaWRsZSBjaGFubmVscyBvZiBUUlggKi8KKwkJLy9ERUJVR1AoRFJTTCwgIiVzIFJGIFJlc291cmNlIEluZGljYXRpb25cbiIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9PVkVSTE9BRDoKKwkJLyogaW5kaWNhdGUgQ0NDSCAvIEFDQ0ggLyBwcm9jZXNzb3Igb3ZlcmxvYWQgKi8gCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENDQ0gvQUNDSC9DUFUgT3ZlcmxvYWRcbiIsCisJCSAgICAgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSwgcnNsaC0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBJZiBUMzEwMSBleHBpcmVzLCB3ZSBuZXZlciByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIElNTUVESUFURSBBU1NJR04gKi8KK3N0YXRpYyB2b2lkIHQzMTAxX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisKKwlyc2xfcmZfY2hhbl9yZWxlYXNlKGxjaGFuKTsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fcnFkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnFkX2hkciA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqcnFkX3JlZjsKKwlzdHJ1Y3QgZ3NtNDhfaW1tX2FzcyBpYTsKKwllbnVtIGdzbV9jaGFuX3QgbGN0eXBlOworCWVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGNocmVxX3JlYXNvbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBycWRfdGE7CisJaW50IHJldDsKKworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCB0c19udW1iZXIsIHN1YmNoOworCisJLyogcGFyc2UgcmVxdWVzdCByZWZlcmVuY2UgdG8gYmUgdXNlZCBpbiBpbW1lZGlhdGUgYXNzaWduICovCisJaWYgKHJxZF9oZHItPmRhdGFbMF0gIT0gUlNMX0lFX1JFUV9SRUZFUkVOQ0UpCisJCXJldHVybiAtRUlOVkFMOworCisJcnFkX3JlZiA9IChzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqKSAmcnFkX2hkci0+ZGF0YVsxXTsKKworCS8qIHBhcnNlIGFjY2VzcyBkZWxheSBhbmQgdXNlIGFzIFRBICovCisJaWYgKHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsxXSAhPSBSU0xfSUVfQUNDRVNTX0RFTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlycWRfdGEgPSBycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMl07CisKKwkvKiBkZXRlcm1pbmUgY2hhbm5lbCB0eXBlIChTRENDSC9UQ0hfRi9UQ0hfSCkgYmFzZWQgb24KKwkgKiByZXF1ZXN0IHJlZmVyZW5jZSBSQSAqLworCWxjdHlwZSA9IGdldF9jdHlwZV9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCWNocmVxX3JlYXNvbiA9IGdldF9yZWFzb25fYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEudG90YWwpOworCisJLyogY2hlY2sgYXZhaWxhYmlsaXR5IC8gYWxsb2NhdGUgY2hhbm5lbCAqLworCWxjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBsY3R5cGUpOworCWlmICghbGNoYW4pIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIkJUUyAlZCBDSEFOIFJRRDogbm8gcmVzb3VyY2VzIGZvciAlcyAweCV4XG4iLAorCQkgICAgIG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY3R5cGUpLCBycWRfcmVmLT5yYSk7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCk7CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUga2luZCBvZiByZWplY3QgPyE/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19OT05FKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgbGNoYW5fYWxsb2MoKSByZXR1cm5lZCBjaGFubmVsICIKKwkJICAgICAiaW4gc3RhdGUgJXNcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJICAgICBnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RfUkVROworCisJdHNfbnVtYmVyID0gbGNoYW4tPnRzLT5ucjsKKwlhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdWJjaCA9IGxjaGFuLT5ucjsKKwkKKwlsY2hhbi0+ZW5jci5hbGdfaWQgPSBSU0xfRU5DX0FMR19BNSgwKTsJLyogbm8gZW5jcnlwdGlvbiAqLworCWxjaGFuLT5tc19wb3dlciA9IG1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWxjaGFuLT5ic19wb3dlciA9IDA7IC8qIDBkQiByZWR1Y3Rpb24sIG91dHB1dCBwb3dlciA9IFBuICovCisJbGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCWxjaGFuLT50Y2hfbW9kZSA9IEdTTTQ4X0NNT0RFX1NJR047CisJcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obGNoYW4sIDB4MDAsIHJxZF90YSwgMCk7CisKKwkvKiBjcmVhdGUgSU1NRURJQVRFIEFTU0lHTiAwNC4wOCBtZXNzZ2UgKi8KKwltZW1zZXQoJmlhLCAwLCBzaXplb2YoaWEpKTsKKwlpYS5sMl9wbGVuID0gMHgyZDsKKwlpYS5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWlhLm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSU1NX0FTUzsKKwlpYS5wYWdlX21vZGUgPSBHU000OF9QTV9TQU1FOworCWlhLmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaWEuY2hhbl9kZXNjLmgwLmggPSAwOworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWlhLmNoYW5fZGVzYy5oMC50c2MgPSBidHMtPnRzYzsKKwkvKiB1c2UgcmVxdWVzdCByZWZlcmVuY2UgZXh0cmFjdGVkIGZyb20gQ0hBTl9SUUQgKi8KKwltZW1jcHkoJmlhLnJlcV9yZWYsIHJxZF9yZWYsIHNpemVvZihpYS5yZXFfcmVmKSk7CisJaWEudGltaW5nX2FkdmFuY2UgPSBycWRfdGE7CisJaWEubW9iX2FsbG9jX2xlbiA9IDA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEFjdGl2YXRpbmcgQVJGQ04oJXUpIFNTKCV1KSBsY3R5cGUgJXMgIgorCQkicj0lcyByYT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgYXJmY24sIHN1YmNoLAorCQlnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLCBnc21fY2hyZXFfbmFtZShjaHJlcV9yZWFzb24pLAorCQlycWRfcmVmLT5yYSk7CisKKwkvKiBTdGFydCB0aW1lciBUMzEwMSB0byB3YWl0IGZvciBHU000OF9NVF9SUl9QQUdfUkVTUCAqLworCWxjaGFuLT5UMzEwMS5jYiA9IHQzMTAxX2V4cGlyZWQ7CisJbGNoYW4tPlQzMTAxLmRhdGEgPSBsY2hhbjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5UMzEwMSwgYnRzLT5uZXR3b3JrLT5UMzEwMSwgMCk7CisKKwkvKiBzZW5kIElNTUVESUFURSBBU1NJR04gQ01EIG9uIFJTTCB0byBCVFMgKHRvIHNlbmQgb24gQ0NDSCB0byBNUykgKi8KKwlyZXQgPSByc2xfaW1tX2Fzc2lnbl9jbWQoYnRzLCBzaXplb2YoaWEpLCAodV9pbnQ4X3QgKikgJmlhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCitzdGF0aWMgaW50IHJzbF9yeF9jY2NoX2xvYWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXVfaW50MTZfdCBwZ19idWZfc3BhY2U7CisJdV9pbnQxNl90IHJhY2hfc2xvdF9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2J1c3lfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9hY2Nlc3NfY291bnQgPSAtMTsKKworCXN3aXRjaCAocnNsaC0+ZGF0YVswXSkgeworCWNhc2UgUlNMX0lFX1BBR0lOR19MT0FEOgorCQlwZ19idWZfc3BhY2UgPSByc2xoLT5kYXRhWzFdIDw8IDggfCByc2xoLT5kYXRhWzJdOworCQlwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShtc2ctPnRyeC0+YnRzLCBwZ19idWZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFJTTF9JRV9SQUNIX0xPQUQ6CisJCWlmIChtc2ctPmRhdGFfbGVuID49IDcpIHsKKwkJCXJhY2hfc2xvdF9jb3VudCA9IHJzbGgtPmRhdGFbMl0gPDwgOCB8IHJzbGgtPmRhdGFbM107CisJCQlyYWNoX2J1c3lfY291bnQgPSByc2xoLT5kYXRhWzRdIDw8IDggfCByc2xoLT5kYXRhWzVdOworCQkJcmFjaF9hY2Nlc3NfY291bnQgPSByc2xoLT5kYXRhWzZdIDw8IDggfCByc2xoLT5kYXRhWzddOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2NjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX1JRRDoKKwkJLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2hhbl9ycWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0NDSF9MT0FEX0lORDoKKwkJLyogY3VycmVudCBsb2FkIG9uIHRoZSBDQ0NIICovCisJCXJjID0gcnNsX3J4X2NjY2hfbG9hZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9ERUxFVEVfSU5EOgorCQkvKiBDQ0NIIG92ZXJsb2FkZWQsIElNTV9BU1NJR04gd2FzIGRyb3BwZWQgKi8KKwljYXNlIFJTTF9NVF9DQkNIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENCQ0ggKi8KKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgdHlwZSAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9ybGxfZXJyX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCXVfaW50OF90ICpybG1fY2F1c2UgPSBybGxoLT5kYXRhOworCisJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgSU5ESUNBVElPTiBjYXVzZT0lc1xuIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCWdldF92YWx1ZV9zdHJpbmcocnNsX3JsbV9jYXVzZV9zdHJzLCBybG1fY2F1c2VbMV0pKTsKKworCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsIEJTQ19STExSX0lORF9FUlJfSU5EKTsKKworCWlmIChybG1fY2F1c2VbMV0gPT0gUkxMX0NBVVNFX1QyMDBfRVhQSVJFRCkKKwkJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoJRVNUQUJMSVNIIElORElDQVRJT04sIExPQ0FUSU9OIEFSRUEgVVBEQVRFIFJFUVVFU1QgCisJMHgwMiwgMHgwNiwKKwkweDAxLCAweDIwLAorCTB4MDIsIDB4MDAsCisJMHgwYiwgMHgwMCwgMHgwZiwgMHgwNSwgMHgwOCwgLi4uICovCisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfcmxsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCXVfaW50OF90IHNhcGkgPSBybGxoLT5saW5rX2lkICYgNzsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwlERUJVR1AoRFJMTCwgIiVzIFNBUEk9JXUgIiwgdHNfbmFtZSwgc2FwaSk7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfREFUQV9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkRBVEEgSU5ESUNBVElPTlxuIik7CisJCWlmIChtc2diX2wybGVuKG1zZykgPiAKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIElORElDQVRJT05cbiIpOworCQkvKiBsY2hhbiBpcyBlc3RhYmxpc2hlZCwgc3RvcCBUMzEwMSAqLworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTVM7CisJCWJzY19kZWxfdGltZXIoJm1zZy0+bGNoYW4tPlQzMTAxKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+IAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfQ09ORjoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIENPTkZJUk1cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTkVUOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX0VTVF9DT05GKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0lORDoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkICBESVNDIGZyb20gTVMgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBJTkRJQ0FUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9SRUxfSU5EKTsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0NPTkY6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCBVQSBmcm9tIE1TLAorCQkgKiBpbiByZXNwb25zZSB0byBESVNDIHRoYXQgd2UndmUgc2VudCBlYXJsaWVyICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgQ09ORklSTUFUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVJST1JfSU5EOgorCQlyYyA9IHJzbF9yeF9ybGxfZXJyX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9VTklUX0RBVEFfSU5EOgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3Ntb2Rfc19mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAwOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDAzOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMTsKKwkJLyogdGhlcmUncyBubyBoYWxmLXJhdGUgRUZSICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAyOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDA1OworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3Mgc3BlZWNoIG1vZGUgZm9yICIKKwkJInRjaF9tb2RlID09IDB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXAuYWNjZXNzIHNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitzdGF0aWMgdm9pZCBpcGFjX3BhcnNlX3J0cChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVfaW50MTZfdCBwb3J0LCBjb25uX2lkOworCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCA9IHBvcnQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJY29ubl9pZCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpOworCQljb25uX2lkID0gbnRvaHMoY29ubl9pZCk7CisJCURFQlVHUEMoRFJTTCwgIkNPTl9JRD0ldSAiLCBjb25uX2lkKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCA9IGNvbm5faWQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKSkgeworCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKTsKKwkJREVCVUdQQyhEUlNMLCAiUlRQX1BBWUxPQUQyPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSkpIHsKKwkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpOworCQlERUJVR1BDKERSU0wsICJzcGVlY2hfbW9kZT0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJfQorfQorCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19DUkNYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogMHgxLSA9PSByZWNlaXZlLW9ubHksIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDEwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19CSU5EIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCQkgICB1X2ludDhfdCBydHBfcGF5bG9hZDIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQzMl90ICphdHRfaXA7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19NRENYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogd2UgbmVlZCB0byBzdG9yZSB0aGVzZSBub3cgYXMgTURDWF9BQ0sgZG9lcyBub3QgcmV0dXJuIHRoZW0gOiggKi8KKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPSBydHBfcGF5bG9hZDI7CisJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gaXA7CisKKwkvKiAweDAtID09IGJvdGggZGlyZWN0aW9ucywgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MDAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1ggSVA9JXMgUE9SVD0lZCBSVFBfUEFZTE9BRDI9JWQgQ09OTl9JRD0lZCAiCisJCSJzcGVlY2hfbW9kZT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgaW5ldF9udG9hKGlhKSwgcG9ydCwKKwkJcnRwX3BheWxvYWQyLCBsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CisJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CisJYXR0X2lwID0gKHVfaW50MzJfdCAqKSBtc2diX3B1dChtc2csIHNpemVvZihpcCkpOworCSphdHRfaXAgPSBpYS5zX2FkZHI7CisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJaWYgKHJ0cF9wYXlsb2FkMikKKwkJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIsIHJ0cF9wYXlsb2FkMik7CisJCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIHRlbGwgQlRTIHRvIGNvbm5lY3QgUlRQIHN0cmVhbSB0byBvdXIgbG9jYWwgUlRQIHNvY2tldCAqLworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlpbnQgcmM7CisKKwlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCBudG9obChycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIpLAorCQkJCW50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSwKKwkJCS8qIEZJWE1FOiB1c2UgUlRQIHBheWxvYWQgb2YgYm91bmQgc29ja2V0LCBub3QgQlRTKi8KKwkJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19QRENIX0FDVCk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19QRENIX0FDVFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgbG9jYWwgYmluZCwgaXQgbm93IHRlbGxzIHVzIHRoZSBJUAorCSogYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzIGJvdW5kIHRoZSBnaXZlbiBsb2dpY2FsCisJKiBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAibWFuZGF0b3J5IElFIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisKKwkvKiBpbiBjYXNlIHdlIGRvbid0IHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoIWlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJaW50IHJjOworCQkvKiB0aGUgQlRTIGhhcyBzdWNjZXNzZnVsbHkgYm91bmQgYSBUQ0ggdG8gYSBsb2NhbCBpcC9wb3J0LAorCQkgKiB3aGljaCBtZWFucyB3ZSBjYW4gY29ubmVjdCBvdXIgVURQIHNvY2tldCB0byBpdCAqLworCQlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJCX0KKworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gcnRwX3NvY2tldF9jcmVhdGUoKTsKKwkJaWYgKCFsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJZ290byBvdXRfZXJyOworCisJCXJjID0gcnRwX3NvY2tldF9jb25uZWN0KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfQ1JDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgcmVtb3RlIGNvbm5lY3QgcmVxdWVzdCBhbmQKKwkgKiBpdCBub3cgdGVsbHMgdXMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcworCSAqIGNvbm5lY3RlZCB0aGUgZ2l2ZW4gbG9naWNhbCBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfTURDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfREVCVUcsIFRMVlBfVkFMKCZ0diwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHYsIFJTTF9JRV9DQVVTRSkpOworCisJLyogdGhlIEJUUyB0ZWxscyB1cyBhIFJUUCBzdHJlYW0gaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9ETENYX0lORCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWNoYXIgKnRzX25hbWU7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfQ1JDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGJpbmQgdGhlIGxjaGFuIHRvIGl0cyBsb2NhbAorCQkgKiBwb3J0PyE/ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfQ1JDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX0FDSzoKKwkJLyogdGhlIEJUUyB0ZWxscyB1cyB0aGF0IGEgY29ubmVjdCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRoZSBsY2hhbiB0byBhIHJlbW90ZQorCQkgKiBwb3J0ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfTURDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19ETENYX0lORDoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0RMQ1hfSU5EICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIGlwLmFjY2VzcyBtc2dfdHlwZSAweCUwMnhcbiIsCisJCQlybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpCTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChyc2xoLT5tc2dfZGlzY3IgJiAweGZlKSB7CisJY2FzZSBBQklTX1JTTF9NRElTQ19STEw6CisJCXJjID0gYWJpc19yc2xfcnhfcmxsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfREVEX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfZGNoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9jY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1RSWDoKKwkJcmMgPSBhYmlzX3JzbF9yeF90cngobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19MT0M6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFJTTCBtc2cgZGlzYyAweCUwMnhcbiIsCisJCQlyc2xoLT5tc2dfZGlzY3IpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOgorCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFJTTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+bXNnX2Rpc2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogRnJvbSBUYWJsZSAxMC41LjMzIG9mIEdTTSAwNC4wOCAqLworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPT0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQykgeworCQlyZXR1cm4gTUFYKDEsICgzIC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKSkKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0gZWxzZSB7CisJCXJldHVybiAoOSAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCkBAIC0wLDAgKzEsODcyIEBACisvKiBTaWVtZW5zIEJTLTExIG1pY3JvQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZyAKKyAqIChDKSAyMDA5IGJ5IERpZXRlciBTcGFhciA8c3BhYXJAbWlyaWRlci5hdWd1c3RhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIHN0YXRlIG9mIG91ciBiczExX2NvbmZpZyBhcHBsaWNhdGlvbiAqLworZW51bSBiczExY2ZnX3N0YXRlIHsKKwlTVEFURV9OT05FLAorCVNUQVRFX0xPR09OX1dBSVQsCisJU1RBVEVfTE9HT05fQUNLLAorCVNUQVRFX1NXTE9BRCwKKwlTVEFURV9RVUVSWSwKK307CitzdGF0aWMgZW51bSBiczExY2ZnX3N0YXRlIGJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworc3RhdGljIGNoYXIgKmNvbW1hbmQsICp2YWx1ZTsKK3N0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lcjsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9saV9hdHRyW10gPSB7IAorCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gsIDB4MDksIDB4MDAsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFLCAweDAwLCAKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRywgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2Jic2lnMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfUlNTSV9PRkZTLCAweDAyLCAweDAwLCAweDAwLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWSwgMHgwMSwgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX3BhMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfVFhQV1IsIDB4MDEsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0cngxX3Bhc3N3b3JkID0gIjExMTExMTExMTEiOworI2RlZmluZSBURUlfT01MCTI1CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCB0b29fZmFzdFtdID0geyAweDEyLCAweDgwLCAweDAwLCAweDAwLCAweDAyLCAweDAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBkdW1teSBmdW5jdGlvbiB0byBrZWVwIGdzbV9kYXRhLmMgaGFwcHkgKi8KK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKTsKKworLyogY3JlYXRlIGFsbCBvYmplY3RzIGZvciBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29iamVjdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgbWluaW1hbCBjb25maWdcbiIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfTEksIDAsIHNpemVvZihvYmpfbGlfYXR0ciksCisJCQkJICAgb2JqX2xpX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfR1BTVSwgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9BTENPLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0NDTEssIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9iYnNpZzBfYXR0ciksIG9ial9iYnNpZzBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMCwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDEpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMyk7CisKKwlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGJ0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihidHMtPmMwLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJc2xlZXAoMSk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3RyeDEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBiYnNpZzFfYXR0cltzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSsxMl07CisJdV9pbnQ4X3QgKmN1ciA9IGJic2lnMV9hdHRyOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisKKwlpZiAoIXRyeCkKKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBUUlgxXG4iKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwljdXIgPSB0bHZfcHV0KGN1ciwgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLAorCQkgICAgICAodV9pbnQ4X3QgKil0cngxX3Bhc3N3b3JkKTsKKwltZW1jcHkoY3VyLCBvYmpfYmJzaWcwX2F0dHIsIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAxLAorCQkJCSAgIHNpemVvZihiYnNpZzFfYXR0ciksIGJic2lnMV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAxLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHRyeCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc2VyaWFsX3BvcnQgPSAiL2Rldi90dHlVU0IwIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zYWZldHkgPSAiQlRTQk1DNzYuU1dJIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zb2Z0d2FyZSA9ICJIUzAxMTEwNi5TV0wiOworc3RhdGljIGludCBkZWxheV9tcyA9IDA7CitzdGF0aWMgaW50IHdpbl9zaXplID0gODsKK3N0YXRpYyBpbnQgcGFyYW1fZGlzY29ubmVjdCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX3Jlc3RhcnQgPSAwOworc3RhdGljIGludCBwYXJhbV9mb3JjZWQgPSAwOworc3RhdGljIHN0cnVjdCBnc21fYnRzICpnX2J0czsKKworc3RhdGljIGludCBmaWxlX2lzX3JlYWRhYmxlKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXJjID0gc3RhdChmbmFtZSwgJnN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpICYmIChzdC5zdF9tb2RlICYgU19JUlVTUikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJaWYgKGRhdGEpIHsKKwkJCS8qIHdlIGRpZCBhIHNhZmV0eSBsb2FkIGFuZCBtdXN0IGFjdGl2YXRlIGl0ICovCisJCQlhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQkJCQkgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCQlzbGVlcCg1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CisJCQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoZ19idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnMxMV9saW5rX3N0YXRlW10gPSB7CisJWzB4MDBdCT0gIkRvd24iLAorCVsweDAxXQk9ICJVcCIsCisJWzB4MDJdCT0gIlJlc3RvcmluZyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua3N0YXRlX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKGJzMTFfbGlua19zdGF0ZSkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gYnMxMV9saW5rX3N0YXRlW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkW10gPSB7CisJWzBdCT0gIk5vIExvYWQiLAorCVsxXQk9ICJMb2FkIEJUU0NBQyIsCisJWzJdCT0gIkxvYWQgQlRTRFJYIiwKKwlbM10JPSAiTG9hZCBCVFNCQlgiLAorCVs0XQk9ICJMb2FkIEJUU0FSQyIsCisJWzVdCT0gIkxvYWQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUobWJjY3VfbG9hZCkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gbWJjY3VfbG9hZFtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3BoYXNlX25hbWUodV9pbnQ4X3QgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQXzI6CisJCXJldHVybiAiV2FybSBVcCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJCXJldHVybiAiTG9hZCBTTVUgU2FmZXR5IjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCQlyZXR1cm4gIkxvYWQgU01VIEludGVuZGVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCXJldHVybiAiTG9hZCBNQkNDVSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCXJldHVybiAiU29mdHdhcmUgcmVxdWlyZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJcmV0dXJuICJXYWl0IG1pbmltYWwgY29uZmlnIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlyZXR1cm4gIk1haW50ZW5hbmNlIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJcmV0dXJuICJOb3JtYWwiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfQUJJU19MT0FEOgorCQlyZXR1cm4gIkFiaXMgbG9hZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyeF9wb3dlcl9uYW1lKHVfaW50OF90IHB3cikKK3sKKwlzd2l0Y2ggKHB3cikgeworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzJXOgkKKwkJcmV0dXJuICIyVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc6CisJCXJldHVybiAiMjUwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVc6CisJCXJldHVybiAiODBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMzBtVzoKKwkJcmV0dXJuICIzMG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18zVzoKKwkJcmV0dXJuICIzVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMVc2OgorCQlyZXR1cm4gIjEuNlcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XOgorCQlyZXR1cm4gIjUwMG1XIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVzoKKwkJcmV0dXJuICIxNjBtVyAoRENTKSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGxfbW9kZV9uYW1lKHVfaW50OF90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUzExX0xJX1BMTF9MT0NLRUQ6CisJCXJldHVybiAiRTEgTG9ja2VkIjsKKwljYXNlIEJTMTFfTElfUExMX1NUQU5EQUxPTkU6CisJCXJldHVybiAiU3RhbmRhbG9uZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjY2xrX2FjY19uYW1lKHVfaW50OF90IGFjYykKK3sKKwlzd2l0Y2ggKGFjYykgeworCWNhc2UgMDoKKwkJLyogT3V0IG9mIHRoZSBkZW1hbmRlZCArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIk1lZGl1bSI7CisJY2FzZSAxOgorCQkvKiBTeW5jaHJvbml6ZWQgd2l0aCBBYmlzLCB3aXRoaW4gZGVtYW5kZWQgdG9sZXJhbmNlICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiSGlnaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfbmFtZShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJc3RhdGljIGNoYXIgcmV0YnVmWzI1Nl07CisKKwlyZXRidWZbMF0gPSAwOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3RyY2F0KHJldGJ1ZiwgIkJTMTEgIik7CisJCXN3aXRjaCAoZm9oLT5vYmpfaW5zdC5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiUG93ZXIgQW1wbGlmaWVyICVkICIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9MSToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiTGluZSBJbnRlcmZhY2UgIik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJDQ0xLICIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCXN0cmNhdChyZXRidWYsICJTSVRFIE1BTkFHRVIgIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0YnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0ZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSkgeworCQl1X2ludDhfdCBwaGFzZSwgbWJjY3U7CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKSB7CisJCQlwaGFzZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKTsKKwkJCXByaW50ZigiUEhBU0U6ICV1ICUtMjBzICIsIHBoYXNlICYgMHhmLAorCQkJCWJ0c19waGFzZV9uYW1lKHBoYXNlKSk7CisJCX0KKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDIpIHsKKwkJCW1iY2N1ID0gKihUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSsxKTsKKwkJCXByaW50ZigiTUJDQ1UwOiAlLTExcyBNQkNDVTE6ICUtMTFzICIsCisJCQkJbWJjY3VfbG9hZF9uYW1lKG1iY2N1ICYgMHhmKSwgbWJjY3VfbG9hZF9uYW1lKG1iY2N1ID4+IDQpKTsKKwkJfQorCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSA+PSAxKSB7CisJCXVfaW50OF90IGUxX3N0YXRlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSk7CisJCXByaW50ZigiQWJpcy1saW5rOiAlLTlzICIsIGxpbmtzdGF0ZV9uYW1lKGUxX3N0YXRlICYgMHhmKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBwcmludF9hdHRyKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBQQ0IgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gSGFyZHdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSs2KTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gRmlybXdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSs2KTsKKwl9CisjaWYgMAorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykpIHsKKwkJcHJpbnRmKCJCUy0xMSBCb290IFNvZnR3YXJlIFZlcnNpb246ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykrNik7CisJfQorI2VuZGlmCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpID49IDMpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNoYW4gPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCk7CisJCXByaW50ZigiXHRFMSBDaGFubmVsOiBQb3J0PSV1IFRpbWVzbG90PSV1ICIsCisJCQljaGFuWzBdLCBjaGFuWzFdKTsKKwkJaWYgKGNoYW5bMl0gPT0gMHhmZikKKwkJCXByaW50ZigiKEZ1bGwgU2xvdClcbiIpOworCQllbHNlCisJCQlwcmludGYoIlN1YnNsb3Q9JXVcbiIsIGNoYW5bMl0pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfVEVJKSkKKwkJcHJpbnRmKCJcdFRFSTogJWRcbiIsICpUTFZQX1ZBTCh0cCwgTk1fQVRUX1RFSSkpOworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1RYUFdSKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfVFhQV1IpID49IDEpIHsKKwkJcHJpbnRmKCJcdFRSWCBQb3dlcjogJXNcbiIsCisJCQl0cnhfcG93ZXJfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1RYUFdSKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSA+PSAxKSB7CisJCXByaW50ZigiXHRQTEwgTW9kZTogJXNcbiIsCisJCQlwbGxfbW9kZV9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTCkgPj0gNCkgeworCQljb25zdCB1X2ludDhfdCAqdnAgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMKTsKKwkJcHJpbnRmKCJcdFBMTCBTZXQgVmFsdWU9JWQsIFdvcmsgVmFsdWU9JWRcbiIsCisJCQl2cFswXSA8PCA4IHwgdnBbMV0sIHZwWzJdIDw8IDggfCB2cFszXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSk7CisJCXByaW50ZigiXHRDQ0xLIEFjY3VyYWN5OiAlcyAoJWQpXG4iLCBjY2xrX2FjY19uYW1lKCphY2MpLCAqYWNjKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKTsKKwkJcHJpbnRmKCJcdENDTEsgVHlwZT0lZFxuIiwgKmFjYyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5KHZvaWQpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnX2J0cy0+YzA7CisKKwliczExY2ZnX3N0YXRlID0gU1RBVEVfUVVFUlk7CisJYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X2NjbGsoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGdfYnRzLCAxKTsKKwlpZiAodHJ4KQorCQlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXNsZWVwKDEpOworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwljb21tYW5kID0gTlVMTDsKK30KKworLyogaGFuZGxlIGEgcmVzcG9uc2UgZnJvbSB0aGUgQlRTIHRvIGEgR0VUIFNUQVRFIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3N0YXRlX3Jlc3AoZW51bSBhYmlzX2JzMTFfcGhhc2Ugc3RhdGUpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJLyogc2VuZCBzYWZldHkgbG9hZC4gVXNlIGdfYnRzIGFzIHByaXZhdGUgJ3BhcmFtJworCQkgKiBhcmd1bWVudCwgc28gb3VyIHN3bG9hZF9jYmZuIGNhbiBkaXN0aW5ndWlzaAorCQkgKiBhIHNhZmV0eSBsb2FkIGZyb20gYSByZWd1bGFyIHNvZnR3YXJlICovCisJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NhZmV0eSkpCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU2FmZXR5IExvYWQgZmlsZSBcIiVzXCJcbiIsCisJCQkJZm5hbWVfc2FmZXR5KTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCXJjID0gY3JlYXRlX29iamVjdHMoZ19idHMpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCXJjID0gYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInNvZnR3YXJlIikKKwkJCSAgICAmJiBiczExY2ZnX3N0YXRlICE9IFNUQVRFX1NXTE9BRCkgeworCQkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCQkJLyogc2VuZCBzb2Z0d2FyZSAoRklYTUU6IG92ZXIgQS1iaXM/KSAqLworCQkJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NvZnR3YXJlKSkKKwkJCQkJcmMgPSBhYmlzX25tX2JzMTFfbG9hZF9zd2woZ19idHMsIGZuYW1lX3NvZnR3YXJlLAorCQkJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJCQkgICBzd2xvYWRfY2Jmbik7CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNvZnR3YXJlIGZpbGUgXCIlc1wiXG4iLAorCQkJCQkJZm5hbWVfc29mdHdhcmUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtdHJ4MSIpKSB7CisJCQkJcHJpbnRmKCJMb2NpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfQkJTSUcsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX1BBLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlwcmludGYoIkRlbGV0aW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9CQlNJRywgMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX1BBLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS10cngxIikpIHsKKwkJCQljcmVhdGVfdHJ4MShnX2J0cyk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtZTEtbG9ja2VkIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXN0YW5kYWxvbmUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc2V0dmFsdWUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtd29ya3ZhbHVlIikpIHsKKwkJCQkvKiBUbyBzZXQgdGhlIHdvcmsgdmFsdWUgd2UgbmVlZCB0byBsb2dpbiBhcyBGSUVMRCAqLworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgIm9tbC10ZWkiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoZ19idHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZXN0YXJ0IikpIHsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTFfQlBPUlQsIDEsIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtc3RhciIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19TVEFSKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1tdWx0aWRyb3AiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfTVVMVElEUk9QKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJhbV9kaXNjb25uZWN0KSB7CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMDsKKwkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQlpZiAocGFyYW1fcmVzdGFydCkgeworCQkJCXBhcmFtX3Jlc3RhcnQgPSAwOworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBoYW5kbGUgYSBmdWxseS1yZWNlaXZlZCBtZXNzYWdlL3BhY2tldCBmcm9tIHRoZSBSUzIzMiBwb3J0ICovCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlpbnQgcmMgPSAtMTsKKworI2lmIDAKKwlpZiAocnhfbXNnLT5sZW4gPCBMQVBEX0hEUl9MRU4KKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikKKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSkgeworCQlpZiAoIW1lbWNtcChyeF9tc2ctPmRhdGEgKyAyLCB0b29fZmFzdCwKKwkJCSAgICBzaXplb2YodG9vX2Zhc3QpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCUzExIHRlbGxzIHVzIHdlJ3JlIHRvbyAiCisJCQkJImZhc3QsIHRyeSAtLWRlbGF5IGJpZ2dlciB0aGFuICV1XG4iLAorCQkJCWRlbGF5X21zKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0gZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEJTMTEgbWVzc2FnZVxuIik7CisJfQorI2VuZGlmCisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9sMihyeF9tc2cpOworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLOgorCQlwcmludGYoIkxNVCBMT0dPTjogQUNLXG5cbiIpOworCQlpZiAoYnMxMWNmZ19zdGF0ZSA9PSBTVEFURV9OT05FKQorCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX0xPR09OX0FDSzsKKwkJcmMgPSBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLOgorCQlwcmludGYoIkxNVCBMT0dPRkY6IEFDS1xuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLOgorCQlyYyA9IGFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlwcmludF9zdGF0ZSgmdHApOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSAmJgorCQkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpCisJCQlyYyA9IGhhbmRsZV9zdGF0ZV9yZXNwKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0dFVF9BVFRSX1JFU1A6CisJCXByaW50ZigiXG4lc0FUVFJJQlVURVM6XG4iLCBvYmpfbmFtZShmb2gpKTsKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXJjID0gcHJpbnRfYXR0cigmdHApOworCQkvL2hleGR1bXAoZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIEFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgTkFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZyhyeF9tc2cpOworCX0KKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgaW4gbWFpbiBsb29wIik7CisJCS8vYnJlYWs7CisJfQorCWlmIChyYyA9PSAxKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGJzMTFjZmdfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PTkU6CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9MT0dPTl9BQ0s6CisJCWJzY19zY2hlZHVsZV90aW1lcigmc3RhdHVzX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWZuYW1lX3NvZnR3YXJlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJZm5hbWVfc2FmZXR5ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGVsYXlfbXMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3aW5fc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJcGFyYW1fZm9yY2VkID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJcGFyYW1fcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKQorCQljb21tYW5kID0gYXJndltvcHRpbmRdOworCSAgICAgICAgaWYgKG9wdGluZCsxIDwgYXJnYykKKwkJCXZhbHVlID0gYXJndltvcHRpbmQrMV07CisKK30KKworc3RhdGljIGludCBudW1fc2lnaW50OworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAiXG5zaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQludW1fc2lnaW50Kys7CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJaWYgKG51bV9zaWdpbnQgPj0gMykKKwkJCWV4aXQoMCk7CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCWludCByYzsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgZ3NtIG5ldHdvcmtcbiIpOworCQlleGl0KDEpOworCX0KKwlnX2J0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfQlMxMSwgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisKKwlyYyA9IHJzMjMyX3NldHVwKHNlcmlhbF9wb3J0LCBkZWxheV9tcywgZ19idHMpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJQcm9ibGVtIHNldHRpbmcgdXAgc2VyaWFsIHBvcnRcbiIpOworCQlleGl0KDEpOworCX0KKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJLy9hYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKGdfYnRzKTsKKworCXN0YXR1c190aW1lci5jYiA9IHN0YXR1c190aW1lcl9jYjsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2hhY2suYyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwNWNlZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2luY2x1ZGUgIi4uL2JzY2NvbmZpZy5oIgorCisvKiBNQ0MgYW5kIE1OQyBmb3IgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciAqLworc3RhdGljIHN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CitzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKmRhdGFiYXNlX25hbWUgPSAiaGxyLnNxbGl0ZTMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlID0gIm9wZW5ic2MuY2ZnIjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBIYXJhbGQgV2VsdGUsIEhvbGdlciBGcmV5dGhlclxuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1zIC0tZGlzYWJsZS1jb2xvclxuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1wIC0tcGNhcCBmaWxlICBUaGUgZmlsZW5hbWUgb2YgdGhlIHBjYXAgZmlsZVxuIik7CisJcHJpbnRmKCIgIC1UIC0tdGltZXN0YW1wIFByZWZpeCBldmVyeSBsb2cgbGluZSB3aXRoIGEgdGltZXN0YW1wXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCit7CisJcHJpbnRmKG9wZW5ic2NfY29weXJpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXdoaWxlICgxKSB7CisJCWludCBvcHRpb25faW5kZXggPSAwLCBjOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsiaGVscCIsIDAsIDAsICdoJ30sCisJCQl7ImRlYnVnIiwgMSwgMCwgJ2QnfSwKKwkJCXsiY29uZmlnLWZpbGUiLCAxLCAwLCAnYyd9LAorCQkJeyJkaXNhYmxlLWNvbG9yIiwgMCwgMCwgJ3MnfSwKKwkJCXsiZGF0YWJhc2UiLCAxLCAwLCAnbCd9LAorCQkJeyJhdXRob3JpemUtZXZlcnlvbmUiLCAwLCAwLCAnYSd9LAorCQkJeyJwY2FwIiwgMSwgMCwgJ3AnfSwKKwkJCXsidGltZXN0YW1wIiwgMCwgMCwgJ1QnfSwKKwkJCXsidmVyc2lvbiIsIDAsIDAsICdWJyB9LAorCQkJeyJydHAtcHJveHkiLCAwLCAwLCAnUCd9LAorCQkJezAsIDAsIDAsIDB9CisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoZDpzbDphcjpwOlRQVmM6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWRlYnVnX3NldF91c2VfY29sb3Ioc3RkZXJyX3RhcmdldCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlkYXRhYmFzZV9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb25maWdfZmlsZSA9IHN0cmR1cChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJY3JlYXRlX3BjYXBfZmlsZShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJcHJpbnRfdmVyc2lvbigpOworCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRfY29weXJpZ2h0KCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorfQorCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY3R4Oworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCWJzY19zaHV0ZG93bl9uZXQoYnNjX2dzbW5ldCk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19HTE9CQUwsIFNfR0xPQkFMX1NIVVRET1dOLCBOVUxMKTsKKwkJc2xlZXAoMyk7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWNhc2UgU0lHVVNSMjoKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiB0aW1lciBoYW5kbGluZyAqLworc3RhdGljIGludCBfZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY291bnRlciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGJfc3RvcmVfY291bnRlcihjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgZGJfc3luY190aW1lcl9jYih2b2lkICpkYXRhKQoreworCS8qIHN0b3JlIGNvdW50ZXJzIHRvIGRhdGFiYXNlIGFuZCByZS1zY2hlZHVsZSAqLworCWNvdW50ZXJzX2Zvcl9lYWNoKF9kYl9zdG9yZV9jb3VudGVyLCBOVUxMKTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworfQorCitleHRlcm4gaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9iczExX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisKKwlkZWJ1Z19pbml0KCk7CisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJvcGVuYnNjIik7CisJdGFsbG9jX2N0eF9pbml0KCk7CisJb25fZHNvX2xvYWRfdG9rZW4oKTsKKwlvbl9kc29fbG9hZF9ycmxwKCk7CisJb25fZHNvX2xvYWRfaG9fZGVjKCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKworCWJ0c19tb2RlbF91bmtub3duX2luaXQoKTsKKwlidHNfbW9kZWxfYnMxMV9pbml0KCk7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJLyogZW5hYmxlIGZpbHRlcnMgKi8KKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCS8qIHBhcnNlIG9wdGlvbnMgKi8KKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCS8qIHNlZWQgdGhlIFBSTkcgKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCWlmIChkYl9pbml0KGRhdGFiYXNlX25hbWUpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBpbml0IGRhdGFiYXNlLiBQbGVhc2UgY2hlY2sgdGhlIG9wdGlvbiBzZXR0aW5ncy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIGluaXRpYWxpemVkLlxuIik7CisKKwlpZiAoZGJfcHJlcGFyZSgpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBwcmVwYXJlIGRhdGFiYXNlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgcHJlcGFyZWQuXG4iKTsKKworCS8qIHNldHVwIHRoZSB0aW1lciAqLworCWRiX3N5bmNfdGltZXIuY2IgPSBkYl9zeW5jX3RpbWVyX2NiOworCWRiX3N5bmNfdGltZXIuZGF0YSA9IE5VTEw7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKKworCXJjID0gYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKG1uY2NfcmVjdiwgY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApCisJCWV4aXQoMSk7CisKKwlzaWduYWwoU0lHSU5ULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IyLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCXdoaWxlICgxKSB7CisJCWJzY191cHF1ZXVlKGJzY19nc21uZXQpOworCQlkZWJ1Z19yZXNldF9jb250ZXh0KCk7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQzNjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpAQCAtMCwwICsxLDEwMTYgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwKKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCisJCTB4MDAsIDI1MCwKKwkJMiwJLyogTUNTMiAqLworI2lmIDAKKwkvKiBFREdFIG1vZGVsIG9ubHksIGJyZWFrcyBvbGRlciBtb2RlbHMuCisJICogU2hvdWxkIGlucXVpcmUgdGhlIEJUUyBjYXBhYmlsaXRpZXMgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLCAwLCAxLAorCQkyLAkvKiBNQ1MyICovCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc3ZjMFtdID0geworCU5NX0FUVF9JUEFDQ19OU1ZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIDkyNSAqLworCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywgMCwgOCwKKwkJMHg1OSwgMHhkOCwgLyogcmVtb3RlIHVkcCBwb3J0ICgyMzAwMCkgKi8KKwkJMTkyLCAxNjgsIDEwMCwgMTEsIC8qIHJlbW90ZSBpcCBhZGRyZXNzICovCisJCTB4NTksIDB4ZDgsIC8qIGxvY2FsIHVkcCBwb3J0ICgyMzAwMCkgKi8KK307CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBnZXQgYSBHU00gMTIuMjEgc3RhdGUgY2hhbmdlIGV2ZW50ICovCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YzsKKworCS8qIFRoaXMgZXZlbnQtZHJpdmVuIEJUUyBzZXR1cCBpcyBjdXJyZW50bHkgb25seSByZXF1aXJlZCBvbiBuYW5vQlRTICovCisKKwkvKiBFVlRfU1RBVEVDSEdfQURNIGlzIGNhbGxlZCBhZnRlciB3ZSBjYWxsIGNoZ19hZG1fc3RhdGUoKSBhbmQgd291bGQgY3JlYXRlCisJICogZW5kbGVzcyBsb29wICovCisJaWYgKGV2dCAhPSBFVlRfU1RBVEVDSEdfT1BFUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgc2l0ZV9tZ3IpOworCQlpZiAoKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMiAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCSAgICAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkpCisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0JUUzoKKwkJYnRzID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgbmFub2J0c19hdHRyX2J0cywKKwkJCQkJICAgICBzaXplb2YobmFub2J0c19hdHRyX2J0cykpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICBidHMtPmJ0c19uciwgMHhmZiwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLAorCQkJCQlidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQl0cyA9IG9iajsKKwkJdHJ4ID0gdHMtPnRyeDsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCQkJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9CisJCQkJCQlhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCXRyeCA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKKwkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkweGZmLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMuY2VsbCk7CisJCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICAwLCAweGZmLCBuYW5vYnRzX2F0dHJfY2VsbCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9jZWxsKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkwLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDAsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJbnN2YyA9IG9iajsKKwkJYnRzID0gbnN2Yy0+YnRzOworCQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKQorCQkJYnJlYWs7CisJICAgICAgICAvKiBXZSBza2lwIE5TVkMxIHNpbmNlIHdlIG9ubHkgdXNlIE5TVkMwICovCisJCWlmIChuc3ZjLT5pZCA9PSAxKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCQkgIG5hbm9idHNfYXR0cl9uc3ZjMCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc3ZjMCkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJbnN2Yy0+aWQsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIDEyLjIxIFNXIGFjdGl2YXRlZCByZXBvcnQgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgZm9oLT5vYmpfaW5zdC50cnhfbnIpOworCisJaWYgKCF0cngpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQkvKiBUUlggc29mdHdhcmUgaXMgYWN0aXZlLCB0ZWxsIGl0IHRvIGluaXRpYXRlIFJTTCBMaW5rICovCisJCWFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3QodHJ4LCAwLCAzMDAzLCB0cngtPnJzbF90ZWkpOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6IHsKKwkJLyoKKwkJICogTG9ja2luZyB0aGUgcmFkaW8gY2FycmllciB3aWxsIG1ha2UgaXQgZ28KKwkJICogb2ZmbGluZSBhZ2FpbiBhbmQgd2Ugd291bGQgY29tZSBoZXJlLiBUaGUKKwkJICogZnJhbWV3b3JrIHNob3VsZCBkZXRlcm1pbmUgdGhhdCB0aGVyZSB3YXMKKwkJICogbm8gY2hhbmdlIGFuZCBhdm9pZCByZWN1cnNpb24uCisJCSAqCisJCSAqIFRoaXMgY29kZSBpcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IG9uIHN0YXJ0CisJCSAqIGEgVFJYIHJlbWFpbnMgbG9ja2VkLgorCQkgKi8KKwkJaW50IHJjX3N0YXRlID0gdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwkJLyogUGF0Y2ggQVJGQ04gaW50byByYWRpbyBhdHRyaWJ1dGUgKi8KKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdICY9IDB4ZjA7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s1XSB8PSB0cngtPmFyZmNuID4+IDg7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s2XSA9IHRyeC0+YXJmY24gJiAweGZmOworCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgbmFub2J0c19hdHRyX3JhZGlvLAorCQkJCSAgICAgICBzaXplb2YobmFub2J0c19hdHRyX3JhZGlvKSk7CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICByY19zdGF0ZSk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJdHJ4LT5uciwgMHhmZik7CisJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NICovCitzdGF0aWMgaW50IG9tbF9tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlpZiAobXQgPT0gTk1fTVRfU0VUX0JUU19BVFRSX05BQ0spIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gc2V0IEJUUyBhdHRyaWJ1dGVzLiBUaGF0IGlzIGZhdGFsLiAiCisJCQkJIldhcyB0aGUgYnRzIHR5cGUgYW5kIGZyZXF1ZW5jeSBwcm9wZXJseSBzcGVjaWZpZWQ/XG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdlIHJlY2VpdmUgYSBzaWduYWwgZnJvbSBOTSAqLworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXVfaW50OF90ICptc2dfdHlwZTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX05NX1NXX0FDVElWX1JFUDoKKwkJcmV0dXJuIHN3X2FjdGl2X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX05BQ0s6CisJCW1zZ190eXBlID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBvbWxfbXNnX25hY2soKm1zZ190eXBlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbV9uYW5vYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogV2UgZG9uJ3QgZG8gY2FsbGJhY2sgYmFzZWQgYm9vdHN0cmFwcGluZywgYnV0IGV2ZW50IGRyaXZlbiAoc2VlIGFib3ZlKSAqLworfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPSBhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRzLT5lMV9saW5rOworCisJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXJldHVybjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWFiaXNfbm1fY29ubl90ZXJyX3RyYWYodHMsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxbCA9ICZ0cngtPnJzbF9lMV9saW5rOworCWludCBpOworCisJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKKworCXN3aXRjaCAodHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkvKiBGSVhNRTogZGlzY292ZXIgdGhpcyBieSBmZXRjaGluZyBhbiBhdHRyaWJ1dGUgKi8KKyNpZiAwCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDE1OyAvKiAxNWRCbSA9PSAzMG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbHNlCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDI0OyAvKiAyNGRCbSA9PSAyNTBtVyBQQSBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKwkJYWJpc19ubV9jb25uX3RlcnJfc2lnbih0cngsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlhYmlzX25tX2VzdGFibGlzaF90ZWkodHJ4LT5idHMsIHRyeC0+bnIsIGUxbC0+ZTFfbnIsCisJCQkJICAgICAgZTFsLT5lMV90cywgZTFsLT5lMV90c19zcywgdHJ4LT5yc2xfdGVpKTsKKworCQkvKiBTZXQgUmFkaW8gQXR0cmlidXRlcyAqLworCQlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBiczExX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YoYnMxMV9hdHRyX3JhZGlvKSk7CisJCWVsc2UgeworCQkJdV9pbnQ4X3QgdHJ4MV9hdHRyX3JhZGlvW3NpemVvZihiczExX2F0dHJfcmFkaW8pXTsKKwkJCXVfaW50OF90IGFyZmNuX2xvdyA9IHRyeC0+YXJmY24gJiAweGZmOworCQkJdV9pbnQ4X3QgYXJmY25faGlnaCA9ICh0cngtPmFyZmNuID4+IDgpICYgMHgwZjsKKwkJCW1lbWNweSh0cngxX2F0dHJfcmFkaW8sIGJzMTFfYXR0cl9yYWRpbywKKwkJCQlzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisKKwkJCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwkJCXRyeDFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdIHw9IGFyZmNuX2hpZ2g7CisJCQl0cngxX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCB0cngxX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cngtPmJ0cy0+YmFuZCkgeworCQljYXNlIEdTTV9CQU5EXzg1MDoKKwkJY2FzZSBHU01fQkFORF85MDA6CisJCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIG5hbm9CVFMgR1NNIGJhbmQgJXNcbiIsCisJCQkJZ3NtX2JhbmRfbmFtZSh0cngtPmJ0cy0+YmFuZCkpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQlubV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18xKSwgbXNnXzEpOyAvKiBzZXQgQlRTIFNpdGVNZ3IgYXR0ciovCisJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgYnMxMV9hdHRyX2J0cywgc2l6ZW9mKGJzMTFfYXR0cl9idHMpKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18zKSwgbXNnXzMpOyAvKiBzZXQgQlRTIGhhbmRvdmVyIGF0dHIgKi8KKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ180KSwgbXNnXzQpOyAvKiBzZXQgQlRTIHBvd2VyIGNvbnRyb2wgYXR0ciAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQlubV9yZWNvbmZpZ190cngodHJ4KTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX2JzMTEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIHJlY29uZmlndXJlIEJUUyB3aXRoIGFsbCBUUlggYW5kIGFsbCBUUyAqLworCW5tX3JlY29uZmlnX2J0cyhidHMpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIHJlc3RhcnQgc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgImJvb3RzdHJhcHBpbmcgT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlib290c3RyYXBfb21fYnMxMShidHMpOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlib290c3RyYXBfb21fbmFub2J0cyhidHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBib290c3RyYXAgT01MOiBVbmtub3duIEJUUyB0eXBlICVkXG4iLCBidHMtPnR5cGUpOworCX0KK30KKworc3RhdGljIGludCBzaHV0ZG93bl9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgInNodXR0aW5nIGRvd24gT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJLyogc3RvcCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAwKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaW50IHJjOworCQlyYyA9IHNodXRkb3duX29tKGJ0cyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBhbGwgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGVzICovCitzdGF0aWMgaW50IHNldF9zeXN0ZW1faW5mb3Moc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGksIHJjOworCXVfaW50OF90IHNpX3RtcFsyM107CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm1zX3R4cHdyX21heF9jY2NoID0KKwkJCW1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5uZWNpID0gYnRzLT5uZXR3b3JrLT5uZWNpOworCisJaWYgKHRyeCA9PSB0cngtPmJ0cy0+YzApIHsKKwkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIGkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwkJCXJzbF9iY2NoX2luZm8odHJ4LCBpLCBzaV90bXAsIHNpemVvZihzaV90bXApKTsKKwkJfQorCQlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJCWkgPSAxMzsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT18xMyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIFJTTF9TWVNURU1fSU5GT18xMywgc2lfdG1wLCByYyk7CisJCX0KKwl9CisKKwlpID0gNTsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzUsIHNpX3RtcCwgcmMpOworCisJaSA9IDY7CisJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dDsKKwlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwlyc2xfc2FjY2hfZmlsbGluZyh0cngsIFJTTF9TWVNURU1fSU5GT182LCBzaV90bXAsIHJjKTsKKworCXJldHVybiAwOworZXJyX291dDoKKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNhbm5vdCBnZW5lcmF0ZSBTSSAldSBmb3IgQlRTICV1LCBtb3N0IGxpa2VseSAiCisJCSJhIHByb2JsZW0gd2l0aCBuZWlnaGJvciBjZWxsIGxpc3QgZ2VuZXJhdGlvblxuIiwKKwkJaSwgdHJ4LT5idHMtPm5yKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBQYXRjaCB0aGUgdmFyaW91cyBTWVNURU0gSU5GT1JNQVRJT04gdGFibGVzIHRvIHVwZGF0ZQorICogdGhlIExBSQorICovCitzdGF0aWMgdm9pZCBwYXRjaF9ubV90YWJsZXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBhcmZjbl9sb3cgPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7CisJdV9pbnQ4X3QgYXJmY25faGlnaCA9IChidHMtPmMwLT5hcmZjbiA+PiA4KSAmIDB4MGY7CisKKwkvKiBwYXRjaCBBUkZDTiBpbnRvIEJUUyBBdHRyaWJ1dGVzICovCisJYnMxMV9hdHRyX2J0c1s2OV0gJj0gMHhmMDsKKwliczExX2F0dHJfYnRzWzY5XSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9idHNbNzBdID0gYXJmY25fbG93OworCW5hbm9idHNfYXR0cl9idHNbNDJdICY9IDB4ZjA7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gfD0gYXJmY25faGlnaDsKKwluYW5vYnRzX2F0dHJfYnRzWzQzXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfcmFkaW9bMl0gJj0gMHhmMDsKKwliczExX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwliczExX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkvKiBwYXRjaCBCU0lDICovCisJYnMxMV9hdHRyX2J0c1sxXSA9IGJ0cy0+YnNpYzsKKwluYW5vYnRzX2F0dHJfYnRzW3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS0xMV0gPSBidHMtPmJzaWM7CisKKwkvKiBwYXRjaCBDR0kgKi8KKwlhYmlzX25tX2lwYWNjZXNzX2NnaShuYW5vYnRzX2F0dHJfYnRzK3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS03LCBidHMpOworCisJLyogcGF0Y2ggdGhlIHBvd2VyIHJlZHVjdGlvbiAqLworCWJzMTFfYXR0cl9yYWRpb1s1XSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCW5hbm9idHNfYXR0cl9yYWRpb1sxXSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCisJLyogcGF0Y2ggTlNFSSAqLworCW5hbm9idHNfYXR0cl9uc2VbM10gPSBidHMtPmdwcnMubnNlLm5zZWkgPj4gODsKKwluYW5vYnRzX2F0dHJfbnNlWzRdID0gYnRzLT5ncHJzLm5zZS5uc2VpICYgMHhmZjsKKworCS8qIHBhdGNoIE5TVkNJICovCisJbmFub2J0c19hdHRyX25zdmMwWzNdID0gYnRzLT5ncHJzLm5zdmNbMF0ubnN2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfbnN2YzBbNF0gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSAmIDB4ZmY7CisKKwkvKiBwYXRjaCBJUCBhZGRyZXNzIGFzIFNHU04gSVAgKi8KKwkqKHVfaW50MTZfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArOCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9wb3J0KTsKKwkqKHVfaW50MzJfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArMTApID0KKwkJCQlodG9ubChidHMtPmdwcnMubnN2Y1swXS5yZW1vdGVfaXApOworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxNCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLmxvY2FsX3BvcnQpOworCisJLyogcGF0Y2ggQlZDSSAqLworCW5hbm9idHNfYXR0cl9jZWxsWzEyXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfY2VsbFsxM10gPSBidHMtPmdwcnMuY2VsbC5idmNpICYgMHhmZjsKKwkvKiBwYXRjaCBSQUMgKi8KKwluYW5vYnRzX2F0dHJfY2VsbFszXSA9IGJ0cy0+Z3Bycy5yYWM7CisKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBSU0wgZm9yIEJUUy9UUlggKCV1LyV1KSAiCisJCSJvbiBBUkZDTiAldSB1c2luZyBNQ0M9JXUgTU5DPSV1IExBQz0ldSBDSUQ9JXUgQlNJQz0ldSBUU0M9JXVcbiIsCisJCXRyeC0+YnRzLT5uciwgdHJ4LT5uciwgdHJ4LT5hcmZjbiwgYnNjX2dzbW5ldC0+Y291bnRyeV9jb2RlLAorCQlic2NfZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIHRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCXRyeC0+YnRzLT5jZWxsX2lkZW50aXR5LCB0cngtPmJ0cy0+YnNpYywgdHJ4LT5idHMtPnRzYyk7CisJc2V0X3N5c3RlbV9pbmZvcyh0cngpOworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlib290c3RyYXBfb20odHJ4LT5idHMpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQlib290c3RyYXBfcnNsKHRyeCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJTE9HUChETUksIExPR0xfTk9USUNFLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rXG4iKTsKKwkJLyogRklYTUU6IGRlYWwgd2l0aCBURUkgb3IgTDEgbGluayBsb3NzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBib290c3RyYXBfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPmJhbmQpIHsKKwljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDUxMiB8fCBidHMtPmMwLT5hcmZjbiA+IDg4NSkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU00xODAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDUxMi04ODUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODEwKSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE5MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTgxMC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF85MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDEgfHwKKwkJICAgKGJ0cy0+YzAtPmFyZmNuID4gMTI0ICYmIGJ0cy0+YzAtPmFyZmNuIDwgOTU1KSB8fAorCQkgICAgYnRzLT5jMC0+YXJmY24gPiAxMDIzKSAgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU005MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMS0xMjQsIDk1NS0xMDIzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIGZyZXF1ZW5jeSBiYW5kLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChidHMtPm5ldHdvcmstPmF1dGhfcG9saWN5ID09IEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMICYmCisJICAgICFidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiXG5XQVJOSU5HOiBZb3UgYXJlIHJ1bm5pbmcgYW4gJ2FjY2VwdC1hbGwnICIKKwkJCSJuZXR3b3JrIG9uIGEgQlRTIHRoYXQgaXMgbm90IGJhcnJlZC4gIFRoaXMgIgorCQkJImNvbmZpZ3VyYXRpb24gaXMgbGlrZWx5IHRvIGludGVyZmVyZSB3aXRoIHByb2R1Y3Rpb24gIgorCQkJIkdTTSBuZXR3b3JrcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBhIFJGICIKKwkJCSJzaGllbGRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgZmFyYWRheSBjYWdlIVxuXG4iKTsKKworCS8qIENvbnRyb2wgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5hdHQgPSAxOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyA9IFJTTF9CU19QQV9NRlJNU181OworCS8qIFQzMjEyIGlzIHNldCBmcm9tIHZ0eS9jb25maWcgKi8KKworCS8qIHNvbWUgZGVmYXVsdHMgZm9yIG91ciBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucmFkaW9fbGlua190aW1lb3V0ID0gMjsgLyogMTIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMuZHR4ID0gMjsgLyogTVMgc2hhbGwgbm90IHVzZSB1cHBsaW5rIERUWCAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5wd3JjID0gMDsgLyogUFdSQyBub3Qgc2V0ICovCisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuYWNzID0gMDsKKworCWJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQgPSAweGZmOworCisJcGFnaW5nX2luaXQoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCSAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKwlic2NfZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBtbmNjX3JlY3YpOworCWlmICghYnNjX2dzbW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlic2NfZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisJYnNjX2dzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKworCXRlbG5ldF9pbml0KGJzY19nc21uZXQsIDQyNDIpOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmJzY19nc21uZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWJvb3RzdHJhcF9idHMoYnRzKTsKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCXJjID0gZTFfcmVjb25maWdfYnRzKGJ0cyk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQgKDEpOworCX0KKworCS8qIGluaXRpYWxpemUgbmFub0JUUyBzdXBwb3J0IG9tY2UgKi8KKwlyYyA9IGlwYWNjZXNzX3NldHVwKGJzY19nc21uZXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfcmxsLmMgYi9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkNmYyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpAQCAtMCwwICsxLDExOCBAQAorLyogR1NNIEJTQyBSYWRpbyBMaW5rIExheWVyIEFQSQorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCitzdHJ1Y3QgYnNjX3JsbF9yZXEgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBsaW5rX2lkOworCisJdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICAgdm9pZCAqZGF0YSwgZW51bSBic2Nfcmxscl9pbmQpOworCXZvaWQgKmRhdGE7Cit9OworCisvKiB3ZSBvbmx5IGNvbXBhcmUgQzEsIEMyIGFuZCBTQVBJICovCisjZGVmaW5lIExJTktJRF9NQVNLCTB4QzcKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX3JsbF9yZXFzKTsKKworc3RhdGljIHZvaWQgY29tcGxldGVfcmxscihzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJbGxpc3RfZGVsKCZybGxyLT5saXN0KTsKKwlwdXRfbGNoYW4ocmxsci0+bGNoYW4pOworCXJsbHItPmNiKHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkLCBybGxyLT5kYXRhLCB0eXBlKTsKKwl0YWxsb2NfZnJlZShybGxyKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfY2Iodm9pZCAqX3JsbHIpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gX3JsbHI7CisKKwljb21wbGV0ZV9ybGxyKHJsbHIsIEJTQ19STExSX0lORF9USU1FT1VUKTsKK30KKworLyogZXN0YWJsaXNoIGEgUkxMIGNvbm5lY3Rpb24gd2l0aCBnaXZlbiBTQVBJIC8gcHJpb3JpdHkgKi8KK2ludCBybGxfZXN0YWJsaXNoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBzYXBpLAorCQkgIHZvaWQgKCpjYikoc3RydWN0IGdzbV9sY2hhbiAqLCB1X2ludDhfdCwgdm9pZCAqLAorCQkJICAgICBlbnVtIGJzY19ybGxyX2luZCksCisJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfcmxsX3JlcSk7CisJdV9pbnQ4X3QgbGlua19pZDsKKwlpZiAoIXJsbHIpCisJCXJldHVybiAtRU5PTUVNOworCisJbGlua19pZCA9IHNhcGk7CisKKwkvKiBJZiB3ZSBhcmUgYSBUQ0ggYW5kIG5vdCBpbiBzaWduYWxsaW5nIG1vZGUsIHdlIG5lZWQgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHRoZSBuZXcgUkxMIGNvbm5lY3Rpb24gaXMgdG8gYmUgbWFkZSBvbiB0aGUgU0FDQ0ggKi8KKwlpZiAoKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9UQ0hfRiB8fAorCSAgICAgbGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9IKSAmJgorCSAgICBsY2hhbi0+cnNsX2Ntb2RlICE9IFJTTF9DTU9EX1NQRF9TSUdOKQorCQlsaW5rX2lkIHw9IDB4NDA7CisKKwl1c2VfbGNoYW4obGNoYW4pOworCXJsbHItPmxjaGFuID0gbGNoYW47CisJcmxsci0+bGlua19pZCA9IGxpbmtfaWQ7CisJcmxsci0+Y2IgPSBjYjsKKwlybGxyLT5kYXRhID0gZGF0YTsKKworCWxsaXN0X2FkZCgmcmxsci0+bGlzdCwgJmJzY19ybGxfcmVxcyk7CisKKwlybGxyLT50aW1lci5jYiA9ICZ0aW1lcl9jYjsKKwlybGxyLT50aW1lci5kYXRhID0gcmxscjsKKworCWJzY19zY2hlZHVsZV90aW1lcigmcmxsci0+dGltZXIsIDEwLCAwKTsKKworCS8qIHNlbmQgdGhlIFJTTCBSTEwgRVNUYWJsaXNoIFJFUXVlc3QgKi8KKwlyZXR1cm4gcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkKTsKK30KKworLyogQ2FsbGVkIGZyb20gUlNMIGNvZGUgaW4gY2FzZSB3ZSBoYXZlIHJlY2VpdmVkIGFuIGluZGljYXRpb24gcmVnYXJkaW5nCisgKiBhbnkgUkxMIGxpbmsgKi8KK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyLCAqcmxscjI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJsbHIsIHJsbHIyLCAmYnNjX3JsbF9yZXFzLCBsaXN0KSB7CisJCWlmIChybGxyLT5sY2hhbiA9PSBsY2hhbiAmJgorCQkgICAgKHJsbHItPmxpbmtfaWQgJiBMSU5LSURfTUFTSykgPT0gKGxpbmtfaWQgJiBMSU5LSURfTUFTSykpIHsKKwkJCWJzY19kZWxfdGltZXIoJnJsbHItPnRpbWVyKTsKKwkJCWNvbXBsZXRlX3JsbHIocmxsciwgdHlwZSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpAQCAtMCwwICsxLDg0IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfbmFub2J0cyA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9OQU5PQlRTLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJLyogaXAuYWNjZXNzIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfVFYsIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRV0gPQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJTUlOR19CVVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DR0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXT0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19USUJfQ09OVFJPTF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVVBUSU1FXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NTTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkVWT0NfREFURV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX25hbm9idHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jIGIvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKQEAgLTAsMCArMSw2NiBAQAorLyogU2llbWVucyBCUy0xMSBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfYnMxMSA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9CUzExLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQkvKiBCUzExIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViB9LAkKKwkJCVtOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVZdID17IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX05BTUVdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CVFNfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FMV9TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BMTF9NT0RFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19UWVBFXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVsweDk1XSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF9iczExKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdlbmVyaWMgQlRTIC0gVlRZIGNvZGUgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBCVFMgYmVmb3JlIHR5cGUgaXMga25vd24gKi8KKworLyogKEMpIDIwMTAgYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX3Vua25vd24gPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfdW5rbm93bik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ODUyNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpAQCAtMCwwICsxLDQxOCBAQAorLyogR1NNIENoYW5uZWwgYWxsb2NhdGlvbiByb3V0aW5lcworICoKKyAqIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pOworCitzdGF0aWMgaW50IHRzX2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCS8qIEZJWE1FOiBIb3cgZG9lcyB0aGlzIGJlaGF2ZSBmb3IgQlMtMTEgPyAqLworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzWzBdOworCisJaWYgKHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJICAgIHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXRzLT5wY2hhbiA9IHBjaGFuOworCisJcmV0dXJuIHRzOworfQorCisvKiBBbGxvY2F0ZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJaW50IGo7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBmcm9tLCB0bzsKKworCQlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIHB1cmUgcG9saWN5LAorCQkgKiBubyByZXF1aXJlbWVudCB0byBwdXQgdGhpcyByZXN0cmljdGlvbiBpbiBwbGFjZSAqLworCQlpZiAodHJ4ID09IGJ0cy0+YzApIHsKKwkJCS8qIE9uIHRoZSBmaXJzdCBUUlggd2UgcnVuIG9uZSBDQ0NIIGFuZCBvbmUgU0RDQ0g4ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIOgorCQkJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCQkJZnJvbSA9IDA7IHRvID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCQkJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCQkJZnJvbSA9IDE7IHRvID0gNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEV2ZXJ5IHNlY29uZGFyeSBUUlggaXMgY29uZmlndXJlZCBmb3IgVENIL0YKKwkJCSAqIGFuZCBUQ0gvSCBvbmx5ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJCQlmcm9tID0gMTsgdG8gPSAxOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IGZyb207IGogPD0gdG87IGorKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2pdOworCisJCQlpZiAoIXRzX2lzX3VzYWJsZSh0cykpCisJCQkJY29udGludWU7CisKKwkJCWlmICh0cy0+cGNoYW4gPT0gR1NNX1BDSEFOX05PTkUpIHsKKwkJCQl0cy0+cGNoYW4gPSBwY2hhbjsKKwkJCQkvKiBzZXQgY2hhbm5lbCBhdHRyaWJ1dGUgb24gT01MICovCisJCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBhYmlzX25tX2NoY29tYjRwY2hhbihwY2hhbikpOworCQkJCXJldHVybiB0czsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnJlZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLwordm9pZCB0c19mcmVlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzdWJzbG90c19wZXJfcGNoYW5bXSA9IHsKKwlbR1NNX1BDSEFOX05PTkVdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XSA9IDQsCisJW0dTTV9QQ0hBTl9UQ0hfRl0gPSAxLAorCVtHU01fUENIQU5fVENIX0hdID0gMiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IDgsCisJLyogRklYTUU6IHdoYXQgYWJvdXQgZHluYW1pYyBUQ0hfRl9UQ0hfSCA/ICovCit9OworCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF90cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgaiwgc3M7CisKKwlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXRzID0gJnRyeC0+dHNbal07CisJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHMtPnBjaGFuICE9IHBjaGFuKQorCQkJY29udGludWU7CisJCS8qIGNoZWNrIGlmIGFsbCBzdWItc2xvdHMgYXJlIGFsbG9jYXRlZCB5ZXQgKi8KKwkJZm9yIChzcyA9IDA7IHNzIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3BjaGFuXTsgc3MrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGMgPSAmdHMtPmxjaGFuW3NzXTsKKwkJCWlmIChsYy0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSAmJgorCQkJICAgIGxjLT5zdGF0ZSA9PSBMQ0hBTl9TX05PTkUpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjOworCisJaWYgKGJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfSBlbHNlIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCisJLyogd2UgY2Fubm90IGFsbG9jYXRlIG1vcmUgb2YgdGhlc2UgKi8KKwlpZiAocGNoYW4gPT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwaHlzaWNhbAorCSAqIGNoYW5uZWwgZm9yIHRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSByZXF1ZXN0ZWQgKi8KKwl0cyA9IHRzX2FsbG9jKGJ0cywgcGNoYW4pOworCWlmICghdHMpIHsKKwkJLyogbm8gbW9yZSByYWRpbyByZXNvdXJjZXMgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmdHMtPmxjaGFuWzBdOworfQorCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBOVUxMOworCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZmlyc3QsIHNlY29uZDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1NEQ0NIOgorCQlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJCWZpcnN0ID0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOworCQkJc2Vjb25kID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCQl9IGVsc2UgeworCQkJZmlyc3QgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCX0KKworCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIGZpcnN0KTsKKwkJaWYgKGxjaGFuID09IE5VTEwpCisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIHNlY29uZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQlsY2hhbiA9X2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9IKTsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBUQ0gvSCBhdmFpbGFibGUsIGZhbGwtYmFjayB0byBUQ0gvRiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCQl0eXBlID0gR1NNX0xDSEFOX1RDSF9GOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIlVua25vd24gZ3NtX2NoYW5fdCAldVxuIiwgdHlwZSk7CisJfQorCisJaWYgKGxjaGFuKSB7CisJCWxjaGFuLT50eXBlID0gdHlwZTsKKwkJbGNoYW4tPnVzZV9jb3VudCA9IDA7CisKKwkJLyogY2xlYXIgc2FwaXMgKi8KKwkJbWVtc2V0KGxjaGFuLT5zYXBpcywgMCwgQVJSQVlfU0laRShsY2hhbi0+c2FwaXMpKTsKKworCQkvKiBjbGVhciBtdWx0aSByYXRlIGNvbmZpZyAqLworCQltZW1zZXQoJmxjaGFuLT5tcl9jb25mLCAwLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpKTsKKworCQkvKiBDb25maWd1cmUgdGhlIHRpbWUgYW5kIHN0YXJ0IGl0IHNvIGl0IHdpbGwgYmUgY2xvc2VkICovCisJCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmNiID0gYXV0b19yZWxlYXNlX2NoYW5uZWw7CisJCWxjaGFuLT5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKKwl9CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK3ZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaTsKKworCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJaWYgKGxjaGFuLT5zdWJzY3IpIHsKKwkJc3Vic2NyX3B1dChsY2hhbi0+c3Vic2NyKTsKKwkJbGNoYW4tPnN1YnNjciA9IE5VTEw7CisJfQorCisJLyogV2UgbWlnaHQga2lsbCBhbiBhY3RpdmUgY2hhbm5lbC4uLiAqLworCWlmIChsY2hhbi0+dXNlX2NvdW50ICE9IDApIHsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwgbGNoYW4pOworCQlsY2hhbi0+dXNlX2NvdW50ID0gMDsKKwl9CisKKwkvKiBzdG9wIHRoZSB0aW1lciAqLworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyKTsKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOworCisJLyogY2xlYXIgY2FjaGVkIG1lYXN1ZW1lbnQgcmVwb3J0cyAqLworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7IGkrKykgeworCQlsY2hhbi0+bWVhc19yZXBbaV0uZmxhZ3MgPSAwOworCQlsY2hhbi0+bWVhc19yZXBbaV0ubnIgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykKKwkJbGNoYW4tPm5laWdoX21lYXNbaV0uYXJmY24gPSAwOworCisJbGNoYW4tPnNpbGVudF9jYWxsID0gMDsKKworCS8qIEZJWE1FOiB0c19mcmVlKCkgdGhlIHRpbWVzbG90LCBpZiB3ZSdyZSB0aGUgbGFzdCBsb2dpY2FsCisJICogY2hhbm5lbCB1c2luZyBpdCAqLworfQorCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgbm93ICovCitpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWlmIChsY2hhbi0+dXNlX2NvdW50ID4gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc3N1bWUgd2UgaGF2ZSBHU00wNC4wOCBydW5uaW5nIGFuZCBzZW5kIGEgcmVsZWFzZSAqLworCWlmIChsY2hhbi0+c3Vic2NyKSB7CisJCWdzbTQ4X3NlbmRfcnJfcmVsZWFzZShsY2hhbik7CisJfQorCisJLyogc3Bvb2ZlZD8gbWVzc2FnZSAqLworCWlmIChsY2hhbi0+dXNlX2NvdW50IDwgMCkKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiQ2hhbm5lbCBjb3VudCBpcyBuZWdhdGl2ZTogJWRcbiIsCisJCQlsY2hhbi0+dXNlX2NvdW50KTsKKworCURFQlVHUChEUkxMLCAiJXMgUmVjeWNsaW5nIENoYW5uZWxcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX3JlbGVhc2VfcmVxdWVzdChsY2hhbiwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEF1dG8gcmVsZWFzZSB0aGUgY2hhbm5lbCB3aGVuIHRoZSB1c2UgY291bnQgaXMgemVybyAqLworc3RhdGljIHZvaWQgYXV0b19yZWxlYXNlX2NoYW5uZWwodm9pZCAqX2xjaGFuKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCisJaWYgKCFsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuKiBsY2hhbl9maW5kKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKSB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IHRzX25vLCBsY2hhbl9ubzsgCisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IDg7ICsrdHNfbm8pIHsKKwkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IFRTX01BWF9MQ0hBTjsgKytsY2hhbl9ubykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0KKwkJCQkJJnRyeC0+dHNbdHNfbm9dLmxjaGFuW2xjaGFuX25vXTsKKwkJCQlpZiAoc3Vic2NyID09IGxjaGFuLT5zdWJzY3IpCisJCQkJCXJldHVybiBsY2hhbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJbGNoYW4gPSBsY2hhbl9maW5kKGJ0cywgc3Vic2NyKTsKKwkJaWYgKGxjaGFuKQorCQkJcmV0dXJuIGxjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpbnQgaTsKKworCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdHJhbnhzY2VpdmVycyAqLworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJ4LT50cyk7IGkrKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2ldOworCQkJc3RydWN0IGxvYWRfY291bnRlciAqcGwgPSAmY2wtPnBjaGFuW3RzLT5wY2hhbl07CisJCQlpbnQgajsKKworCQkJLyogc2tpcCBhZG1pbmlzdHJhdGl2ZWx5IGRlYWN0aXZhdGVkIHRpbWVzbG90cyAqLworCQkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cy0+bm1fc3RhdGUpKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBqIDwgc3Vic2xvdHNfcGVyX3BjaGFuW3RzLT5wY2hhbl07IGorKykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gJnRzLT5sY2hhbltqXTsKKworCQkJCXBsLT50b3RhbCsrOworCisJCQkJc3dpdGNoIChsY2hhbi0+c3RhdGUpIHsKKwkJCQljYXNlIExDSEFOX1NfTk9ORToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcGwtPnVzZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit2b2lkIG5ldHdvcmtfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpwbCwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCW1lbXNldChwbCwgMCwgc2l6ZW9mKCpwbCkpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkKKwkJYnRzX2NoYW5fbG9hZChwbCwgYnRzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RiLmMgYi9vcGVuYnNjL3NyYy9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzFkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9kYi5jCkBAIC0wLDAgKzEsMTE3OSBAQAorLyogU2ltcGxlIEhMUi9WTFIgZGF0YWJhc2UgYmFja2VuZCB1c2luZyBkYmkgKi8KKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRiaS9kYmkuaD4KKworc3RhdGljIGNoYXIgKmRiX2Jhc2VuYW1lID0gTlVMTDsKK3N0YXRpYyBjaGFyICpkYl9kaXJuYW1lID0gTlVMTDsKK3N0YXRpYyBkYmlfY29ubiBjb25uOworCitzdGF0aWMgY2hhciAqY3JlYXRlX3N0bXRzW10gPSB7CisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIE1ldGEgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkia2V5IFRFWFQgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJ2YWx1ZSBURVhUIE5PVCBOVUxMIgorCQkiKSIsCisJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBNZXRhICIKKwkJIihrZXksIHZhbHVlKSAiCisJCSJWQUxVRVMgIgorCQkiKCdyZXZpc2lvbicsICcyJykiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTdWJzY3JpYmVyICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiaW1zaSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJleHRlbnNpb24gVEVYVCBVTklRVUUsICIKKwkJImF1dGhvcml6ZWQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJInRtc2kgVEVYVCBVTklRVUUsICIKKwkJImxhYyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVG9rZW4gKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInRva2VuIFRFWFQgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCwgIgorCQkiY2xhc3NtYXJrMSBOVU1FUklDLCAiCisJCSJjbGFzc21hcmsyIEJMT0IsICIKKwkJImNsYXNzbWFyazMgQkxPQiwgIgorCQkiaW1laSBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBFcXVpcG1lbnRXYXRjaCAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiZXF1aXBtZW50X2lkIE5VTUVSSUMgTk9UIE5VTEwsICIKKwkJIlVOSVFVRSAoc3Vic2NyaWJlcl9pZCwgZXF1aXBtZW50X2lkKSAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgU01TICgiCisJCS8qIG1ldGFkYXRhLCBub3QgcGFydCBvZiBzbXMgKi8KKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInNlbnQgVElNRVNUQU1QLCAiCisJCSJzZW5kZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmVjZWl2ZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVsaXZlcl9hdHRlbXB0cyBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkvKiBkYXRhIGRpcmVjdGx5IGNvcGllZC9kZXJpdmVkIGZyb20gU01TICovCisJCSJ2YWxpZF91bnRpbCBUSU1FU1RBTVAsICIKKwkJInJlcGx5X3BhdGhfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInN0YXR1c19yZXBfcmVxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInByb3RvY29sX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRhdGFfY29kaW5nX3NjaGVtZSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJ1ZF9oZHJfaW5kIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRlc3RfYWRkciBURVhULCAiCisJCSJ1c2VyX2RhdGEgQkxPQiwgIgkvKiBUUC1VRCAqLworCQkvKiBhZGRpdGlvbmFsIGRhdGEsIGludGVycHJldGVkIGZyb20gU01TICovCisJCSJoZWFkZXIgQkxPQiwgIgkJLyogVUQgSGVhZGVyICovCisJCSJ0ZXh0IFRFWFQgIgkJLyogZGVjb2RlZCBVRCBhZnRlciBVREggKi8KKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBWTFIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJsYXN0X2J0cyBOVU1FUklDIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBcGR1QmxvYnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJImFwZHVfaWRfZmxhZ3MgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJhcGR1IEJMT0IgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIENvdW50ZXJzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInRpbWVzdGFtcCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInZhbHVlIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCBOT1QgTlVMTCAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aEtleXMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBJTlRFR0VSIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiYWxnb3JpdGhtX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImEzYThfa2kgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aFR1cGxlcyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJpc3N1ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1c2VfY291bnQgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJImtleV9zZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicmFuZCBCTE9CIE5PVCBOVUxMLCAiCisJCSJzcmVzIEJMT0IgTk9UIE5VTEwsICIKKwkJImtjIEJMT0IgTk9UIE5VTEwgIgorCQkiKSIsCit9OworCit2b2lkIGRiX2Vycm9yX2Z1bmMoZGJpX2Nvbm4gY29ubiwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICptc2c7CisJZGJpX2Nvbm5fZXJyb3IoY29ubiwgJm1zZyk7CisJTE9HUChEREIsIExPR0xfRVJST1IsICJEQkk6ICVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RiX3JldmlzaW9uKHZvaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqcmV2OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwKKwkJCQkiU0VMRUNUIHZhbHVlIEZST00gTWV0YSBXSEVSRSBrZXk9J3JldmlzaW9uJyIpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV2ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInZhbHVlIik7CisJaWYgKCFyZXYgfHwgYXRvaShyZXYpICE9IDIpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCWRiaV9pbml0aWFsaXplKE5VTEwpOworCisJY29ubiA9IGRiaV9jb25uX25ldygic3FsaXRlMyIpOworCWlmIChjb25uID09IE5VTEwpIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX2Nvbm5fZXJyb3JfaGFuZGxlciggY29ubiwgZGJfZXJyb3JfZnVuYywgTlVMTCApOworCisJLyogTXlTUUwKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJob3N0IiwgImxvY2FsaG9zdCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInVzZXJuYW1lIiwgInlvdXJfbmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInBhc3N3b3JkIiwgInlvdXJfcGFzc3dvcmQiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJkYm5hbWUiLCAieW91cl9kYm5hbWUiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJlbmNvZGluZyIsICJVVEYtOCIpOworCSovCisKKwkvKiBTcUxpdGUgMyAqLworCWRiX2Jhc2VuYW1lID0gc3RyZHVwKG5hbWUpOworCWRiX2Rpcm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAic3FsaXRlM19kYmRpciIsIGRpcm5hbWUoZGJfZGlybmFtZSkpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsIGJhc2VuYW1lKGRiX2Jhc2VuYW1lKSk7CisKKwlpZiAoZGJpX2Nvbm5fY29ubmVjdChjb25uKSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWZyZWUoZGJfZGlybmFtZSk7CisJZnJlZShkYl9iYXNlbmFtZSk7CisJZGJfZGlybmFtZSA9IGRiX2Jhc2VuYW1lID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50IGRiX3ByZXBhcmUoKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3JlYXRlX3N0bXRzKTsgaSsrKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5KGNvbm4sIGNyZWF0ZV9zdG10c1tpXSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwKKwkJCSAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29tZSB0YWJsZS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJaWYgKGNoZWNrX2RiX3JldmlzaW9uKCkgPCAwKSB7CisJCUxPR1AoRERCLCBMT0dMX0ZBVEFMLCAiRGF0YWJhc2Ugc2NoZW1hIHJldmlzaW9uIGludmFsaWQsICIKKwkJCSJwbGVhc2UgdXBkYXRlIHlvdXIgZGF0YWJhc2Ugc2NoZW1hXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9maW5pKCkKK3sKKwlkYmlfY29ubl9jbG9zZShjb25uKTsKKwlkYmlfc2h1dGRvd24oKTsKKworCWlmIChkYl9kaXJuYW1lKQorCSAgICBmcmVlKGRiX2Rpcm5hbWUpOworCWlmIChkYl9iYXNlbmFtZSkKKwkgICAgZnJlZShkYl9iYXNlbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGNoYXIgKmltc2kpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBJcyB0aGlzIHN1YnNjcmliZXIga25vd24gaW4gdGhlIGRiPyAqLworCXN1YnNjciA9IGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7IAorCWlmIChzdWJzY3IpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSBTdWJzY3JpYmVyIHNldCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaW1zaSA9ICVzICIgLCBpbXNpKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgImZhaWxlZCB0byB1cGRhdGUgdGltZXN0YW1wXG4iKTsKKwkJZWxzZQorCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBzdWJzY3I7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5mbGFncyB8PSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUOworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gTlVMTDsKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIFN1YnNjcmliZXIgIgorCQkiKGltc2ksIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJXMsIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSAiLAorCQlpbXNpCisJKTsKKwlpZiAoIXJlc3VsdCkKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFN1YnNjcmliZXIgYnkgSU1TSS5cbiIpOworCXN1YnNjci0+bmV0ID0gbmV0OworCXN1YnNjci0+aWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCXN0cm5jcHkoc3Vic2NyLT5pbXNpLCBpbXNpLCBHU01fSU1TSV9MRU5HVEgtMSk7CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJTE9HUChEREIsIExPR0xfSU5GTywgIk5ldyBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzXG4iLCBzdWJzY3ItPmlkLCBzdWJzY3ItPmltc2kpOworCWRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3Vic2NyKTsKKwlyZXR1cm4gc3Vic2NyOworfQorCitzdGF0aWMgaW50IGdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwl1bnNpZ25lZCBjaGFyIGNtMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjbTIsICpjbTM7CisJc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwID0gJnN1YnNjci0+ZXF1aXBtZW50OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIlNFTEVDVCBlcXVpcG1lbnQuKiBGUk9NIEVxdWlwbWVudCxFcXVpcG1lbnRXYXRjaCAiCisJCQkJIldIRVJFIEVxdWlwbWVudFdhdGNoLmVxdWlwbWVudF9pZD1FcXVpcG1lbnQuaWQgIgorCQkJCSJBTkQgRXF1aXBtZW50V2F0Y2guc3Vic2NyaWJlcl9pZCA9ICVsbHUgIgorCQkJCSJPUkRFUiBCWSB1cGRhdGVkIERFU0MiLCBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJZXF1aXAtPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiaW1laSIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoZXF1aXAtPmltZWksIHN0cmluZywgc2l6ZW9mKGVxdWlwLT5pbWVpKSk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiY2xhc3NtYXJrMSIpOworCWlmIChzdHJpbmcpCisJCSBjbTEgPSBhdG9pKHN0cmluZykgJiAweGZmOworCWVxdWlwLT5jbGFzc21hcmsxID0gKigoc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgKikgJmNtMSk7CisKKwllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMiIpOworCWNtMiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmsyIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmsyX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMikpCisJCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMik7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmsyLCBjbTIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbik7CisKKwllcXVpcC0+Y2xhc3NtYXJrM19sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiY2xhc3NtYXJrMyIpOworCWNtMyA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJjbGFzc21hcmszIik7CisJaWYgKGVxdWlwLT5jbGFzc21hcmszX2xlbiA+IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMykpCisJCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMyk7CisJbWVtY3B5KGVxdWlwLT5jbGFzc21hcmszLCBjbTMsIGVxdWlwLT5jbGFzc21hcmszX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICphM2E4X2tpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCSBzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYWluZm8tPmF1dGhfYWxnbyA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJhbGdvcml0aG1faWQiKTsKKwlhaW5mby0+YTNhOF9raV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAiYTNhOF9raSIpOworCWEzYThfa2kgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiYTNhOF9raSIpOworCWlmIChhaW5mby0+YTNhOF9raV9sZW4gPiBzaXplb2YoYWluZm8tPmEzYThfa2kpKQorCQlhaW5mby0+YTNhOF9raV9sZW4gPSBzaXplb2YoYWluZm8tPmEzYThfa2lfbGVuKTsKKwltZW1jcHkoYWluZm8tPmEzYThfa2ksIGEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fYXV0aF9pbmZvIGFpbmZvX29sZDsKKwlpbnQgcmMsIHVwZDsKKwl1bnNpZ25lZCBjaGFyICpraV9zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGFpbmZvID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiREVMRVRFIEZST00gQXV0aEtleXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhaW5mby0+YTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuLCAma2lfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoS2V5cyAiCisJCQkJIihzdWJzY3JpYmVyX2lkLCBhbGdvcml0aG1faWQsIGEzYThfa2kpICIKKwkJCQkiVkFMVUVTICgldSwgJXUsICVzKSIsCisJCQkJc3Vic2NyLT5pZCwgYWluZm8tPmF1dGhfYWxnbywga2lfc3RyKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiVVBEQVRFIEF1dGhLZXlzICIKKwkJCQkiU0VUIGFsZ29yaXRobV9pZD0ldSwgYTNhOF9raT0lcyAiCisJCQkJIldIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJCWFpbmZvLT5hdXRoX2FsZ28sIGtpX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShraV9zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYjsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFR1cGxlcyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltZW1zZXQoYXR1cGxlLCAwLCBzaXplb2YoYXR1cGxlKSk7CisKKwlhdHVwbGUtPnVzZV9jb3VudCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJ1c2VfY291bnQiKTsKKwlhdHVwbGUtPmtleV9zZXEgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAia2V5X3NlcSIpOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInJhbmQiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnJhbmQpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJyYW5kIik7CisJbWVtY3B5KGF0dXBsZS0+cmFuZCwgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJzcmVzIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5zcmVzKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAic3JlcyIpOworCW1lbWNweShhdHVwbGUtPnNyZXMsIGJsb2IsIGxlbik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAia2MiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPmtjKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAia2MiKTsKKwltZW1jcHkoYXR1cGxlLT5rYywgYmxvYiwgbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7CisKK2Vycl9zaXplOgorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlPOworfQorCitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorCQkJICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgcmMsIHVwZDsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlX29sZDsKKwl1bnNpZ25lZCBjaGFyICpyYW5kX3N0ciwgKnNyZXNfc3RyLCAqa2Nfc3RyOworCisJLyogRGVsZXRpb24gPyAqLworCWlmIChhdHVwbGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlX29sZCwgc3Vic2NyKTsKKwlpZiAocmMgJiYgcmMgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIHJjOworCXVwZCA9IHJjID8gMCA6IDE7CisKKwkvKiBVcGRhdGUgLyBJbnNlcnQgKi8KKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPnJhbmQsIHNpemVvZihhdHVwbGUtPnJhbmQpLCAmcmFuZF9zdHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+c3Jlcywgc2l6ZW9mKGF0dXBsZS0+c3JlcyksICZzcmVzX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5rYywgc2l6ZW9mKGF0dXBsZS0+a2MpLCAma2Nfc3RyKTsKKworCWlmICghdXBkKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJJTlNFUlQgSU5UTyBBdXRoVHVwbGVzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGlzc3VlZCwgdXNlX2NvdW50LCAiCisJCQkJICJrZXlfc2VxLCByYW5kLCBzcmVzLCBrYykgIgorCQkJCSJWQUxVRVMgKCV1LCBkYXRldGltZSgnbm93JyksICV1LCAiCisJCQkJICIldSwgJXMsICVzLCAlcyApICIsCisJCQkJc3Vic2NyLT5pZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0cik7CisJfSBlbHNlIHsKKwkJY2hhciAqaXNzdWVkID0gYXR1cGxlLT5rZXlfc2VxID09IGF0dXBsZV9vbGQua2V5X3NlcSA/CisJCQkJCSJpc3N1ZWQiIDogImRhdGV0aW1lKCdub3cnKSI7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgaXNzdWVkPSVzLCB1c2VfY291bnQ9JXUsICIKKwkJCQkgImtleV9zZXE9JXUsIHJhbmQ9JXMsIHNyZXM9JXMsIGtjPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICV1IiwKKwkJCQlpc3N1ZWQsIGF0dXBsZS0+dXNlX2NvdW50LCBhdHVwbGUtPmtleV9zZXEsCisJCQkJcmFuZF9zdHIsIHNyZXNfc3RyLCBrY19zdHIsIHN1YnNjci0+aWQpOworCX0KKworCWZyZWUocmFuZF9zdHIpOworCWZyZWUoc3Jlc19zdHIpOworCWZyZWUoa2Nfc3RyKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkFTRV9RVUVSWSAiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWNoYXIgKnF1b3RlZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1RNU0k6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTjoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBleHRlbnNpb24gPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9JRDoKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpZCA9ICVzICIsIHF1b3RlZCk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEREIsIExPR0xfTk9USUNFLCAiVW5rbm93biBxdWVyeSBzZWxlY3RvciBmb3IgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJREVCVUdQKEREQiwgIkZhaWxlZCB0byBmaW5kIHRoZSBTdWJzY3JpYmVyLiAnJXUnICclcydcbiIsCisJCQlmaWVsZCwgaWQpOworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbXNpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmltc2ksIHN0cmluZywgR1NNX0lNU0lfTEVOR1RIKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0bXNpIik7CisJaWYgKHN0cmluZykKKwkJc3Vic2NyLT50bXNpID0gdG1zaV9mcm9tX3N0cmluZyhzdHJpbmcpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgIm5hbWUiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+bmFtZSwgc3RyaW5nLCBHU01fTkFNRV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImV4dGVuc2lvbiIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIHN0cmluZywgR1NNX0VYVEVOU0lPTl9MRU5HVEgpOworCisJc3Vic2NyLT5sYWMgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgImxhYyIpOworCXN1YnNjci0+YXV0aG9yaXplZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAiYXV0aG9yaXplZCIpOworCURFQlVHUChEREIsICJGb3VuZCBTdWJzY3JpYmVyOiBJRCAlbGx1LCBJTVNJICVzLCBOQU1FICclcycsIFRNU0kgJXUsIEVYVEVOICclcycsIExBQyAlaHUsIEFVVEggJXVcbiIsCisJCXN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSwgc3Vic2NyLT5uYW1lLCBzdWJzY3ItPnRtc2ksIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQlzdWJzY3ItPmxhYywgc3Vic2NyLT5hdXRob3JpemVkKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWdldF9lcXVpcG1lbnRfYnlfc3Vic2NyKHN1YnNjcik7CisKKwlyZXR1cm4gc3Vic2NyOworfQorCitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIgKnFfdG1zaTsKKworCWlmIChzdWJzY3JpYmVyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKSB7CisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sCisJCQkJICAgdG1zaSwKKwkJCQkgICAmcV90bXNpKTsKKwl9IGVsc2UKKwkJcV90bXNpID0gc3RyZHVwKCJOVUxMIik7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTdWJzY3JpYmVyICIKKwkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCSJuYW1lID0gJyVzJywgIgorCQkiZXh0ZW5zaW9uID0gJyVzJywgIgorCQkiYXV0aG9yaXplZCA9ICVpLCAiCisJCSJ0bXNpID0gJXMsICIKKwkJImxhYyA9ICVpICIKKwkJIldIRVJFIGltc2kgPSAlcyAiLAorCQlzdWJzY3JpYmVyLT5uYW1lLAorCQlzdWJzY3JpYmVyLT5leHRlbnNpb24sCisJCXN1YnNjcmliZXItPmF1dGhvcml6ZWQsCisJCXFfdG1zaSwKKwkJc3Vic2NyaWJlci0+bGFjLAorCQlzdWJzY3JpYmVyLT5pbXNpKTsKKworCWZyZWUocV90bXNpKTsKKworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBTdWJzY3JpYmVyIChieSBJTVNJKS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwl1X2ludDhfdCBjbGFzc21hcmsxOworCisJbWVtY3B5KCZjbGFzc21hcmsxLCAmZXF1aXAtPmNsYXNzbWFyazEsIHNpemVvZihjbGFzc21hcmsxKSk7CisJREVCVUdQKEREQiwgIlN5bmMgRXF1aXBtZW50IElNRUk9JXMsIGNsYXNzbWFyazE9JTAyeCIsCisJCWVxdWlwLT5pbWVpLCBjbGFzc21hcmsxKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMj0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmsyLCBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuKQorCQlERUJVR1BDKEREQiwgIiwgY2xhc3NtYXJrMz0lcyIsCisJCQloZXhkdW1wKGVxdWlwLT5jbGFzc21hcmszLCBlcXVpcC0+Y2xhc3NtYXJrM19sZW4pKTsKKwlERUJVR1BDKEREQiwgIlxuIik7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBlcXVpcC0+Y2xhc3NtYXJrMiwKKwkJCQkgICBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4sICZjbTIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmszLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmszX2xlbiwgJmNtMyk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBFcXVpcG1lbnQgU0VUICIKKwkJCSJ1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpLCAiCisJCQkiY2xhc3NtYXJrMSA9ICV1LCAiCisJCQkiY2xhc3NtYXJrMiA9ICVzLCAiCisJCQkiY2xhc3NtYXJrMyA9ICVzICIKKwkJIldIRVJFIGltZWkgPSAnJXMnICIsCisJCWNsYXNzbWFyazEsIGNtMiwgY20zLCBlcXVpcC0+aW1laSk7CisKKwlmcmVlKGNtMik7CisJZnJlZShjbTMpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJY2hhciB0bXNpWzE0XTsKKwljaGFyKiB0bXNpX3F1b3RlZDsKKworCWZvciAoOzspIHsKKwkJc3Vic2NyaWJlci0+dG1zaSA9IHJhbmQoKTsKKwkJaWYgKHN1YnNjcmliZXItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKHRtc2ksICIldSIsIHN1YnNjcmliZXItPnRtc2kpOworCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCB0bXNpLCAmdG1zaV9xdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIHRtc2kgPSAlcyAiLAorCQkJdG1zaV9xdW90ZWQpOworCisJCWZyZWUodG1zaV9xdW90ZWQpOworCisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgVE1TSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlERUJVR1AoRERCLCAiQWxsb2NhdGVkIFRNU0kgJXUgZm9yIElNU0kgJXMuXG4iLAorCQkJCXN1YnNjcmliZXItPnRtc2ksIHN1YnNjcmliZXItPmltc2kpOworCQkJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdCA9IE5VTEw7CisJdV9pbnQzMl90IHRyeTsKKworCWZvciAoOzspIHsKKwkJdHJ5ID0gKHJhbmQoKSUoR1NNX01BWF9FWFRFTi1HU01fTUlOX0VYVEVOKzEpK0dTTV9NSU5fRVhURU4pOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVpIiwKKwkJCXRyeQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlciAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IGV4dGVuc2lvbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSl7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlzcHJpbnRmKHN1YnNjcmliZXItPmV4dGVuc2lvbiwgIiVpIiwgdHJ5KTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIGV4dGVuc2lvbiAlaSBmb3IgSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKK30KKy8qCisgKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgdW5pcXVlIHRva2VuIGZvciB0aGlzIHN1YnNjcmliZXIgYW5kIHJldHVybiBpdAorICogdmlhIGEgcGFyYW1ldGVyLiBpZiB0aGUgc3Vic2NyaWJlciBhbHJlYWR5IGhhcyBhIHRva2VuLCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgdV9pbnQzMl90ICp0b2tlbikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSByYW5kKCk7CisJCWlmICghdHJ5KSAvKiAwIGlzIGFuIGludmFsaWQgdG9rZW4gKi8KKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbiAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgT1IgdG9rZW4gPSBcIiUwOFhcIiAiLAorCQkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBBdXRoVG9rZW4gIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyB0b2tlbi5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3MocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBdXRoVG9rZW4gIgorCQkiKHN1YnNjcmliZXJfaWQsIGNyZWF0ZWQsIHRva2VuKSAiCisJCSJWQUxVRVMgIgorCQkiKCVsbHUsIGRhdGV0aW1lKCdub3cnKSwgXCIlMDhYXCIpICIsCisJCXN1YnNjcmliZXItPmlkLCB0cnkpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0b2tlbiAlMDhYIGZvciAiCisJCQkiSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCXJldHVybiAxOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkqdG9rZW4gPSB0cnk7CisJREVCVUdQKEREQiwgIkFsbG9jYXRlZCB0b2tlbiAlMDhYIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlciwgY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGVxdWlwbWVudF9pZCwgd2F0Y2hfaWQ7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJuY3B5KHN1YnNjcmliZXItPmVxdWlwbWVudC5pbWVpLCBpbWVpLAorCQlzaXplb2Yoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWkpLTEpLAorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50ICIKKwkJIihpbWVpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1laSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudCBieSBJTUVJLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWVxdWlwbWVudF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkgeworCQllcXVpcG1lbnRfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCX0KKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCWlmIChlcXVpcG1lbnRfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50OiBJRCAlbGx1LCBJTUVJICVzXG4iLCBlcXVpcG1lbnRfaWQsIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgaWQgRlJPTSBFcXVpcG1lbnQgIgorCQkJIldIRVJFIGltZWkgPSAlcyAiLAorCQkJaW1laQorCQkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHRoZSBFcXVpcG1lbnQuXG4iKTsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXF1aXBtZW50X2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIEVxdWlwbWVudFdhdGNoICIKKwkJIihzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQsIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBFcXVpcG1lbnRXYXRjaC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3YXRjaF9pZCA9IDA7CisJaWYgKGRiaV9yZXN1bHRfZ2V0X251bXJvd3NfYWZmZWN0ZWQocmVzdWx0KSkKKwkJd2F0Y2hfaWQgPSBkYmlfY29ubl9zZXF1ZW5jZV9sYXN0KGNvbm4sIE5VTEwpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJaWYgKHdhdGNoX2lkKQorCQlERUJVR1AoRERCLCAiTmV3IEVxdWlwbWVudFdhdGNoOiBJRCAlbGx1LCBJTVNJICVzLCBJTUVJICVzXG4iLAorCQkJZXF1aXBtZW50X2lkLCBzdWJzY3JpYmVyLT5pbXNpLCBpbWVpKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiVVBEQVRFIEVxdWlwbWVudFdhdGNoICIKKwkJCSJTRVQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZCA9ICVsbHUgQU5EIGVxdWlwbWVudF9pZCA9ICVsbHUgIiwKKwkJCXN1YnNjcmliZXItPmlkLCBlcXVpcG1lbnRfaWQpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJREVCVUdQKEREQiwgIlVwZGF0ZWQgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzdG9yZSBhbiBbdW5zZW50XSBTTVMgdG8gdGhlIGRhdGFiYXNlICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV90ZXh0LCAqcV9kYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpxX3VkYXRhOworCWNoYXIgKnZhbGlkaXR5X3RpbWVzdGFtcCA9ICIyMjIyLTItMiI7CisKKwkvKiBGSVhNRTogZ2VuZXJhdGUgdmFsaWRpdHkgdGltZXN0YW1wIGJhc2VkIG9uIHZhbGlkaXR5X21pbnV0ZXMgKi8KKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT50ZXh0LCAmcV90ZXh0KTsKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCAoY2hhciAqKXNtcy0+ZGVzdF9hZGRyLCAmcV9kYWRkcik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgc21zLT51c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbiwKKwkJCQkgICAmcV91ZGF0YSk7CisJLyogRklYTUU6IGNvcnJlY3QgdmFsaWRpdHkgcGVyaW9kICovCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTTVMgIgorCQkiKGNyZWF0ZWQsIHNlbmRlcl9pZCwgcmVjZWl2ZXJfaWQsIHZhbGlkX3VudGlsLCAiCisJCSAicmVwbHlfcGF0aF9yZXEsIHN0YXR1c19yZXBfcmVxLCBwcm90b2NvbF9pZCwgIgorCQkgImRhdGFfY29kaW5nX3NjaGVtZSwgdWRfaGRyX2luZCwgZGVzdF9hZGRyLCAiCisJCSAidXNlcl9kYXRhLCB0ZXh0KSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwgJWxsdSwgJWxsdSwgJXUsICIKKwkJICIldSwgJXUsICV1LCAldSwgJXUsICVzLCAlcywgJXMpIiwKKwkJc21zLT5zZW5kZXItPmlkLAorCQlzbXMtPnJlY2VpdmVyID8gc21zLT5yZWNlaXZlci0+aWQgOiAwLCB2YWxpZGl0eV90aW1lc3RhbXAsCisJCXNtcy0+cmVwbHlfcGF0aF9yZXEsIHNtcy0+c3RhdHVzX3JlcF9yZXEsIHNtcy0+cHJvdG9jb2xfaWQsCisJCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lLCBzbXMtPnVkX2hkcl9pbmQsCisJCXFfZGFkZHIsIHFfdWRhdGEsIHFfdGV4dCk7CisJZnJlZShxX3RleHQpOworCWZyZWUocV9kYWRkcik7CisJZnJlZShxX3VkYXRhKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3Jlc3VsdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZGJpX3Jlc3VsdCByZXN1bHQpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNtc19hbGxvYygpOworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgc2VuZGVyX2lkLCByZWNlaXZlcl9pZDsKKwljb25zdCBjaGFyICp0ZXh0LCAqZGFkZHI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9kYXRhOworCisJaWYgKCFzbXMpCisJCXJldHVybiBOVUxMOworCisJc21zLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc2VuZGVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInNlbmRlcl9pZCIpOworCXNtcy0+c2VuZGVyID0gc3Vic2NyX2dldF9ieV9pZChuZXQsIHNlbmRlcl9pZCk7CisKKwlyZWNlaXZlcl9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJyZWNlaXZlcl9pZCIpOworCXNtcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgcmVjZWl2ZXJfaWQpOworCisJLyogRklYTUU6IHZhbGlkaXR5ICovCisJLyogRklYTUU6IHRob3NlIHNob3VsZCBhbGwgYmUgZ2V0X3VjaGFyLCBidXQgc3FsaXRlMyBpcyBicmFpbmRlYWQgKi8KKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJyZXBseV9wYXRoX3JlcSIpOworCXNtcy0+c3RhdHVzX3JlcF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInN0YXR1c19yZXBfcmVxIik7CisJc21zLT51ZF9oZHJfaW5kID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJ1ZF9oZHJfaW5kIik7CisJc21zLT5wcm90b2NvbF9pZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAicHJvdG9jb2xfaWQiKTsKKwlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LAorCQkJCQkJICAiZGF0YV9jb2Rpbmdfc2NoZW1lIik7CisJLyogc21zLT5tc2dfcmVmIGlzIHRlbXBvcmFyeSBhbmQgbm90IHN0b3JlZCBpbiBEQiAqLworCisJZGFkZHIgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZGVzdF9hZGRyIik7CisJaWYgKGRhZGRyKSB7CisJCXN0cm5jcHkoc21zLT5kZXN0X2FkZHIsIGRhZGRyLCBzaXplb2Yoc21zLT5kZXN0X2FkZHIpKTsKKwkJc21zLT5kZXN0X2FkZHJbc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xXSA9ICdcMCc7CisJfQorCisJc21zLT51c2VyX2RhdGFfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInVzZXJfZGF0YSIpOworCXVzZXJfZGF0YSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJ1c2VyX2RhdGEiKTsKKwlpZiAoc21zLT51c2VyX2RhdGFfbGVuID4gc2l6ZW9mKHNtcy0+dXNlcl9kYXRhKSkKKwkJc21zLT51c2VyX2RhdGFfbGVuID0gKHVfaW50OF90KSBzaXplb2Yoc21zLT51c2VyX2RhdGEpOworCW1lbWNweShzbXMtPnVzZXJfZGF0YSwgdXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJdGV4dCA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ0ZXh0Iik7CisJaWYgKHRleHQpIHsKKwkJc3RybmNweShzbXMtPnRleHQsIHRleHQsIHNpemVvZihzbXMtPnRleHQpKTsKKwkJc21zLT50ZXh0W3NpemVvZihzbXMtPnRleHQpLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyB3aXRoIElEID49IG1pbl9pZCAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLmlkID49ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJbWluX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1pbl9zdWJzY3JfaWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIiAKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5yZWNlaXZlcl9pZCwgaWQgTElNSVQgMSIsCisJCW1pbl9zdWJzY3JfaWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQobmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCisvKiByZXRyaWV2ZSB0aGUgbmV4dCB1bnNlbnQgU01TIGZvciBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLnJlY2VpdmVyX2lkID0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLmlkIExJTUlUIDEiLAorCQlzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KHN1YnNjci0+bmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCisvKiBtYXJrIGEgZ2l2ZW4gU01TIGFzIHJlYWQgKi8KK2ludCBkYl9zbXNfbWFya19zZW50KHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTTVMgIgorCQkiU0VUIHNlbnQgPSBkYXRldGltZSgnbm93JykgIgorCQkiV0hFUkUgaWQgPSAlbGx1Iiwgc21zLT5pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gbWFyayBTTVMgJWxsdSBhcyBzZW50LlxuIiwgc21zLT5pZCk7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCisvKiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRlZCBkZWxpdmVyaWVzICovCitpbnQgZGJfc21zX2luY19kZWxpdmVyX2F0dGVtcHRzKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlVQREFURSBTTVMgIgorCQkiU0VUIGRlbGl2ZXJfYXR0ZW1wdHMgPSBkZWxpdmVyX2F0dGVtcHRzICsgMSAiCisJCSJXSEVSRSBpZCA9ICVsbHUiLCBzbXMtPmlkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBpbmMgZGVsaXZlciBhdHRlbXB0cyBmb3IgIgorCQkJIlNNUyAlbGx1LlxuIiwgc21zLT5pZCk7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCAKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKnFfYXBkdTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGFwZHUsIGxlbiwgJnFfYXBkdSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEFwZHVCbG9icyAiCisJCSIoY3JlYXRlZCxzdWJzY3JpYmVyX2lkLGFwZHVfaWRfZmxhZ3MsYXBkdSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJWxsdSwldSwlcykiLAorCQlzdWJzY3ItPmlkLCBhcGR1X2lkX2ZsYWdzLCBxX2FwZHUpOworCisJZnJlZShxX2FwZHUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV9uYW1lOworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyLT5uYW1lLCAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQ291bnRlcnMgIgorCQkiKHRpbWVzdGFtcCxuYW1lLHZhbHVlKSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlcywlbHUpIiwgcV9uYW1lLCBjdHItPnZhbHVlKTsKKworCWZyZWUocV9uYW1lKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGVidWcuYyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiNTMwOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIERlYnVnZ2luZy9Mb2dnaW5nIHN1cHBvcnQgY29kZSAqLworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisvKiBkZWZhdWx0IGNhdGVnb3JpZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgZGVmYXVsdF9jYXRlZ29yaWVzW0RlYnVnX0xhc3RFbnRyeV0gPSB7CisgICAgW0RSTExdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RDQ10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE5NXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUlJdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RSU0xdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RNTV0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9JTkZPIH0sCisgICAgW0RNTkNDXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEU01TXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUEFHXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUVBU10JPSB7IC5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1JXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUlCXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETVVYXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtESU5QXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEU0NDUF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1TQ10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1HQ1BdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RIT10JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRERCXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEUkVGXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorfTsKKworc3RydWN0IGRlYnVnX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqY29sb3I7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJaW50IG51bWJlcjsKKwlpbnQgcG9zaXRpb247Cit9OworCitzdHJ1Y3QgZGVidWdfY29udGV4dCB7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfY29udGV4dCBkZWJ1Z19jb250ZXh0Oworc3RhdGljIHZvaWQgKnRhbGxfZGJnX2N0eCA9IE5VTEw7CitzdGF0aWMgTExJU1RfSEVBRCh0YXJnZXRfbGlzdCk7CisKKyNkZWZpbmUgREVCVUdfQ0FURUdPUlkoTlVNQkVSLCBOQU1FLCBDT0xPUiwgREVTQ1JJUFRJT04pIFwKKwl7IC5uYW1lID0gTkFNRSwgLmNvbG9yID0gQ09MT1IsIC5kZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OLCAubnVtYmVyID0gTlVNQkVSIH0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdfaW5mbyBkZWJ1Z19pbmZvW10gPSB7CisJREVCVUdfQ0FURUdPUlkoRFJMTCwgICJEUkxMIiwgIlwwMzNbMTszMW0iLCAiIikKKwlERUJVR19DQVRFR09SWShEQ0MsICAgIkRDQyIsICAiXDAzM1sxOzMybSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNTSwgICAiRE1NIiwgICJcMDMzWzE7MzNtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRFJSLCAgICJEUlIiLCAgIlwwMzNbMTszNG0iLCAiIikKKwlERUJVR19DQVRFR09SWShEUlNMLCAgIkRSU0wiLCAiXDAzM1sxOzM1bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKEROTSwgICAiRE5NIiwgICJcMDMzWzE7MzZtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRFNNUywgICJEU01TIiwgIlwwMzNbMTszN20iLCAiIikKKwlERUJVR19DQVRFR09SWShEUEFHLCAgIkRQQUciLCAiXDAzM1sxOzM4bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNTkNDLCAiRE1OQ0MiLCJcMDMzWzE7MzltIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRElOUCwgICJESU5QIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNSSwgICJETUkiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1JQiwgICJETUlCIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNVVgsICAiRE1VWCIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShETUVBUywgICJETUVBUyIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShEU0NDUCwgIkRTQ0NQIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNU0MsICJETVNDIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNR0NQLCAiRE1HQ1AiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoREhPLCAiREhPIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKEREQiwgIkREQiIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShEUkVGLCAiRFJFRiIsICIiLCAiIikKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxvZ2xldmVsX3N0cnNbXSA9IHsKKwl7IDAsCSJFVkVSWVRISU5HIiB9LAorCXsgMSwJIkRFQlVHIiB9LAorCXsgMywJIklORk8iIH0sCisJeyA1LAkiTk9USUNFIiB9LAorCXsgNywJIkVSUk9SIiB9LAorCXsgOCwJIkZBVEFMIiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworaW50IGRlYnVnX3BhcnNlX2xldmVsKGNvbnN0IGNoYXIgKmx2bCkKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShsb2dsZXZlbF9zdHJzLCBsdmwpOworfQorCitpbnQgZGVidWdfcGFyc2VfY2F0ZWdvcnkoY29uc3QgY2hhciAqY2F0ZWdvcnkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z19pbmZvKTsgKytpKSB7CisJCWlmICghc3RyY2FzZWNtcChkZWJ1Z19pbmZvW2ldLm5hbWUrMSwgY2F0ZWdvcnkpKQorCQkJcmV0dXJuIGRlYnVnX2luZm9baV0ubnVtYmVyOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUGFyc2UgdGhlIGNhdGVnb3J5IG1hc2suCisgKiBUaGUgZm9ybWF0IGNhbiBiZSB0aGlzOiBjYXRlZ29yeTE6Y2F0ZWdvcnkyOmNhdGVnb3J5MworICogb3IgY2F0ZWdvcnkxLDI6Y2F0ZWdvcnkyLDM6Li4uCisgKi8KK3ZvaWQgZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdHJ1Y3QgZGVidWdfdGFyZ2V0KiB0YXJnZXQsIGNvbnN0IGNoYXIgKl9tYXNrKQoreworCWludCBpID0gMDsKKwljaGFyICptYXNrID0gc3RyZHVwKF9tYXNrKTsKKwljaGFyICpjYXRlZ29yeV90b2tlbiA9IE5VTEw7CisKKwkvKiBEaXNhYmxlIGV2ZXJ5dGhpbmcgdG8gZW5hYmxlIGl0IGFmdGVyd2FyZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXQtPmNhdGVnb3JpZXMpOyArK2kpCisJCXRhcmdldC0+Y2F0ZWdvcmllc1tpXS5lbmFibGVkID0gMDsKKworCWNhdGVnb3J5X3Rva2VuID0gc3RydG9rKG1hc2ssICI6Iik7CisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z19pbmZvKTsgKytpKSB7CisJCQljaGFyKiBjb2xvbiA9IHN0cnN0cihjYXRlZ29yeV90b2tlbiwgIiwiKTsKKwkJCWludCBsZW5ndGggPSBzdHJsZW4oY2F0ZWdvcnlfdG9rZW4pOworCisJCQlpZiAoY29sb24pCisJCQkgICAgbGVuZ3RoID0gY29sb24gLSBjYXRlZ29yeV90b2tlbjsKKworCQkJaWYgKHN0cm5jYXNlY21wKGRlYnVnX2luZm9baV0ubmFtZSwgY2F0ZWdvcnlfdG9rZW4sIGxlbmd0aCkgPT0gMCkgeworCQkJCWludCBudW1iZXIgPSBkZWJ1Z19pbmZvW2ldLm51bWJlcjsKKwkJCQlpbnQgbGV2ZWwgPSAwOworCisJCQkJaWYgKGNvbG9uKQorCQkJCQlsZXZlbCA9IGF0b2koY29sb24rMSk7CisKKwkJCQl0YXJnZXQtPmNhdGVnb3JpZXNbbnVtYmVyXS5lbmFibGVkID0gMTsKKwkJCQl0YXJnZXQtPmNhdGVnb3JpZXNbbnVtYmVyXS5sb2dsZXZlbCA9IGxldmVsOworCQkJfQorCQl9CisJfSB3aGlsZSAoKGNhdGVnb3J5X3Rva2VuID0gc3RydG9rKE5VTEwsICI6IikpKTsKKworCWZyZWUobWFzayk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb2xvcihpbnQgc3Vic3lzKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKKwkJaWYgKGRlYnVnX2luZm9baV0ubnVtYmVyID09IHN1YnN5cykKKwkJCXJldHVybiBkZWJ1Z19pbmZvW2ldLmNvbG9yOworCX0KKworCXJldHVybiAiIjsKK30KKworc3RhdGljIHZvaWQgX291dHB1dChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkgICAgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwljaGFyIGNvbFszMF07CisJY2hhciBzdWJbMzBdOworCWNoYXIgdGltWzMwXTsKKwljaGFyIGJ1Zls0MDk2XTsKKwljaGFyIGZpbmFsWzQwOTZdOworCisJLyogcHJlcGFyZSB0aGUgZGF0YSAqLworCWNvbFswXSA9ICdcMCc7CisJc3ViWzBdID0gJ1wwJzsKKwl0aW1bMF0gPSAnXDAnOworCWJ1ZlswXSA9ICdcMCc7CisKKwkvKiBhcmUgd2UgdXNpbmcgY29sb3IgKi8KKwlpZiAodGFyZ2V0LT51c2VfY29sb3IpIHsKKwkJc25wcmludGYoY29sLCBzaXplb2YoY29sKSwgIiVzIiwgY29sb3Ioc3Vic3lzKSk7CisJCWNvbFtzaXplb2YoY29sKS0xXSA9ICdcMCc7CisJfQorCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGFwKTsKKwlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCisJaWYgKCFjb250KSB7CisJCWlmICh0YXJnZXQtPnByaW50X3RpbWVzdGFtcCkgeworCQkJY2hhciAqdGltZXN0cjsKKwkJCXRpbWVfdCB0bTsKKwkJCXRtID0gdGltZShOVUxMKTsKKwkJCXRpbWVzdHIgPSBjdGltZSgmdG0pOworCQkJdGltZXN0cltzdHJsZW4odGltZXN0ciktMV0gPSAnXDAnOworCQkJc25wcmludGYodGltLCBzaXplb2YodGltKSwgIiVzICIsIHRpbWVzdHIpOworCQkJdGltW3NpemVvZih0aW0pLTFdID0gJ1wwJzsKKwkJfQorCQlzbnByaW50ZihzdWIsIHNpemVvZihzdWIpLCAiPCU0LjR4PiAlczolZCAiLCBzdWJzeXMsIGZpbGUsIGxpbmUpOworCQlzdWJbc2l6ZW9mKHN1YiktMV0gPSAnXDAnOworCX0KKworCXNucHJpbnRmKGZpbmFsLCBzaXplb2YoZmluYWwpLCAiJXMlcyVzJXNcMDMzWzA7bSIsIGNvbCwgdGltLCBzdWIsIGJ1Zik7CisJZmluYWxbc2l6ZW9mKGZpbmFsKS0xXSA9ICdcMCc7CisJdGFyZ2V0LT5vdXRwdXQodGFyZ2V0LCBmaW5hbCk7Cit9CisKKworc3RhdGljIHZvaWQgX2RlYnVncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBpbnQgbGV2ZWwsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkgICAgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXIsICZ0YXJnZXRfbGlzdCwgZW50cnkpIHsKKwkJc3RydWN0IGRlYnVnX2NhdGVnb3J5ICpjYXRlZ29yeTsKKwkJaW50IG91dHB1dCA9IDA7CisKKwkJY2F0ZWdvcnkgPSAmdGFyLT5jYXRlZ29yaWVzW3N1YnN5c107CisJCS8qIHN1YnN5c3RlbSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgZGVidWdnZWQgKi8KKwkJaWYgKCFjYXRlZ29yeS0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHRoZSBnbG9iYWwgbG9nIGxldmVsICovCisJCWlmICh0YXItPmxvZ2xldmVsICE9IDAgJiYgbGV2ZWwgPCB0YXItPmxvZ2xldmVsKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgdGhlIGNhdGVnb3J5IGxvZyBsZXZlbCAqLworCQlpZiAoY2F0ZWdvcnktPmxvZ2xldmVsICE9IDAgJiYgbGV2ZWwgPCBjYXRlZ29yeS0+bG9nbGV2ZWwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBBcHBseSBmaWx0ZXJzIGhlcmUuLi4gaWYgdGhhdCBiZWNvbWVzIG1lc3N5IHdlIHdpbGwgbmVlZCB0byBwdXQKKwkJICogZmlsdGVycyBpbiBhIGxpc3QgYW5kIGVhY2ggZmlsdGVyIHdpbGwgc2F5IHN0b3AsIGNvbnRpbnVlLCBvdXRwdXQKKwkJICovCisJCWlmICgodGFyLT5maWx0ZXJfbWFwICYgREVCVUdfRklMVEVSX0FMTCkgIT0gMCkgeworCQkJb3V0cHV0ID0gMTsKKwkJfSBlbHNlIGlmICgodGFyLT5maWx0ZXJfbWFwICYgREVCVUdfRklMVEVSX0lNU0kpICE9IDAKKwkJCSAgICAgICYmIGRlYnVnX2NvbnRleHQuc3Vic2NyICYmIHN0cmNtcChkZWJ1Z19jb250ZXh0LnN1YnNjci0+aW1zaSwgdGFyLT5pbXNpX2ZpbHRlcikgPT0gMCkgeworCQkJb3V0cHV0ID0gMTsKKwkJfQorCisJCWlmIChvdXRwdXQpIHsKKwkJCS8qIEZJWE1FOiBjb3B5aW5nIHRoZSB2YV9saXN0IGlzIGFuIHVnbHkgd29ya2Fyb3VuZCBhZ2FpbnN0IGEgYnVnCisJCQkgKiBoaWRkZW4gc29tZXdoZXJlIGluIF9vdXRwdXQuICBJZiB3ZSBkbyBub3QgY29weSBoZXJlLCB0aGUgZmlyc3QKKwkJCSAqIGNhbGwgdG8gX291dHB1dCgpIHdpbGwgY29ycnVwdCB0aGUgdmFfbGlzdCBjb250ZW50cywgYW5kIGFueQorCQkJICogZnVydGhlciBfb3V0cHV0KCkgY2FsbHMgd2l0aCB0aGUgc2FtZSB2YV9saXN0IHdpbGwgc2VnZmF1bHQgKi8KKwkJCXZhX2xpc3QgYnA7CisJCQl2YV9jb3B5KGJwLCBhcCk7CisJCQlfb3V0cHV0KHRhciwgc3Vic3lzLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGJwKTsKKwkJCXZhX2VuZChicCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgZGVidWdwKHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCV9kZWJ1Z3Aoc3Vic3lzLCBMT0dMX0RFQlVHLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCit2b2lkIGRlYnVncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfZGVidWdwKHN1YnN5cywgbGV2ZWwsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyBjaGFyIGhleGRfYnVmZls0MDk2XTsKKworY2hhciAqaGV4ZHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciAqY3VyID0gaGV4ZF9idWZmOworCisJaGV4ZF9idWZmWzBdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IGxlbl9yZW1haW4gPSBzaXplb2YoaGV4ZF9idWZmKSAtIChjdXIgLSBoZXhkX2J1ZmYpOworCQlpbnQgcmMgPSBzbnByaW50ZihjdXIsIGxlbl9yZW1haW4sICIlMDJ4ICIsIGJ1ZltpXSk7CisJCWlmIChyYyA8PSAwKQorCQkJYnJlYWs7CisJCWN1ciArPSByYzsKKwl9CisJaGV4ZF9idWZmW3NpemVvZihoZXhkX2J1ZmYpLTFdID0gMDsKKwlyZXR1cm4gaGV4ZF9idWZmOworfQorCisKKwordm9pZCBkZWJ1Z19hZGRfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCkKK3sKKwlsbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5lbnRyeSwgJnRhcmdldF9saXN0KTsKK30KKwordm9pZCBkZWJ1Z19kZWxfdGFyZ2V0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCkKK3sKKwlsbGlzdF9kZWwoJnRhcmdldC0+ZW50cnkpOworfQorCit2b2lkIGRlYnVnX3Jlc2V0X2NvbnRleHQodm9pZCkKK3sKKwltZW1zZXQoJmRlYnVnX2NvbnRleHQsIDAsIHNpemVvZihkZWJ1Z19jb250ZXh0KSk7Cit9CisKKy8qIGN1cnJlbnRseSB3ZSBhcmUgbm90IHJlZmZpbmcgdGhlc2UgKi8KK3ZvaWQgZGVidWdfc2V0X2NvbnRleHQoaW50IGN0eCwgdm9pZCAqdmFsdWUpCit7CisJc3dpdGNoIChjdHgpIHsKKwljYXNlIEJTQ19DVFhfTENIQU46CisJCWRlYnVnX2NvbnRleHQubGNoYW4gPSAoc3RydWN0IGdzbV9sY2hhbiAqKSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBCU0NfQ1RYX1NVQlNDUjoKKwkJZGVidWdfY29udGV4dC5zdWJzY3IgPSAoc3RydWN0IGdzbV9zdWJzY3JpYmVyICopIHZhbHVlOworCQlicmVhazsKKwljYXNlIEJTQ19DVFhfQlRTOgorCQlkZWJ1Z19jb250ZXh0LmJ0cyA9IChzdHJ1Y3QgZ3NtX2J0cyAqKSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBCU0NfQ1RYX1NDQ1A6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBkZWJ1Z19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKQoreworCWlmIChpbXNpKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSBERUJVR19GSUxURVJfSU1TSTsKKwkJdGFyZ2V0LT5pbXNpX2ZpbHRlciA9IHRhbGxvY19zdHJkdXAodGFyZ2V0LCBpbXNpKTsKKwl9IGVsc2UgaWYgKHRhcmdldC0+aW1zaV9maWx0ZXIpIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwICY9IH5ERUJVR19GSUxURVJfSU1TSTsKKwkJdGFsbG9jX2ZyZWUodGFyZ2V0LT5pbXNpX2ZpbHRlcik7CisJCXRhcmdldC0+aW1zaV9maWx0ZXIgPSBOVUxMOworCX0KK30KKwordm9pZCBkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBhbGwpCit7CisJaWYgKGFsbCkKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwIHw9IERFQlVHX0ZJTFRFUl9BTEw7CisJZWxzZQorCQl0YXJnZXQtPmZpbHRlcl9tYXAgJj0gfkRFQlVHX0ZJTFRFUl9BTEw7Cit9CisKK3ZvaWQgZGVidWdfc2V0X3VzZV9jb2xvcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCB1c2VfY29sb3IpCit7CisJdGFyZ2V0LT51c2VfY29sb3IgPSB1c2VfY29sb3I7Cit9CisKK3ZvaWQgZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBwcmludF90aW1lc3RhbXApCit7CisJdGFyZ2V0LT5wcmludF90aW1lc3RhbXAgPSBwcmludF90aW1lc3RhbXA7Cit9CisKK3ZvaWQgZGVidWdfc2V0X2xvZ19sZXZlbChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpCit7CisJdGFyZ2V0LT5sb2dsZXZlbCA9IGxvZ19sZXZlbDsKK30KKwordm9pZCBkZWJ1Z19zZXRfY2F0ZWdvcnlfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGNhdGVnb3J5LCBpbnQgZW5hYmxlLCBpbnQgbGV2ZWwpCit7CisJaWYgKGNhdGVnb3J5ID49IERlYnVnX0xhc3RFbnRyeSkKKwkJcmV0dXJuOworCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0uZW5hYmxlZCA9ICEhZW5hYmxlOworCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKK30KKworc3RhdGljIHZvaWQgX3N0ZGVycl9vdXRwdXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpsb2cpCit7CisJZnByaW50Zih0YXJnZXQtPnRndF9zdGRvdXQub3V0LCAiJXMiLCBsb2cpOworCWZmbHVzaCh0YXJnZXQtPnRndF9zdGRvdXQub3V0KTsKK30KKworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IHRhbGxvY196ZXJvKHRhbGxfZGJnX2N0eCwgc3RydWN0IGRlYnVnX3RhcmdldCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZ0YXJnZXQtPmVudHJ5KTsKKwltZW1jcHkodGFyZ2V0LT5jYXRlZ29yaWVzLCBkZWZhdWx0X2NhdGVnb3JpZXMsIHNpemVvZihkZWZhdWx0X2NhdGVnb3JpZXMpKTsKKwl0YXJnZXQtPnVzZV9jb2xvciA9IDE7CisJdGFyZ2V0LT5wcmludF90aW1lc3RhbXAgPSAwOworCXRhcmdldC0+bG9nbGV2ZWwgPSAwOworCXJldHVybiB0YXJnZXQ7Cit9CisKK3N0cnVjdCBkZWJ1Z190YXJnZXQgKmRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKHZvaWQpCit7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZSgpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXRhcmdldC0+dGd0X3N0ZG91dC5vdXQgPSBzdGRlcnI7CisJdGFyZ2V0LT5vdXRwdXQgPSBfc3RkZXJyX291dHB1dDsKKwlyZXR1cm4gdGFyZ2V0OworfQorCit2b2lkIGRlYnVnX2luaXQodm9pZCkKK3sKKwl0YWxsX2RiZ19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgImRlYnVnIik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9jb25maWcuYyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9lMV9jb25maWcuYwpAQCAtMCwwICsxLDIzNiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBTQVBJX0wyTUwJMAorI2RlZmluZSBTQVBJX09NTAk2MgorI2RlZmluZSBTQVBJX1JTTAkwCS8qIDYzID8gKi8KKworLyogVGhlIGUxX3JlY29uZmlnXyooKSBmdW5jdGlvbnMgYmVsb3cgdGFsZSB0aGUgY29uZmlndXJhdGlvbiBwcmVzZW50IGluIHRoZQorICogYnRzL3RyeC90cyBkYXRhIHN0cnVjdHVyZXMgYW5kIGVuc3VyZSB0aGUgRTEgY29uZmlndXJhdGlvbiByZWZsZWN0cyB0aGUKKyAqIHRpbWVzbG90L3N1YnNsb3QvVEVJIGNvbmZpZ3VyYXRpb24gKi8KKworaW50IGUxX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJnRzLT5lMV9saW5rOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqZTFfdHM7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfdHMoJXUsJXUsJXUpXG4iLCB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAwOworCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWUxX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCQllMWlucF90c19jb25maWcoZTFfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZlMV90cy0+dHJhdS5kZW11eCwgZTFfbGluay0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGUxX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHJ4LT5yc2xfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisJaW50IGk7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJTTCBMaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIHRyeC0+cnNsX3RlaSwgU0FQSV9SU0wpOworCWlmICghcnNsX2xpbmspCisJCXJldHVybiAtRU5PTUVNOworCWlmICh0cngtPnJzbF9saW5rKQorCQllMWlucF9zaWduX2xpbmtfZGVzdHJveSh0cngtPnJzbF9saW5rKTsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWUxX3JlY29uZmlnX3RzKCZ0cngtPnRzW2ldKTsKKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJmJ0cy0+b21sX2UxX2xpbms7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJREVCVUdQKERNSSwgImUxX3JlY29uZmlnX2J0cygldSlcbiIsIGJ0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPTUwgbGluayAqLworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2lnbl90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwllMWlucF90c19jb25maWcoc2lnbl90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgYnRzLT5vbWxfdGVpLCBTQVBJX09NTCk7CisJaWYgKCFvbWxfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGJ0cy0+b21sX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KGJ0cy0+b21sX2xpbmspOworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWUxX3JlY29uZmlnX3RyeCh0cngpOworCisJLyogbm90aWZ5IEUxIGlucHV0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLworCXJldHVybiBlMWlucF9saW5lX3VwZGF0ZShsaW5lKTsKK30KKworI2lmIDAKKy8qIGRvIHNvbWUgY29tcGlsZWQtaW4gY29uZmlndXJhdGlvbiBmb3Igb3VyIEJUUy9FMSBzZXR1cCAqLworaW50IGUxX2NvbmZpZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgY2FyZG5yLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJaW50IGJhc2VfdHM7CisKKwlzd2l0Y2ggKGJ0cy0+bnIpIHsKKwljYXNlIDA6CisJCS8qIEZpcnN0IEJUUyB1c2VzIEUxIFRTIDAxLDAyLDAzLDA0LDA1ICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMF9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogU2Vjb25kIEJUUyB1c2VzIEUxIFRTIDA2LDA3LDA4LDA5LDEwICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMV9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogVGhpcmQgQlRTIHVzZXMgRTEgVFMgMTEsMTIsMTMsMTQsMTUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMyX1RTIC0gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgYW5kIFRSQVUgZnJhbWVzICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1tiYXNlX3RzKzEtMV07CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIHRyeCwgVEVJX09NTCwgU0FQSV9PTUwpOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIFRFSV9SU0wsIFNBUElfUlNMKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDMpOworCisJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDApOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDMpOworCisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisJaWYgKHRyeCkgeworCQkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBUUkFVIGZyYW1lcyBvZiBUUlgxICovCisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys0LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCQllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCQkvKiBjcmVhdGUgUlNMIHNpZ25hbGxpbmcgbGluayBmb3IgVFJYMSAqLworCQlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwkJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCsxLCBTQVBJX1JTTCk7CisJCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gdHJ4ICovCisJCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCQkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDApOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDEpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDIpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDMpOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMzICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMyk7CisJfQorCisJcmV0dXJuIG1pX3NldHVwKGNhcmRuciwgbGluZSwgcmVsZWFzZV9sMik7Cit9CisjZW5kaWYKKworLyogY29uZmlndXJlIHBzZXVkbyBFMSBsaW5lIGluIGlwLmFjY2VzcyBzdHlsZSBhbmQgY29ubmVjdCB0byBCVFMgKi8KK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHMsICpyc2xfdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1syLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJLyogY3JlYXRlIHNpZ25hbGxpbmcgbGlua3MgZm9yIFRTMSAqLworCXNpZ25fdHMgPSAmbGluZS0+dHNbMS0xXTsKKwlyc2xfdHMgPSAmbGluZS0+dHNbMi0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgMHhmZiwgMCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHJzbF90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgYnRzLT5jMCwgMCwgMCk7CisKKwkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIGJ0cy90cnggKi8KKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisJYnRzLT5jMC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGRlZmF1bHQgcG9ydCBhdCBCVFMgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIGlzIDMwMDYgKi8KKwlpZiAoc2luLT5zaW5fcG9ydCA9PSAwKQorCQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisKKwlyZXR1cm4gaXBhY2Nlc3NfY29ubmVjdChsaW5lLCBzaW4pOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwMzU5YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnRlcmZhY2UgdG8gRTEgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorCisjZGVmaW5lIE5VTV9FMV9UUwkzMgorCisvKiBsaXN0IG9mIGFsbCBFMSBkcml2ZXJzICovCitMTElTVF9IRUFEKGUxaW5wX2RyaXZlcl9saXN0KTsKKworLyogbGlzdCBvZiBhbGwgRTEgbGluZXMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfbGluZV9saXN0KTsKKworc3RhdGljIHZvaWQgKnRhbGxfc2lnbF9jdHg7CisKKy8qIHRvIGJlIGltcGxlbWVudGVkLCBlLmcuIGJ5IGJzY19oYWNrLmMgKi8KK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CisKKy8qCisgKiBwY2FwIHdyaXRpbmcgb2YgdGhlIG1pc2RuIGxvYWQKKyAqIHBjYXAgZm9ybWF0IGlzIGZyb20gaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9EZXZlbG9wbWVudC9MaWJwY2FwRmlsZUZvcm1hdAorICovCisjZGVmaW5lIERMVF9MSU5VWF9MQVBECQkxNzcKKyNkZWZpbmUgUENBUF9JTlBVVAkJMAorI2RlZmluZSBQQ0FQX09VVFBVVAkJMQorCitzdHJ1Y3QgcGNhcF9oZHIgeworCXVfaW50MzJfdCBtYWdpY19udW1iZXI7CisJdV9pbnQxNl90IHZlcnNpb25fbWFqb3I7CisJdV9pbnQxNl90IHZlcnNpb25fbWlub3I7CisJaW50MzJfdCAgdGhpc3pvbmU7CisJdV9pbnQzMl90IHNpZ2ZpZ3M7CisJdV9pbnQzMl90IHNuYXBsZW47CisJdV9pbnQzMl90IG5ldHdvcms7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcGNhcHJlY19oZHIgeworCXVfaW50MzJfdCB0c19zZWM7CisJdV9pbnQzMl90IHRzX3VzZWM7CisJdV9pbnQzMl90IGluY2xfbGVuOworCXVfaW50MzJfdCBvcmlnX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyIHsKKyAgICAgICAgdV9pbnQxNl90IHBrdHR5cGU7CisJdV9pbnQxNl90IGhhdHlwZTsKKwl1X2ludDE2X3QgaGFsZW47CisJdV9pbnQ2NF90IGFkZHI7CisJaW50MTZfdCBwcm90b2NvbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBsYXBkX2hlYWRlciB7CisJdV9pbnQ4X3QgZWExIDogMTsKKwl1X2ludDhfdCBjciA6IDE7CisJdV9pbnQ4X3Qgc2FwaSA6IDY7CisJdV9pbnQ4X3QgZWEyIDogMTsKKwl1X2ludDhfdCB0ZWkgOiA3OworCXVfaW50OF90IGNvbnRyb2xfZm9vOyAvKiBmYWtlIFVNJ3MgLi4uICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYXR5cGUgPT0gMiwJaGF0eXBlX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYWxlbiA9PSA0LAkJaGFsZW5fb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmFkZHIgPT0gNiwJCWFkZHJfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPnByb3RvY29sID09IDE0LAlwcm90b19vZmZzZXQpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpID09IDE2LAkJCWxhcGRfaGVhZGVyX3NpemUpOworCisKK3N0YXRpYyBpbnQgcGNhcF9mZCA9IC0xOworCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwY2FwX2hkciBoZWFkZXIgPSB7CisJCS5tYWdpY19udW1iZXIJPSAweGExYjJjM2Q0LAorCQkudmVyc2lvbl9tYWpvcgk9IDIsCisJCS52ZXJzaW9uX21pbm9yCT0gNCwKKwkJLnRoaXN6b25lCT0gMCwKKwkJLnNpZ2ZpZ3MJPSAwLAorCQkuc25hcGxlbgk9IDY1NTM1LAorCQkubmV0d29yawk9IERMVF9MSU5VWF9MQVBELAorCX07CisKKwlwY2FwX2ZkID0gZmQ7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworfQorCisvKiBUaGlzIGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciB0aGUgRC1DaGFubmVsICovCitzdGF0aWMgdm9pZCB3cml0ZV9wY2FwX3BhY2tldChpbnQgZGlyZWN0aW9uLCBpbnQgc2FwaSwgaW50IHRlaSwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2cpIHsKKwlpZiAocGNhcF9mZCA8IDApCisJCXJldHVybjsKKworCWludCByZXQ7CisJdGltZV90IGN1cl90aW1lOworCXN0cnVjdCB0bSAqdG07CisJaW50IG1pX2hlYWQgPSAoZGlyZWN0aW9uPT1QQ0FQX0lOUFVUKSA/IE1JU0ROX0hFQURFUl9MRU4gOiAwOworCisJc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgaGVhZGVyID0geworCQkucGt0dHlwZQk9IDQsCisJCS5oYXR5cGUJCT0gMCwKKwkJLmhhbGVuCQk9IDAsCisJCS5hZGRyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDB4MCA6IDB4MSwKKwkJLnByb3RvY29sCT0gbnRvaHMoNDgpLAorCX07CisKKwlzdHJ1Y3QgbGFwZF9oZWFkZXIgbGFwZF9oZWFkZXIgPSB7CisJCS5lYTEJCT0gMCwKKwkJLmNyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDEgOiAwLAorCQkuc2FwaQkJPSBzYXBpICYgMHgzRiwKKwkJLmVhMgkJPSAxLAorCQkudGVpCQk9IHRlaSAmIDB4N0YsCisJCS5jb250cm9sX2Zvbwk9IDB4MDMgLyogVUkgKi8sCisJfTsJCisKKwlzdHJ1Y3QgcGNhcHJlY19oZHIgcGF5bG9hZF9oZWFkZXIgPSB7CisJCS50c19zZWMJICAgID0gMCwKKwkJLnRzX3VzZWMgICAgPSAwLAorCQkuaW5jbF9sZW4gICA9IG1zZy0+bGVuICsgc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBsYXBkX2hlYWRlcikKKwkJCQktIG1pX2hlYWQsCisJCS5vcmlnX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwl9OworCisKKwljdXJfdGltZSA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJmN1cl90aW1lKTsKKwlwYXlsb2FkX2hlYWRlci50c19zZWMgPSBta3RpbWUodG0pOworCisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJnBheWxvYWRfaGVhZGVyLCBzaXplb2YocGF5bG9hZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmxhcGRfaGVhZGVyLCBzaXplb2YobGFwZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCBtc2ctPmRhdGEgKyBtaV9oZWFkLAorCQkJbXNnLT5sZW4gLSBtaV9oZWFkKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNpZ25fdHlwZXNbXSA9IHsKKwlbRTFJTlBfU0lHTl9OT05FXQk9ICJOb25lIiwKKwlbRTFJTlBfU0lHTl9PTUxdCT0gIk9NTCIsCisJW0UxSU5QX1NJR05fUlNMXQk9ICJSU0wiLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUoc2lnbl90eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gc2lnbl90eXBlc1t0cF07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0c190eXBlc1tdID0geworCVtFMUlOUF9UU19UWVBFX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9UU19UWVBFX1NJR05dCT0gIlNpZ25hbGxpbmciLAorCVtFMUlOUF9UU19UWVBFX1RSQVVdCT0gIlRSQVUiLAorfTsKKworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKQoreworCWlmICh0cCA+PSBBUlJBWV9TSVpFKHRzX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiB0c190eXBlc1t0cF07Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gYSBUUkFVIGZyYW1lIHdhcyByZWNlaXZlZCAqLworc3RhdGljIGludCBzdWJjaF9jYihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IGNoLCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbiwKKwkJICAgIHZvaWQgKl9wcml2KQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gX3ByaXY7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHNyY19zczsKKworCXNyY19zcy5lMV9uciA9IGUxaV90cy0+bGluZS0+bnVtOworCXNyY19zcy5lMV90cyA9IGUxaV90cy0+bnVtOworCXNyY19zcy5lMV90c19zcyA9IGNoOworCisJcmV0dXJuIHRyYXVfbXV4X2lucHV0KCZzcmNfc3MsIGRhdGEsIGxlbik7Cit9CisKK2ludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJyc2xfc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghbXNnLT50cngtPnJzbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeC0+cnNsX2xpbmsgPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2lnbl9saW5rID0gbXNnLT50cngtPnJzbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICplMWlucF9kcml2ZXI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT50cnggfHwgIW1zZy0+dHJ4LT5idHMgfHwgIW1zZy0+dHJ4LT5idHMtPm9tbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIm5tX3NlbmRtc2c6IG1zZy0+dHJ4ID09IE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+YnRzLT5vbWxfbGluazsKKwllMWlfdHMgPSBzaWduX2xpbmstPnRzOworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmUxaV90cy0+c2lnbi50eF90aW1lcikpIHsKKwkJLyogbm90aWZ5IHRoZSBkcml2ZXIgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKwkJZTFpbnBfZHJpdmVyID0gc2lnbl9saW5rLT50cy0+bGluZS0+ZHJpdmVyOworCQllMWlucF9kcml2ZXItPndhbnRfd3JpdGUoZTFpX3RzKTsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzaWduX2xpbmstPnR4X2xpc3QsIG1zZyk7CisKKwkvKiBkdW1wIGl0ICovCisJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9PVVRQVVQsIHNpZ25fbGluay0+c2FwaSwgc2lnbl9saW5rLT50ZWksIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGltZXNsb3QgKi8KKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKQoreworCWlmICh0cy0+dHlwZSA9PSB0eXBlICYmIHRzLT5saW5lICYmIGxpbmUpCisJCXJldHVybiAwOworCisJdHMtPnR5cGUgPSB0eXBlOworCXRzLT5saW5lID0gbGluZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlJTklUX0xMSVNUX0hFQUQoJnRzLT5zaWduLnNpZ25fbGlua3MpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJc3ViY2hhbl9tdXhfaW5pdCgmdHMtPnRyYXUubXV4KTsKKwkJdHMtPnRyYXUuZGVtdXgub3V0X2NiID0gc3ViY2hfY2I7CisJCXRzLT50cmF1LmRlbXV4LmRhdGEgPSB0czsKKwkJc3ViY2hfZGVtdXhfaW5pdCgmdHMtPnRyYXUuZGVtdXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkIEUxIHRpbWVzbG90IHR5cGUgJXVcbiIsCisJCQl0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldCh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpX2xpbmU7CisKKwkvKiBpdGVyYXRlIG92ZXIgZ2xvYmFsIGxpc3Qgb2YgZTEgbGluZXMgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShlMWlfbGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQlpZiAoZTFpX2xpbmUtPm51bSA9PSBlMV9ucikKKwkJCXJldHVybiBlMWlfbGluZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldF9jcmVhdGUodV9pbnQ4X3QgZTFfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJaW50IGk7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmIChsaW5lKQorCQlyZXR1cm4gbGluZTsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiBOVUxMOworCisJbGluZS0+bnVtID0gZTFfbnI7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FMV9UUzsgaSsrKSB7CisJCWxpbmUtPnRzW2ldLm51bSA9IGkrMTsKKwkJbGluZS0+dHNbaV0ubGluZSA9IGxpbmU7CisJfQorCWxsaXN0X2FkZF90YWlsKCZsaW5lLT5saXN0LCAmZTFpbnBfbGluZV9saXN0KTsKKworCXJldHVybiBsaW5lOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX3RzICplMWlucF90c19nZXQodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCWUxaV9saW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmICghZTFpX2xpbmUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlMWlfbGluZS0+dHNbdHNfbnItMV07Cit9CisKK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gZTFpbnBfdHNfZ2V0KGUxX25yLCB0c19ucik7CisKKwlpZiAoIWUxaV90cykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV90cy0+dHJhdS5tdXg7Cit9CisKKy8qIFNpZ25hbGxpbmcgTGluayAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWlucF9sb29rdXBfc2lnbl9saW5rKHN0cnVjdCBlMWlucF90cyAqZTFpLAorCQkJCQkgCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaS0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCWlmIChsaW5rLT5zYXBpID09IHNhcGkgJiYgbGluay0+dGVpID09IHRlaSkKKwkJCXJldHVybiBsaW5rOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBjcmVhdGUgYSBuZXcgc2lnbmFsbGluZyBsaW5rIGluIGEgRTEgdGltZXNsb3QgKi8KKworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJaWYgKHRzLT50eXBlICE9IEUxSU5QX1RTX1RZUEVfU0lHTikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5rID0gdGFsbG9jX3plcm8odGFsbF9zaWdsX2N0eCwgc3RydWN0IGUxaW5wX3NpZ25fbGluayk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmstPnRzID0gdHM7CisJbGluay0+dHlwZSA9IHR5cGU7CisJSU5JVF9MTElTVF9IRUFEKCZsaW5rLT50eF9saXN0KTsKKwlsaW5rLT50cnggPSB0cng7CisJbGluay0+dGVpID0gdGVpOworCWxpbmstPnNhcGkgPSBzYXBpOworCisJbGxpc3RfYWRkX3RhaWwoJmxpbmstPmxpc3QsICZ0cy0+c2lnbi5zaWduX2xpbmtzKTsKKworCXJldHVybiBsaW5rOworfQorCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspCit7CisJbGxpc3RfZGVsKCZsaW5rLT5saXN0KTsKKwl0YWxsb2NfZnJlZShsaW5rKTsKK30KKworLyogdGhlIEUxIGRyaXZlciB0ZWxscyB1cyBoZSBoYXMgcmVjZWl2ZWQgc29tZXRoaW5nIG9uIGEgVFMgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlpbnQgcmV0OworCisJc3dpdGNoICh0cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkvKiBjb25zdWx0IHRoZSBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwkJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9JTlBVVCwgc2FwaSwgdGVpLCBtc2cpOworCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayh0cywgdGVpLCBzYXBpKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgImRpZG4ndCBmaW5kIHNpZ25hbGxpbmcgbGluayBmb3IgIgorCQkJCSJ0ZWkgJWQsIHNhcGkgJWRcbiIsIHRlaSwgc2FwaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfQlRTLCBsaW5rLT50cngtPmJ0cyk7CisJCXN3aXRjaCAobGluay0+dHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJbXNnLT50cnggPSBsaW5rLT50cng7CisJCQlyZXQgPSBhYmlzX25tX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIGxpbmsgdHlwZSAldVxuIiwgbGluay0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJcmV0ID0gc3ViY2hfZGVtdXhfaW4oJnRzLT50cmF1LmRlbXV4LCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIFRTIHR5cGUgJXVcbiIsIHRzLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gTlVMTDsKKwlpbnQgbGVuOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogRklYTUU6IGltcGxlbWVudCB0aGlzIHJvdW5kIHJvYmluICovCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZlMWlfdHMtPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQkJbXNnID0gbXNnYl9kZXF1ZXVlKCZsaW5rLT50eF9saXN0KTsKKwkJCWlmIChtc2cpIHsKKwkJCQlpZiAoc2lnbl9saW5rKQorCQkJCQkqc2lnbl9saW5rID0gbGluazsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJbXNnID0gbXNnYl9hbGxvYyhUU1hfQUxMT0NfU0laRSwgIlRSQVVfVFgiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gc3ViY2hhbl9tdXhfb3V0KCZlMWlfdHMtPnRyYXUubXV4LCBtc2ctPmRhdGEsIDQwKTsKKwkJbXNnYl9wdXQobXNnLCA0MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBtc2c7Cit9CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaW4gY2FzZSBzb21lIGtpbmQgb2YgbGluayBzdGF0ZSBldmVudCAqLworaW50IGUxaW5wX2V2ZW50KHN0cnVjdCBlMWlucF90cyAqdHMsIGludCBldnQsIHVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZJWE1FOiByZXBvcnQgZnVydGhlciB1cHdhcmRzICovCisJaW5wdXRfZXZlbnQoZXZ0LCBsaW5rLT50eXBlLCBsaW5rLT50cngpOworCXJldHVybiAwOworfQorCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydikKK3sKKwlsbGlzdF9hZGRfdGFpbCgmZHJ2LT5saXN0LCAmZTFpbnBfZHJpdmVyX2xpc3QpOworCXJldHVybiAwOworfQorCitpbnQgZTFpbnBfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJcmV0dXJuIG1pX2UxX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCitzdGF0aWMgaW50IGUxaV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlpZiAoc3Vic3lzICE9IFNTX0dMT0JBTCB8fAorCSAgICBzaWduYWwgIT0gU19HTE9CQUxfU0hVVERPV04pCisJCXJldHVybiAwOworCisJaWYgKHBjYXBfZmQpIHsKKwkJY2xvc2UocGNhcF9mZCk7CisJCXBjYXBfZmQgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9lMV9pbnAodm9pZCkKK3sKKwl0YWxsX3NpZ2xfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMSwKKwkJCQkJICAgImUxaW5wX3NpZ25fbGluayIpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0dMT0JBTCwgZTFpX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTBhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MjAgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy91c3NkLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorCit2b2lkICp0YWxsX2xvY29wX2N0eDsKKworaW50IGdzbTA0MDhfbG9jX3VwZF9hY2Moc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCB0bXNpKTsKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfc2ltcGxlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJICAgdV9pbnQ4X3QgcGRpc2MsIHVfaW50OF90IG1zZ190eXBlKTsKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlamVjdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK3N0cnVjdCBnc21fbGFpIHsKKwl1X2ludDE2X3QgbWNjOworCXVfaW50MTZfdCBtbmM7CisJdV9pbnQxNl90IGxhYzsKK307CisKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDgwMDAwMDAxOworCitzdGF0aWMgaW50IGF1dGhvcml6ZV9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jLAorCQkJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlpZiAoIXN1YnNjcmliZXIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBEbyBub3Qgc2VuZCBhY2NlcHQgeWV0IGFzIG1vcmUgaW5mb3JtYXRpb24gc2hvdWxkIGFycml2ZS4gU29tZQorCSAqIHBob25lcyB3aWxsIG5vdCBzZW5kIHVzIHRoZSBpbmZvcm1hdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNoZWNrCisJICogd2hhdCB3ZSB3YW50IHRvIGRvIHdpdGggdGhhdC4KKwkgKi8KKwlpZiAobG9jICYmIChsb2MtPndhaXRpbmdfZm9yX2ltc2kgfHwgbG9jLT53YWl0aW5nX2Zvcl9pbWVpKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN1YnNjcmliZXItPm5ldC0+YXV0aF9wb2xpY3kpIHsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9DTE9TRUQ6CisJCXJldHVybiBzdWJzY3JpYmVyLT5hdXRob3JpemVkOworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX1RPS0VOOgorCQlpZiAoc3Vic2NyaWJlci0+YXV0aG9yaXplZCkKKwkJCXJldHVybiBzdWJzY3JpYmVyLT5hdXRob3JpemVkOworCQlyZXR1cm4gKHN1YnNjcmliZXItPmZsYWdzICYgR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVCk7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2xvY191cGRhdGluZ19yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaWYgKCFsY2hhbi0+bG9jX29wZXJhdGlvbikKKwkJcmV0dXJuOworCisJYnNjX2RlbF90aW1lcigmbGNoYW4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyKTsKKwl0YWxsb2NfZnJlZShsY2hhbi0+bG9jX29wZXJhdGlvbik7CisJbGNoYW4tPmxvY19vcGVyYXRpb24gPSAwOworCXB1dF9sY2hhbihsY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2xvY191cGRhdGluZ19yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJdXNlX2xjaGFuKGxjaGFuKTsKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOworCisJbGNoYW4tPmxvY19vcGVyYXRpb24gPSB0YWxsb2NfemVybyh0YWxsX2xvY29wX2N0eCwKKwkJCQkJICAgc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uKTsKK30KKworc3RhdGljIGludCBnc20wNDA4X2F1dGhvcml6ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoYXV0aG9yaXplX3N1YnNjcmliZXIobGNoYW4tPmxvY19vcGVyYXRpb24sIGxjaGFuLT5zdWJzY3IpKSB7CisJCWludCByYzsKKworCQlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2kobGNoYW4tPnN1YnNjcik7CisJCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisJCXJjID0gZ3NtMDQwOF9sb2NfdXBkX2FjYyhtc2ctPmxjaGFuLCBsY2hhbi0+c3Vic2NyLT50bXNpKTsKKwkJaWYgKGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnNlbmRfbW1faW5mbykgeworCQkJLyogc2VuZCBNTSBJTkZPIHdpdGggbmV0d29yayBuYW1lICovCisJCQlyYyA9IGdzbTQ4X3R4X21tX2luZm8obXNnLT5sY2hhbik7CisJCX0KKworCQkvKiBjYWxsIHN1YnNjcl91cGRhdGUgYWZ0ZXIgcHV0dGluZyB0aGUgbG9jX3VwZF9hY2MKKwkJICogaW4gdGhlIHRyYW5zbWl0IHF1ZXVlLCBzaW5jZSBTX1NVQlNDUl9BVFRBQ0hFRCBtaWdodAorCQkgKiB0cmlnZ2VyIGZ1cnRoZXIgYWN0aW9uIGxpa2UgU01TIGRlbGl2ZXJ5ICovCisJCXN1YnNjcl91cGRhdGUobGNoYW4tPnN1YnNjciwgbXNnLT50cngtPmJ0cywKKwkJCSAgICAgIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRCk7CisJCS8qIHRyeSB0byBjbG9zZSBjaGFubmVsIEFTQVAgKi8KKwkJbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTA0MDhfaGFuZGxlX2xjaGFuX3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCAqdGVtcDsKKworCWlmIChzdWJzeXMgIT0gU1NfTENIQU4gfHwgc2lnbmFsICE9IFNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBsb2NhdGlvbiB1cGRhdGluZyByZXF1ZXN0CisJICogb3BlcmF0aW9uIHRha2luZyBwbGFjZSBvbiB0aGUgbGNoYW4uCisJICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSAoc3RydWN0IGdzbV9sY2hhbiAqKXNpZ25hbF9kYXRhOworCWlmICghbGNoYW4pCisJCXJldHVybiAwOworCisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKworCS8qIEZyZWUgYWxsIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2VkIGxjaGFuICovCisJLyogRklYTUU6IHRoaXMgaXMgbm90IG5lY2Nlc3NhcmlseSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHdlIHNob3VsZAorCSAqIG9ubHkgc2V0IHRyYW5zLT5sY2hhbiB0byBOVUxMIGFuZCB3YWl0IGZvciBhbm90aGVyIGxjaGFuIHRvIGJlCisJICogZXN0YWJsaXNoZWQgdG8gdGhlIHNhbWUgTU0gZW50aXR5IChwaG9uZS9zdWJzY3JpYmVyKSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRlbXAsICZsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPmxjaGFuID09IGxjaGFuKQorCQkJdHJhbnNfZnJlZSh0cmFucyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4yLjE0IDogU2VuZCBMT0NBVElPTiBVUERBVElORyBSRUpFQ1QgKi8KK2ludCBnc20wNDA4X2xvY191cGRfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCQorCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0xPQ19VUERfUkVKRUNUOworCWdoLT5kYXRhWzBdID0gY2F1c2U7CisKKwlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlczogTE9DQVRJT04gVVBEQVRJTkcgUkVKRUNUICIKKwkgICAgICJMQUM9JXUgQlRTPSV1XG4iLCBsY2hhbi0+c3Vic2NyID8KKwkgICAgIAkJCXN1YnNjcl9uYW1lKGxjaGFuLT5zdWJzY3IpIDogInVua25vd24iLAorCSAgICAgbGNoYW4tPnRzLT50cngtPmJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBsY2hhbi0+dHMtPnRyeC0+YnRzLT5ucik7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpOworCQorCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENoYXB0ZXIgOS4yLjEzIDogU2VuZCBMT0NBVElPTiBVUERBVEUgQUNDRVBUICovCitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IHRtc2kpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKmxhaTsKKwl1X2ludDhfdCAqbWlkOworCQorCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fTE9DX1VQRF9BQ0NFUFQ7CisKKwlsYWkgPSAoc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpsYWkpKTsKKwlnc200OF9nZW5lcmF0ZV9sYWkobGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJICAgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCisJbWlkID0gbXNnYl9wdXQobXNnLCBHU000OF9NSURfVE1TSV9MRU4pOworCWdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWlkLCB0bXNpKTsKKworCURFQlVHUChETU0sICItPiBMT0NBVElPTiBVUERBVEUgQUNDRVBUXG4iKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBUcmFuc21pdCBDaGFwdGVyIDkuMi4xMCBJZGVudGl0eSBSZXF1ZXN0ICovCitzdGF0aWMgaW50IG1tX3R4X2lkZW50aXR5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgaWRfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fSURfUkVROworCWdoLT5kYXRhWzBdID0gaWRfdHlwZTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKworLyogUGFyc2UgQ2hhcHRlciA5LjIuMTEgSWRlbnRpdHkgUmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgbW1fcnhfaWRfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGJ0cy0+bmV0d29yazsKKwl1X2ludDhfdCBtaV90eXBlID0gZ2gtPmRhdGFbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksICZnaC0+ZGF0YVsxXSwgZ2gtPmRhdGFbMF0pOworCURFQlVHUChETU0sICJJREVOVElUWSBSRVNQT05TRTogbWlfdHlwZT0weCUwMnggTUkoJXMpXG4iLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksIGdoLT5kYXRhKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJaWYgKCFsY2hhbi0+c3Vic2NyKSB7CisJCQlsY2hhbi0+c3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKG5ldCwgbWlfc3RyaW5nKTsKKwkJCWlmICghbGNoYW4tPnN1YnNjcikKKwkJCQlsY2hhbi0+c3Vic2NyID0gZGJfY3JlYXRlX3N1YnNjcmliZXIobmV0LCBtaV9zdHJpbmcpOworCQl9CisJCWlmIChsY2hhbi0+bG9jX29wZXJhdGlvbikKKwkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiB1cGRhdGUgc3Vic2NyaWJlIDwtPiBJTUVJIG1hcHBpbmcgKi8KKwkJaWYgKGxjaGFuLT5zdWJzY3IpIHsKKwkJCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShsY2hhbi0+c3Vic2NyLCBtaV9zdHJpbmcpOworCQkJZGJfc3luY19lcXVpcG1lbnQoJmxjaGFuLT5zdWJzY3ItPmVxdWlwbWVudCk7CisJCX0KKwkJaWYgKGxjaGFuLT5sb2Nfb3BlcmF0aW9uKQorCQkJbGNoYW4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gbGV0IHRoZSBtb2JpbGUgc3RhdGlvbiBlbnRlciAqLworCXJldHVybiBnc20wNDA4X2F1dGhvcml6ZShsY2hhbiwgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCBsb2NfdXBkX3Jlal9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisJZ3NtMDQwOF9sb2NfdXBkX3JlaihsY2hhbiwgYnRzLT5uZXR3b3JrLT5yZWplY3RfY2F1c2UpOworCWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlamVjdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlsY2hhbi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuY2IgPSBsb2NfdXBkX3Jlal9jYjsKKwlsY2hhbi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuZGF0YSA9IGxjaGFuOworCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmx1cGRfbmFtZSh1X2ludDhfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNNDhfTFVQRF9OT1JNQUw6CisJCXJldHVybiAiTk9STUFMIjsKKwljYXNlIEdTTTQ4X0xVUERfUEVSSU9ESUM6CisJCXJldHVybiAiUEVST0lET0MiOworCWNhc2UgR1NNNDhfTFVQRF9JTVNJX0FUVDoKKwkJcmV0dXJuICJJTVNJIEFUVEFDSCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwl9Cit9CisKKy8qIENoYXB0ZXIgOS4yLjE1OiBSZWNlaXZlIExvY2F0aW9uIFVwZGF0aW5nIFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fcnhfbG9jX3VwZF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgKmx1OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlpbnQgcmM7CisKKyAJbHUgPSAoc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxICopIGdoLT5kYXRhOworCisJbWlfdHlwZSA9IGx1LT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbHUtPm1pLCBsdS0+bWlfbGVuKTsKKworCURFQlVHUEMoRE1NLCAibWlfdHlwZT0weCUwMnggTUkoJXMpIHR5cGU9JXMgIiwgbWlfdHlwZSwgbWlfc3RyaW5nLAorCQlsdXBkX25hbWUobHUtPnR5cGUpKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCAmbHUtPm1pX2xlbik7CisKKwlzd2l0Y2ggKGx1LT50eXBlKSB7CisJY2FzZSBHU000OF9MVVBEX05PUk1BTDoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9MVVBEX0lNU0lfQVRUOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2gpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0xVUERfUEVSSU9ESUM6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBQc2V1ZG8gU3Bvb2YgZGV0ZWN0aW9uOiBKdXN0IGRyb3AgYSBzZWNvbmQvY29uY3VycmVudAorCSAqIGxvY2F0aW9uIHVwZGF0aW5nIHJlcXVlc3QuCisJICovCisJaWYgKGxjaGFuLT5sb2Nfb3BlcmF0aW9uKSB7CisJCURFQlVHUEMoRE1NLCAiaWdub3JpbmcgcmVxdWVzdCBkdWUgYW4gZXhpc3Rpbmcgb25lOiAlcC5cbiIsCisJCQlsY2hhbi0+bG9jX29wZXJhdGlvbik7CisJCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIEdTTTQ4X1JFSkVDVF9QUk9UT0NPTF9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWFsbG9jYXRlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQlERUJVR1BDKERNTSwgIlxuIik7CisJCS8qIHdlIGFsd2F5cyB3YW50IHRoZSBJTUVJLCB0b28gKi8KKwkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEobGNoYW4sIEdTTV9NSV9UWVBFX0lNRUkpOworCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDE7CisKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXN1YnNjciA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLworCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMTsKKworCQkvKiBsb29rIHVwIHRoZSBzdWJzY3JpYmVyIGJhc2VkIG9uIFRNU0ksIHJlcXVlc3QgSU1TSSBpZiBpdCBmYWlscyAqLworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCS8qIHNlbmQgSURFTlRJVFkgUkVRVUVTVCBtZXNzYWdlIHRvIGdldCBJTVNJICovCisJCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1TSSk7CisJCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1zaSA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiBubyBzaW0gY2FyZC4uLiBGSVhNRTogd2hhdCB0byBkbyA/ICovCisJCURFQlVHUEMoRE1NLCAidW5pbXBsZW1lbnRlZCBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgInVua25vd24gbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzY2hlZHVsZSB0aGUgcmVqZWN0IHRpbWVyICovCisJc2NoZWR1bGVfcmVqZWN0KGxjaGFuKTsKKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUEMoRFJSLCAiPC0gQ2FuJ3QgZmluZCBhbnkgc3Vic2NyaWJlciBmb3IgdGhpcyBJRFxuIik7CisJCS8qIEZJWE1FOiByZXF1ZXN0IGlkPyBjbG9zZSBjaGFubmVsPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsY2hhbi0+c3Vic2NyID0gc3Vic2NyOworCWxjaGFuLT5zdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsxID0gbHUtPmNsYXNzbWFyazE7CisKKwkvKiBjaGVjayBpZiB3ZSBjYW4gbGV0IHRoZSBzdWJzY3JpYmVyIGludG8gb3VyIG5ldHdvcmsgaW1tZWRpYXRlbHkKKwkgKiBvciBpZiB3ZSBuZWVkIHRvIHdhaXQgZm9yIGlkZW50aXR5IHJlc3BvbnNlcy4gKi8KKwlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUobGNoYW4sIG1zZyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdV9pbnQ4X3QgdG9fYmNkOCh1X2ludDhfdCB2YWwpCit7CisgICAgICAgcmV0dXJuICgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKTsKK30KKyNlbmRpZgorCisvKiBTZWN0aW9uIDkuMi4xNWEgKi8KK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVfaW50OF90ICpwdHI4OworCWludCBuYW1lX2xlbiwgbmFtZV9wYWQ7CisjaWYgMAorCXRpbWVfdCBjdXJfdDsKKwlzdHJ1Y3QgdG0qIGN1cl90aW1lOworCWludCB0ejE1bWluOworI2VuZGlmCisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0lORk87CisKKwlpZiAobmV0LT5uYW1lX2xvbmcpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9sb25nKTsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9MT05HOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArMTsKKwkJcHRyOFsyXSA9IDB4OTA7IC8qIFVDUzIsIG5vIHNwYXJlIGJpdHMsIG5vIENJICovCisKKwkJcHRyMTYgPSAodV9pbnQxNl90ICopIG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4qMik7CisJCWZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKQorCQkJcHRyMTZbaV0gPSBodG9ucyhuZXQtPm5hbWVfbG9uZ1tpXSk7CisKKwkJLyogRklYTUU6IFVzZSBDZWxsIEJyb2FkY2FzdCwgbm90IFVDUy0yLCBzaW5jZQorCQkgKiBVQ1MtMiBpcyBvbmx5IHN1cHBvcnRlZCBieSBsYXRlciByZXZpc2lvbnMgb2YgdGhlIHNwZWMgKi8KKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpLzg7CisJCW5hbWVfcGFkID0gKDggLSBzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpJTg7CisJCWlmIChuYW1lX3BhZCA+IDApCisJCQluYW1lX2xlbisrOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX0xPTkc7CisJCXB0cjhbMV0gPSBuYW1lX2xlbiArMTsKKwkJcHRyOFsyXSA9IDB4ODAgfCBuYW1lX3BhZDsgLyogQ2VsbCBCcm9hZGNhc3QgRENTLCBubyBDSSAqLworCisJCXB0cjggPSBtc2diX3B1dChtc2csIG5hbWVfbGVuKTsKKwkJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIG5ldC0+bmFtZV9sb25nKTsKKworCX0KKworCWlmIChuZXQtPm5hbWVfc2hvcnQpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCk7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArIDE7CisJCXB0cjhbMl0gPSAweDkwOyAvKiBVQ1MyLCBubyBzcGFyZSBiaXRzLCBubyBDSSAqLworCisJCXB0cjE2ID0gKHVfaW50MTZfdCAqKSBtc2diX3B1dChtc2csIG5hbWVfbGVuKjIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJCXB0cjE2W2ldID0gaHRvbnMobmV0LT5uYW1lX3Nob3J0W2ldKTsKKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX3Nob3J0KSo3KS84OworCQluYW1lX3BhZCA9ICg4IC0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCkqNyklODsKKwkJaWYgKG5hbWVfcGFkID4gMCkKKwkJCW5hbWVfbGVuKys7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4gKzE7CisJCXB0cjhbMl0gPSAweDgwIHwgbmFtZV9wYWQ7IC8qIENlbGwgQnJvYWRjYXN0IERDUywgbm8gQ0kgKi8KKworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCBuYW1lX2xlbik7CisJCWdzbV83Yml0X2VuY29kZShwdHI4LCBuZXQtPm5hbWVfc2hvcnQpOworCisJfQorCisjaWYgMAorCS8qIFNlY3Rpb24gMTAuNS4zLjkgKi8KKwljdXJfdCA9IHRpbWUoTlVMTCk7CisJY3VyX3RpbWUgPSBnbXRpbWUoJmN1cl90KTsKKwlwdHI4ID0gbXNnYl9wdXQobXNnLCA4KTsKKwlwdHI4WzBdID0gR1NNNDhfSUVfTkVUX1RJTUVfVFo7CisJcHRyOFsxXSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3llYXIgJSAxMDApOworCXB0cjhbMl0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tb24pOworCXB0cjhbM10gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tZGF5KTsKKwlwdHI4WzRdID0gdG9fYmNkOChjdXJfdGltZS0+dG1faG91cik7CisJcHRyOFs1XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX21pbik7CisJcHRyOFs2XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3NlYyk7CisJLyogMDIuNDI6IGNvZGVkIGFzIEJDRCBlbmNvZGVkIHNpZ25lZCB2YWx1ZSBpbiB1bml0cyBvZiAxNSBtaW51dGVzICovCisJdHoxNW1pbiA9IChjdXJfdGltZS0+dG1fZ210b2ZmKS8oNjAqMTUpOworCXB0cjhbN10gPSB0b19iY2Q4KHR6MTVtaW4pOworCWlmICh0ejE1bWluIDwgMCkKKwkJcHRyOFs3XSB8PSAweDgwOworI2VuZGlmCisKKwlERUJVR1AoRE1NLCAiLT4gTU0gSU5GT1xuIik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBTZWN0aW9uIDkuMi4yICovCitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2F1dGhfcmVxICphciA9IChzdHJ1Y3QgZ3NtNDhfYXV0aF9yZXEgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFyKSk7CisKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRVEgKHJhbmQgPSAlcylcbiIsIGhleGR1bXAocmFuZCwgMTYpKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9BVVRIX1JFUTsKKworCWFyLT5rZXlfc2VxID0ga2V5X3NlcTsKKworCS8qIDE2IGJ5dGVzIFJBTkQgcGFyYW1ldGVycyAqLworCWlmIChyYW5kKQorCQltZW1jcHkoYXItPnJhbmQsIHJhbmQsIDE2KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEgKi8KK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRUpFQ1RcbiIpOworCXJldHVybiBnc200OF90eF9zaW1wbGUobGNoYW4sIEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9BVVRIX1JFSik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJREVCVUdQKERNTSwgIi0+IENNIFNFUlZJQ0UgQUNLXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfc2ltcGxlKGxjaGFuLCBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQ01fU0VSVl9BQ0MpOworfQorCisvKiA5LjIuNiBDTSBzZXJ2aWNlIHJlamVjdCAqLworc3RhdGljIGludCBnc200OF90eF9tbV9zZXJ2X3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCQllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJdXNlX2xjaGFuKGxjaGFuKTsKKworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0NNX1NFUlZfUkVKOworCWdoLT5kYXRhWzBdID0gdmFsdWU7CisJREVCVUdQKERNTSwgIi0+IENNIFNFUlZJQ0UgUmVqZWN0IGNhdXNlOiAlZFxuIiwgdmFsdWUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyoKKyAqIEhhbmRsZSBDTSBTZXJ2aWNlIFJlcXVlc3RzCisgKiBhKSBWZXJpZnkgdGhhdCB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uCisgKiAgICB3ZSByZXF1aXJlIG90aGVyd3NpZSByZWplY3Qgd2l0aCBJTkNPUlJFQ1RfTUVTU0FHRQorICogYikgVHJ5IHRvIHBhcnNlIHRoZSBUTVNJLiBJZiB3ZSBkbyBub3QgaGF2ZSBvbmUgcmVqZWN0CisgKiBjKSBDaGVjayB0aGF0IHdlIGtub3cgdGhlIHN1YnNjcmliZXIgd2l0aCB0aGUgVE1TSSBvdGhlcndpc2UgcmVqZWN0CisgKiAgICB3aXRoIGEgSExSIGNhdXNlCisgKiBkKSBTZXQgdGhlIHN1YnNjcmliZXIgb24gdGhlIGdzbV9sY2hhbiBhbmQgYWNjZXB0CisgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfbW1fc2Vydl9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwl1X2ludDhfdCBtaV90eXBlOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICpyZXEgPQorCQkJKHN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QgKilnaC0+ZGF0YTsKKwkvKiB1bmZvcnR1bmF0ZWx5IGluIFBoYXNlMSB0aGUgY2xhc3NtYXIyIGxlbmd0aCBpcyB2YXJpYWJsZSAqLworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuID0gZ2gtPmRhdGFbMV07CisJdV9pbnQ4X3QgKmNsYXNzbWFyazIgPSBnaC0+ZGF0YSsyOworCXVfaW50OF90IG1pX2xlbiA9ICooY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuKTsKKwl1X2ludDhfdCAqbWkgPSAoY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuICsgMSk7CisKKwlERUJVR1AoRE1NLCAiPC0gQ00gU0VSVklDRSBSRVFVRVNUICIpOworCWlmIChtc2ctPmRhdGFfbGVuIDwgc2l6ZW9mKHN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QqKSkgeworCQlERUJVR1BDKERNTSwgIndyb25nIHNpemVkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWoobXNnLT5sY2hhbiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJaWYgKG1zZy0+ZGF0YV9sZW4gPCByZXEtPm1pX2xlbiArIDYpIHsKKwkJREVCVUdQQyhETU0sICJkb2VzIG5vdCBmaXQgaW4gcGFja2V0XG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UpOworCX0KKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJaWYgKG1pX3R5cGUgIT0gR1NNX01JX1RZUEVfVE1TSSkgeworCQlERUJVR1BDKERNTSwgIm1pX3R5cGUgaXMgbm90IFRNU0k6ICVkXG4iLCBtaV90eXBlKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UpOworCX0KKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBtaSwgbWlfbGVuKTsKKwlERUJVR1BDKERNTSwgInNlcnZfdHlwZT0weCUwMnggbWlfdHlwZT0weCUwMnggTSglcylcbiIsCisJCXJlcS0+Y21fc2VydmljZV90eXBlLCBtaV90eXBlLCBtaV9zdHJpbmcpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksIChjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4pKTsKKworCWlmIChpc19zaWVtZW5zX2J0cyhidHMpKQorCQlzZW5kX3NpZW1lbnNfbXJwY2kobXNnLT5sY2hhbiwgY2xhc3NtYXJrMi0xKTsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisKKwkvKiBGSVhNRTogaWYgd2UgZG9uJ3Qga25vdyB0aGUgVE1TSSwgaW5xdWlyZSBhYml0IElNU0kgYW5kIGFsbG9jYXRlIG5ldyBUTVNJICovCisJaWYgKCFzdWJzY3IpCisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3Jlaihtc2ctPmxjaGFuLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lNU0lfVU5LTk9XTl9JTl9ITFIpOworCisJaWYgKCFtc2ctPmxjaGFuLT5zdWJzY3IpCisJCW1zZy0+bGNoYW4tPnN1YnNjciA9IHN1YnNjcjsKKwllbHNlIGlmIChtc2ctPmxjaGFuLT5zdWJzY3IgPT0gc3Vic2NyKQorCQlzdWJzY3JfcHV0KHN1YnNjcik7IC8qIGxjaGFuIGFscmVhZHkgaGFzIGEgcmVmLCBkb24ndCBuZWVkIGFub3RoZXIgb25lICovCisJZWxzZSB7CisJCURFQlVHUChETU0sICI8LSBDTSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNsYXNzbWFyazJfbGVuOworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyLCBjbGFzc21hcmsyX2xlbik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJldHVybiBnc200OF90eF9tbV9zZXJ2X2Fjayhtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9pbXNpX2RldGFjaF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKmlkaSA9CisJCQkJKHN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKikgZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbWlfdHlwZSA9IGlkaS0+bWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBpZGktPm1pLCBpZGktPm1pX2xlbik7CisJREVCVUdQKERNTSwgIklNU0kgREVUQUNIIElORElDQVRJT046IG1pX3R5cGU9MHglMDJ4IE1JKCVzKTogIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN1YnNjcikgeworCQlzdWJzY3JfdXBkYXRlKHN1YnNjciwgbXNnLT50cngtPmJ0cywKKwkJCQlHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQpOworCQlERUJVR1AoRE1NLCAiU3Vic2NyaWJlcjogJXNcbiIsIHN1YnNjcl9uYW1lKHN1YnNjcikpOworCisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazEgPSBpZGktPmNsYXNzbWFyazE7CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0gZWxzZQorCQlERUJVR1AoRE1NLCAiVW5rbm93biBTdWJzY3JpYmVyID8hP1xuIik7CisKKwkvKiBGSVhNRTogaXRlcmF0ZSBvdmVyIGFsbCB0cmFuc2FjdGlvbnMgYW5kIHJlbGVhc2UgdGhlbSwKKwkgKiBpbWFnaW5lIGFuIElNU0kgREVUQUNIIGhhcHBlbmluZyBkdXJpbmcgYW4gYWN0aXZlIGNhbGwhICovCisKKwkvKiBzdWJzY3JpYmVyIGlzIGRldGFjaGVkOiBzaG91bGQgd2UgcmVsZWFzZSBsY2hhbj8gKi8KKwlsY2hhbl9hdXRvX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChETU0sICJNTSBTVEFUVVMgKHJlamVjdCBjYXVzZSAweCUwMngpXG4iLCBnaC0+ZGF0YVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIEdTTSAwNC4wOCBNb2JpbGl0eSBNYW5hZ2VtZW50IChNTSkgbWVzc2FnZSAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9tbShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSAmIDB4YmYpIHsKKwljYXNlIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVDoKKwkJREVCVUdQKERNTSwgIkxPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Q6ICIpOworCQlyYyA9IG1tX3J4X2xvY191cGRfcmVxKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSURfUkVTUDoKKwkJcmMgPSBtbV9yeF9pZF9yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVE6CisJCXJjID0gZ3NtNDhfcnhfbW1fc2Vydl9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfbW1fc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DT01QTDoKKwkJREVCVUdQKERNTSwgIlRNU0kgUmVhbGxvY2F0aW9uIENvbXBsZXRlZC4gU3Vic2NyaWJlcjogJXNcbiIsCisJCSAgICAgICBtc2ctPmxjaGFuLT5zdWJzY3IgPworCQkJCXN1YnNjcl9uYW1lKG1zZy0+bGNoYW4tPnN1YnNjcikgOgorCQkJCSJ1bmtub3duIHN1YnNjcmliZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQ6CisJCXJjID0gZ3NtNDhfcnhfbW1faW1zaV9kZXRhY2hfaW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fUkVFU1RfUkVROgorCQlERUJVR1AoRE1NLCAiQ00gUkVFU1RBQkxJU0ggUkVRVUVTVDogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9BVVRIX1JFU1A6CisJCURFQlVHUChETU0sICJBVVRIRU5USUNBVElPTiBSRVNQT05TRTogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiVW5rbm93biBHU00gMDQuMDggTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgUEFHSU5HIFJFU1BPTlNFIG1lc3NhZ2UgZnJvbSB0aGUgTVMgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfcGFnX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlnc200OF9wYWdpbmdfZXh0cmFjdF9taShtc2csIG1pX3N0cmluZywgJm1pX3R5cGUpOworCURFQlVHUChEUlIsICJQQUdJTkcgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFzdWJzY3IpIHsKKwkJREVCVUdQKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOworCQkvKiBGSVhNRTogcmVxdWVzdCBpZD8gY2xvc2UgY2hhbm5lbD8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURFQlVHUChEUlIsICI8LSBDaGFubmVsIHdhcyByZXF1ZXN0ZWQgYnkgJXNcbiIsCisJCXN1YnNjci0+bmFtZSAmJiBzdHJsZW4oc3Vic2NyLT5uYW1lKSA/IHN1YnNjci0+bmFtZSA6IHN1YnNjci0+aW1zaSk7CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9ICpjbGFzc21hcmsyX2x2OworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyX2x2KzEsICpjbGFzc21hcmsyX2x2KTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmMgPSBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3AobXNnLCBzdWJzY3IpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9jbGFzc21hcmsoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IG1zZy0+bGNoYW4tPnN1YnNjcjsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwl1X2ludDhfdCBjbTJfbGVuLCBjbTNfbGVuID0gMDsKKwl1X2ludDhfdCAqY20yLCAqY20zID0gTlVMTDsKKworCURFQlVHUChEUlIsICJDTEFTU01BUksgQ0hBTkdFICIpOworCisJLyogY2xhc3NtYXJrIDIgKi8KKwljbTJfbGVuID0gZ2gtPmRhdGFbMF07CisJY20yID0gJmdoLT5kYXRhWzFdOworCURFQlVHUEMoRFJSLCAiQ00yKGxlbj0ldSkgIiwgY20yX2xlbik7CisKKwlpZiAocGF5bG9hZF9sZW4gPiBjbTJfbGVuICsgMSkgeworCQkvKiB3ZSBtdXN0IGhhdmUgYSBjbGFzc21hcmszICovCisJCWlmIChnaC0+ZGF0YVtjbTJfbGVuKzFdICE9IDB4MjApIHsKKwkJCURFQlVHUEMoRFJSLCAiRVJSIENNMyBUQUdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNtMl9sZW4gPiAzKSB7CisJCQlERUJVR1BDKERSUiwgIkNNMiB0b28gbG9uZyFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCisJCWNtM19sZW4gPSBnaC0+ZGF0YVtjbTJfbGVuKzJdOworCQljbTMgPSAmZ2gtPmRhdGFbY20yX2xlbiszXTsKKwkJaWYgKGNtM19sZW4gPiAxNCkgeworCQkJREVCVUdQQyhEUlIsICJDTTMgbGVuICV1IHRvbyBsb25nIVxuIiwgY20zX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlERUJVR1BDKERSUiwgIkNNMyhsZW49JXUpXG4iLCBjbTNfbGVuKTsKKwl9CisJaWYgKHN1YnNjcikgeworCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNtMl9sZW47CisJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbTIsIGNtMl9sZW4pOworCQlpZiAoY20zKSB7CisJCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszX2xlbiA9IGNtM19sZW47CisJCQltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMywgY20zLCBjbTNfbGVuKTsKKwkJfQorCQlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIlNUQVRVUyBycl9jYXVzZSA9ICVzXG4iLCAKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfbWVhc19yZXAoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptZWFzX3JlcCA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisKKwkvKiBUaGlzIHNob3VsZG4ndCBhY3R1YWxseSBlbmQgdXAgaGVyZSwgYXMgUlNMIHRyZWF0cworCSAqIEwzIEluZm8gb2YgMDguNTggTUVBU1VSRU1FTlQgUkVQT1JUIGRpZmZlcmVudCBieSBjYWxsaW5nCisJICogZGlyZWN0bHkgaW50byBnc200OF9wYXJzZV9tZWFzX3JlcCAqLworCURFQlVHUChETUVBUywgIkRJUkVDVCBHU000OCBNRUFTVVJFTUVOVCBSRVBPUlQgPyE/ICIpOworCWdzbTQ4X3BhcnNlX21lYXNfcmVwKG1lYXNfcmVwLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfYXBwX2luZm8oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzOworCXVfaW50OF90IGFwZHVfbGVuOworCXVfaW50OF90ICphcGR1X2RhdGE7CisKKwlhcGR1X2lkX2ZsYWdzID0gZ2gtPmRhdGFbMF07CisJYXBkdV9sZW4gPSBnaC0+ZGF0YVsxXTsKKwlhcGR1X2RhdGEgPSBnaC0+ZGF0YSsyOworCQorCURFQlVHUChETk0sICJSWCBBUFBMSUNBVElPTiBJTkZPIGlkL2ZsYWdzPTB4JTAyeCBhcGR1X2xlbj0ldSBhcGR1PSVzIiwKKwkJYXBkdV9pZF9mbGFncywgYXBkdV9sZW4sIGhleGR1bXAoYXBkdV9kYXRhLCBhcGR1X2xlbikpOworCisJcmV0dXJuIGRiX2FwZHVfYmxvYl9zdG9yZShtc2ctPmxjaGFuLT5zdWJzY3IsIGFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBhcGR1X2RhdGEpOworfQorCisvKiBDaGFwdGVyIDkuMS4xNiBIYW5kb3ZlciBjb21wbGV0ZSAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9ob19jb21wbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIkhBTkRPVkVSIENPTVBMRVRFIGNhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwgbXNnLT5sY2hhbik7CisJLyogRklYTUU6IHJlbGVhc2Ugb2xkIGNoYW5uZWwgKi8KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMS4xNyBIYW5kb3ZlciBGYWlsdXJlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2hvX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJIQU5ET1ZFUiBGQUlMRUQgY2F1c2UgPSAlc1xuIiwKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0ZBSUwsIG1zZy0+bGNoYW4pOworCS8qIEZJWE1FOiByZWxlYXNlIGFsbG9jYXRlZCBuZXcgY2hhbm5lbCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBHU00gMDQuMDggUmFkaW8gUmVzb3VyY2UgKFJSKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X3JyKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9SUl9DTFNNX0NIRzoKKwkJcmMgPSBnc200OF9yeF9ycl9jbGFzc21hcmsobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9HUFJTX1NVU1BfUkVROgorCQlERUJVR1AoRFJSLCAiR1JQUyBTVVNQRU5EIFJFUVVFU1RcbiIpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX1BBR19SRVNQOgorCQlyYyA9IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGX0FDSzoKKwkJcmMgPSBnc200OF9yeF9ycl9tb2RpZl9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfcnJfc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfTUVBU19SRVA6CisJCXJjID0gZ3NtNDhfcnhfcnJfbWVhc19yZXAobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9BUFBfSU5GTzoKKwkJcmMgPSBnc200OF9yeF9ycl9hcHBfaW5mbyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0NJUEhfTV9DT01QTDoKKwkJREVCVUdQKERSUiwgIkNJUEhFUklORyBNT0RFIENPTVBMRVRFXG4iKTsKKwkJLyogRklYTUU6IGNoZWNrIGZvciBNSSAoaWYgYW55KSAqLworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0hBTkRPX0NPTVBMOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2hvX2NvbXBsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfSEFORE9fRkFJTDoKKwkJcmMgPSBnc200OF9yeF9ycl9ob19mYWlsKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJSLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBSUiBtc2cgdHlwZSAweCUwMnhcbiIsIGdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwkKKwlERUJVR1AoRFJSLCAiVFggQVBQTElDQVRJT04gSU5GTyBpZD0weCUwMngsIGxlbj0ldVxuIiwKKwkJYXBkdV9pZCwgYXBkdV9sZW4pOworCQorCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDIgKyBhcGR1X2xlbik7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQVBQX0lORk87CisJZ2gtPmRhdGFbMF0gPSBhcGR1X2lkOworCWdoLT5kYXRhWzFdID0gYXBkdV9sZW47CisJbWVtY3B5KGdoLT5kYXRhKzIsIGFwZHUsIGFwZHVfbGVuKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENhbGwgQ29udHJvbCAqLworCisvKiBUaGUgZW50aXJlIGNhbGwgY29udHJvbCBjb2RlIGlzIHdyaXR0ZW4gaW4gYWNjb3JkYW5jZSB3aXRoIEZpZ3VyZSA3LjEwYworICogZm9yICd2ZXJ5IGVhcmx5IGFzc2lnbm1lbnQnLCBpLmUuIHdlIGFsbG9jYXRlIGEgVENIL0YgZHVyaW5nIElNTUVESUFURQorICogQVNTSUdOLCB0aGVuIGZpcnN0IHVzZSB0aGF0IFRDSC9GIGZvciBzaWduYWxsaW5nIGFuZCBsYXRlciBNT0RFIE1PRElGWQorICogaXQgZm9yIHZvaWNlICovCisKK3N0YXRpYyB2b2lkIG5ld19jY19zdGF0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSA+IDMxIHx8IHN0YXRlIDwgMCkKKwkJcmV0dXJuOworCisJREVCVUdQKERDQywgIm5ldyBzdGF0ZSAlcyAtPiAlc1xuIiwKKwkJY2Nfc3RhdGVfbmFtZXNbdHJhbnMtPmNjLnN0YXRlXSwgY2Nfc3RhdGVfbmFtZXNbc3RhdGVdKTsKKworCXRyYW5zLT5jYy5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXR1cyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwl1X2ludDhfdCAqY2F1c2UsICpjYWxsX3N0YXRlOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfU1RBVFVTOworCisJY2F1c2UgPSBtc2diX3B1dChtc2csIDMpOworCWNhdXNlWzBdID0gMjsKKwljYXVzZVsxXSA9IEdTTTQ4X0NBVVNFX0NTX0dTTSB8IEdTTTQ4X0NBVVNFX0xPQ19VU0VSOworCWNhdXNlWzJdID0gMHg4MCB8IDMwOwkvKiByZXNwb25zZSB0byBzdGF0dXMgaW5xdWlyeSAqLworCisJY2FsbF9zdGF0ZSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJY2FsbF9zdGF0ZVswXSA9IDB4YzAgfCAweDAwOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfc2ltcGxlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJICAgdV9pbnQ4X3QgcGRpc2MsIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoLT5wcm90b19kaXNjciA9IHBkaXNjOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfc3RvcF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJnRyYW5zLT5jYy50aW1lcikpIHsKKwkJREVCVUdQKERDQywgInN0b3BwaW5nIHBlbmRpbmcgdGltZXIgVCV4XG4iLCB0cmFucy0+Y2MuVGN1cnJlbnQpOworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIpOworCQl0cmFucy0+Y2MuVGN1cnJlbnQgPSAwOworCX0KK30KKyAKK3N0YXRpYyBpbnQgbW5jY19yZWN2bXNnKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCWludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICptbmNjKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAodHJhbnMpCisJCWlmICh0cmFucy0+bGNoYW4pCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwKKwkJCQl0cmFucy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsCisJCQkJdHJhbnMtPmxjaGFuLT50cy0+dHJ4LT5uciwKKwkJCQl0cmFucy0+bGNoYW4tPnRzLT5uciwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwKKwkJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwllbHNlCisJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgLSkgIgorCQkJIlNlbmRpbmcgJyVzJyB0byBNTkNDLlxuIiwgZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCisJbW5jYy0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwkKKwltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpLCAiTU5DQyIpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkobXNnLT5kYXRhLCBtbmNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbXNnYl9lbnF1ZXVlKCZuZXQtPnVwcXVldWUsIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1uY2NfcmVsZWFzZV9pbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkgICAgIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihyZWwpKTsKKwlyZWwuY2FsbHJlZiA9IGNhbGxyZWY7CisJbW5jY19zZXRfY2F1c2UoJnJlbCwgbG9jYXRpb24sIHZhbHVlKTsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7Cit9CisKKy8qIENhbGwgQ29udHJvbCBTcGVjaWZpYyB0cmFuc2FjdGlvbiByZWxlYXNlLgorICogZ2V0cyBjYWxsZWQgYnkgdHJhbnNfZnJlZSwgRE8gTk9UIENBTEwgWU9VUlNFTEYhICovCit2b2lkIF9nc200OF9jY190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJLyogc2VuZCByZWxlYXNlIHRvIEw0LCBpZiBjYWxscmVmIHN0aWxsIGV4aXN0cyAqLworCWlmICh0cmFucy0+Y2FsbHJlZikgeworCQkvKiBSZXNzb3VyY2UgdW5hdmFpbGFibGUgKi8KKwkJbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCSBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwl9CisJaWYgKHRyYW5zLT5jYy5zdGF0ZSAhPSBHU01fQ1NUQVRFX05VTEwpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9OVUxMKTsKKwlpZiAodHJhbnMtPmxjaGFuKQorCQl0cmF1X211eF91bm1hcCgmdHJhbnMtPmxjaGFuLT50cy0+ZTFfbGluaywgdHJhbnMtPmNhbGxyZWYpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3NldHVwKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpOworIAorLyogY2FsbC1iYWNrIGZyb20gcGFnaW5nIHRoZSBCLWVuZCBvZiB0aGUgY29ubmVjdGlvbiAqLworc3RhdGljIGludCBzZXR1cF90cmlnX3BhZ19ldnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBwYXJhbTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc3QsICp0bXA7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworICAKKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmV0ID0gc3Vic2NyLT5uZXQ7CisJaWYgKCFuZXQpIHsKKwkJREVCVUdQKERDQywgIkVycm9yIE5ldHdvcmsgbm90IHNldCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayBhbGwgdHJhbmFjdGlvbnMgKHdpdGhvdXQgbGNoYW4pIGZvciBzdWJzY3JpYmVyICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFuc3QsIHRtcCwgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zdC0+c3Vic2NyICE9IHN1YnNjciB8fCB0cmFuc3QtPmxjaGFuKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJCWlmICghbGNoYW4pIC8vIHBhcmFub2lkCisJCQkJYnJlYWs7CisJCQlERUJVR1AoRENDLCAiUGFnaW5nIHN1YnNjciAlcyBzdWNjZWVkZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIEFzc2lnbiBsY2hhbiAqLworCQkJaWYgKCF0cmFuc3QtPmxjaGFuKSB7CisJCQkJdHJhbnN0LT5sY2hhbiA9IGxjaGFuOworCQkJCXVzZV9sY2hhbihsY2hhbik7CisJCQl9CisJCQkvKiBzZW5kIFNFVFVQIHJlcXVlc3QgdG8gY2FsbGVkIHBhcnR5ICovCisJCQlnc200OF9jY190eF9zZXR1cCh0cmFuc3QsICZ0cmFuc3QtPmNjLm1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCQlERUJVR1AoRENDLCAiUGFnaW5nIHN1YnNjciAlcyBleHBpcmVkIVxuIiwKKwkJCQlzdWJzY3ItPmV4dGVuc2lvbik7CisJCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJCW1uY2NfcmVsZWFzZV9pbmQodHJhbnN0LT5zdWJzY3ItPm5ldCwgdHJhbnN0LAorCQkJCQkgdHJhbnN0LT5jYWxscmVmLAorCQkJCQkgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkgR1NNNDhfQ0NfQ0FVU0VfREVTVF9PT08pOworCQkJdHJhbnN0LT5jYWxscmVmID0gMDsKKwkJCXRyYW5zX2ZyZWUodHJhbnN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjaF9yZWN2X21uY2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgZW5hYmxlKTsKKworLyogc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlIHNlbmRzIHVzIGEgc2lnbmFsICovCitzdGF0aWMgaW50IGhhbmRsZV9hYmlzaXBfc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBzaWduYWxfZGF0YTsKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisKKwlpZiAoc3Vic3lzICE9IFNTX0FCSVNJUCkKKwkJcmV0dXJuIDA7CisKKwkvKiBpbiBjYXNlIHdlIHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19BQklTSVBfQ1JDWF9BQ0s6CisJCS8qIGNoZWNrIGlmIGFueSB0cmFuc2FjdGlvbnMgb24gdGhpcyBsY2hhbiBzdGlsbCBoYXZlCisJCSAqIGEgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0IHBlbmRpbmcgKi8KKwkJbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCQlpZiAodHJhbnMtPmxjaGFuID09IGxjaGFuICYmIHRyYW5zLT50Y2hfcmVjdikgeworCQkJCURFQlVHUChEQ0MsICJwZW5kaW5nIHRjaF9yZWN2X21uY2MgcmVxdWVzdFxuIik7CisJCQkJdGNoX3JlY3ZfbW5jYyhuZXQsIHRyYW5zLT5jYWxscmVmLCAxKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogbWFwIHR3byBpcGFjY2VzcyBSVFAgc3RyZWFtcyBvbnRvIGVhY2ggb3RoZXIgKi8KK3N0YXRpYyBpbnQgdGNoX21hcChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqcmVtb3RlX2xjaGFuKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzICpyZW1vdGVfYnRzID0gcmVtb3RlX2xjaGFuLT50cy0+dHJ4LT5idHM7CisJaW50IHJjOworCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVENIIG1hcCBiZXR3ZWVuIChidHM9JXUsdHJ4PSV1LHRzPSV1KSBhbmQgKGJ0cz0ldSx0cng9JXUsdHM9JXUpXG4iLAorCQlidHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXJlbW90ZV9idHMtPm5yLCByZW1vdGVfbGNoYW4tPnRzLT50cngtPm5yLCByZW1vdGVfbGNoYW4tPnRzLT5ucik7CisKKwlpZiAoYnRzLT50eXBlICE9IHJlbW90ZV9idHMtPnR5cGUpIHsKKwkJREVCVUdQKERDQywgIkNhbm5vdCBzd2l0Y2ggY2FsbHMgYmV0d2VlbiBkaWZmZXJlbnQgQlRTIHR5cGVzIHlldFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIHRvZG86IG1hcCBiZXR3ZWVuIGRpZmZlcmVudCBidHMgdHlwZXMKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWlmICghaXBhY2NfcnRwX2RpcmVjdCkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHJlbW90ZV9sY2hhbik7Cisjd2FybmluZyBkbyB3ZSBuZWVkIGEgY2hlY2sgb2YgcmMgaGVyZT8KKworCQkJLyogY29ubmVjdCB0aGVtIHdpdGggZWFjaCBvdGhlciAqLworCQkJcnRwX3NvY2tldF9wcm94eShsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LAorCQkJCQkgcmVtb3RlX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQl9IGVsc2UgeworCQkJLyogZGlyZWN0bHkgY29ubmVjdCBUQ0ggUlRQIHN0cmVhbXMgdG8gZWFjaCBvdGhlciAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeChsY2hhbiwgcmVtb3RlX2xjaGFuLT5hYmlzX2lwLmJvdW5kX2lwLAorCQkJCQkJcmVtb3RlX2xjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJcmMgPSByc2xfaXBhY2NfbWRjeChyZW1vdGVfbGNoYW4sIGxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwLAorCQkJCQkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJdHJhdV9tdXhfbWFwX2xjaGFuKGxjaGFuLCByZW1vdGVfbGNoYW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRENDLCAiVW5rbm93biBCVFMgdHlwZSAldVxuIiwgYnRzLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGJyaWRnZSBjaGFubmVscyBvZiB0d28gdHJhbnNhY3Rpb25zICovCitzdGF0aWMgaW50IHRjaF9icmlkZ2Uoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCAqcmVmcykKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczEgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCByZWZzWzBdKTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczIgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCByZWZzWzFdKTsKKworCWlmICghdHJhbnMxIHx8ICF0cmFuczIpCisJCXJldHVybiAtRUlPOworCisJaWYgKCF0cmFuczEtPmxjaGFuIHx8ICF0cmFuczItPmxjaGFuKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHRocm91Z2gtY29ubmVjdCBjaGFubmVsICovCisJcmV0dXJuIHRjaF9tYXAodHJhbnMxLT5sY2hhbiwgdHJhbnMyLT5sY2hhbik7Cit9CisKKy8qIGVuYWJsZSByZWNlaXZlIG9mIGNoYW5uZWxzIHRvIE1OQ0MgdXBxdWV1ZSAqLworc3RhdGljIGludCB0Y2hfcmVjdl9tbmNjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1X2ludDMyX3QgY2FsbHJlZiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCByYzsKKworCS8qIEZpbmQgY2FsbHJlZiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKG5ldCwgY2FsbHJlZik7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FSU87CisJaWYgKCF0cmFucy0+bGNoYW4pCisJCXJldHVybiAwOworCWxjaGFuID0gdHJhbnMtPmxjaGFuOworCWJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWlmIChpcGFjY19ydHBfZGlyZWN0KSB7CisJCQlERUJVR1AoRENDLCAiRXJyb3I6IFJUUCBwcm94eSBpcyBkaXNhYmxlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBpbiBjYXNlLCB3ZSBkb24ndCBoYXZlIGEgUlRQIHNvY2tldCB5ZXQsIHdlIG5vdGUgdGhpcworCQkgKiBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHRyeSBsYXRlciAqLworCQlpZiAoIWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJCXRyYW5zLT50Y2hfcmVjdiA9IGVuYWJsZTsKKwkJCURFQlVHUChEQ0MsICJxdWV1ZSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgKCVkKVxuIiwgZW5hYmxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChlbmFibGUpIHsKKwkJCS8qIGNvbm5lY3QgdGhlIFRDSCdzIHRvIG91ciBSVFAgcHJveHkgKi8KKwkJCXJjID0gcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhsY2hhbik7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJCS8qIGFzc2lnbiBzb2NrZXQgdG8gYXBwbGljYXRpb24gaW50ZXJmYWNlICovCisJCQlydHBfc29ja2V0X3Vwc3RyZWFtKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJbmV0LCBjYWxscmVmKTsKKwkJfSBlbHNlCisJCQlydHBfc29ja2V0X3Vwc3RyZWFtKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJbmV0LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJaWYgKGVuYWJsZSkKKwkJCXJldHVybiB0cmF1X3JlY3ZfbGNoYW4obGNoYW4sIGNhbGxyZWYpOworCQlyZXR1cm4gdHJhdV9tdXhfdW5tYXAoTlVMTCwgY2FsbHJlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdGF0dXNfZW5xKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCURFQlVHUChEQ0MsICItPiBTVEFUVVMgRU5RXG4iKTsKKwlyZXR1cm4gZ3NtNDhfY2NfdHhfc3RhdHVzKHRyYW5zLCBtc2cpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NjX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gYXJnOworCWludCBkaXNjb25uZWN0ID0gMCwgcmVsZWFzZSA9IDA7CisJaW50IG1vX2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfUkVDT1ZFUllfVElNRVI7CisJaW50IG1vX2xvY2F0aW9uID0gR1NNNDhfQ0FVU0VfTE9DX1VTRVI7CisJaW50IGw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfTk9STUFMX1VOU1BFQzsKKwlpbnQgbDRfbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFU7CisJc3RydWN0IGdzbV9tbmNjIG1vX3JlbCwgbDRfcmVsOworCisJbWVtc2V0KCZtb19yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb19yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCW1lbXNldCgmbDRfcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbDRfcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXN3aXRjaCh0cmFucy0+Y2MuVGN1cnJlbnQpIHsKKwljYXNlIDB4MzAzOgorCQlyZWxlYXNlID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMTA6CisJCWRpc2Nvbm5lY3QgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMzoKKwkJZGlzY29ubmVjdCA9IDE7CisJCS8qIHVua25vd24sIGRpZCBub3QgZmluZCBpdCBpbiB0aGUgc3BlY3MgKi8KKwkJYnJlYWs7CisJY2FzZSAweDMwMToKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzA4OgorCQlpZiAoIXRyYW5zLT5jYy5UMzA4X3NlY29uZCkgeworCQkJLyogcmVzdGFydCBUMzA4IGEgc2Vjb25kIHRpbWUgKi8KKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZ0cmFucy0+Y2MubXNnKTsKKwkJCXRyYW5zLT5jYy5UMzA4X3NlY29uZCA9IDE7CisJCQlicmVhazsgLyogc3RheSBpbiByZWxlYXNlIHN0YXRlICovCisJCX0KKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybjsKKy8vCQlyZWxlYXNlID0gMTsKKy8vCQlsNF9jYXVzZSA9IDE0OworLy8JCWJyZWFrOworCWNhc2UgMHgzMDY6CisJCXJlbGVhc2UgPSAxOworCQltb19jYXVzZSA9IHRyYW5zLT5jYy5tc2cuY2F1c2UudmFsdWU7CisJCW1vX2xvY2F0aW9uID0gdHJhbnMtPmNjLm1zZy5jYXVzZS5sb2NhdGlvbjsKKwkJYnJlYWs7CisJY2FzZSAweDMyMzoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlbGVhc2UgPSAxOworCX0KKworCWlmIChyZWxlYXNlICYmIHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIHByb2Nlc3MgcmVsZWFzZSB0b3dhcmRzIGxheWVyIDQgKi8KKwkJbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgbDRfbG9jYXRpb24sIGw0X2NhdXNlKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCX0KKworCWlmIChkaXNjb25uZWN0ICYmIHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIHByb2Nlc3MgZGlzY29ubmVjdCB0b3dhcmRzIGxheWVyIDQgKi8KKwkJbW5jY19zZXRfY2F1c2UoJmw0X3JlbCwgbDRfbG9jYXRpb24sIGw0X2NhdXNlKTsKKwkJbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRElTQ19JTkQsICZsNF9yZWwpOworCX0KKworCS8qIHByb2Nlc3MgZGlzY29ubmVjdCB0b3dhcmRzIG1vYmlsZSBzdGF0aW9uICovCisJaWYgKGRpc2Nvbm5lY3QgfHwgcmVsZWFzZSkgeworCQltbmNjX3NldF9jYXVzZSgmbW9fcmVsLCBtb19sb2NhdGlvbiwgbW9fY2F1c2UpOworCQltb19yZWwuY2F1c2UuZGlhZ1swXSA9ICgodHJhbnMtPmNjLlRjdXJyZW50ICYgMHhmMDApID4+IDgpICsgJzAnOworCQltb19yZWwuY2F1c2UuZGlhZ1sxXSA9ICgodHJhbnMtPmNjLlRjdXJyZW50ICYgMHgwZjApID4+IDQpICsgJzAnOworCQltb19yZWwuY2F1c2UuZGlhZ1syXSA9ICh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDAwZikgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnX2xlbiA9IDM7CisKKwkJaWYgKGRpc2Nvbm5lY3QpCisJCQlnc200OF9jY190eF9kaXNjb25uZWN0KHRyYW5zLCAmbW9fcmVsKTsKKwkJaWYgKHJlbGVhc2UpCisJCQlnc200OF9jY190eF9yZWxlYXNlKHRyYW5zLCAmbW9fcmVsKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfc3RhcnRfY2NfdGltZXIoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIGludCBjdXJyZW50LAorCQkJCSBpbnQgc2VjLCBpbnQgbWljcm8pCit7CisJREVCVUdQKERDQywgInN0YXJ0aW5nIHRpbWVyIFQleCB3aXRoICVkIHNlY29uZHNcbiIsIGN1cnJlbnQsIHNlYyk7CisJdHJhbnMtPmNjLnRpbWVyLmNiID0gZ3NtNDhfY2NfdGltZW91dDsKKwl0cmFucy0+Y2MudGltZXIuZGF0YSA9IHRyYW5zOworCWJzY19zY2hlZHVsZV90aW1lcigmdHJhbnMtPmNjLnRpbWVyLCBzZWMsIG1pY3JvKTsKKwl0cmFucy0+Y2MuVGN1cnJlbnQgPSBjdXJyZW50OworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3NldHVwKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgc2V0dXA7CisKKwltZW1zZXQoJnNldHVwLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJc2V0dXAuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGVtZXJnZW5jeSBzZXR1cCBpcyBpZGVudGlmaWVkIGJ5IG1zZ190eXBlICovCisJaWYgKG1zZ190eXBlID09IEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQKQorCQlzZXR1cC5lbWVyZ2VuY3kgPSAxOworCisJLyogdXNlIHN1YnNjcmliZXIgYXMgY2FsbGluZyBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NBTExJTkc7CisJCXN0cm5jcHkoc2V0dXAuY2FsbGluZy5udW1iZXIsIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkJCXNpemVvZihzZXR1cC5jYWxsaW5nLm51bWJlciktMSk7CisJCXN0cm5jcHkoc2V0dXAuaW1zaSwgdHJhbnMtPnN1YnNjci0+aW1zaSwKKwkJCXNpemVvZihzZXR1cC5pbXNpKS0xKTsKKwl9CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmc2V0dXAuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnNldHVwLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiBjYWxsZWQgcGFydHkgYmNkIG51bWJlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQUxMRURfQkNEKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NBTExFRDsKKwkJZ3NtNDhfZGVjb2RlX2NhbGxlZCgmc2V0dXAuY2FsbGVkLAorCQkJICAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQUxMRURfQkNEKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZzZXR1cC51c2VydXNlciwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUiktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnNldHVwLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisJLyogQ0xJUiBzdXBwcmVzc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DTElSX1NVUFApKQorCQlzZXR1cC5jbGlyLnN1cCA9IDE7CisJLyogQ0xJUiBpbnZvY2F0aW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfSU5WT0MpKQorCQlzZXR1cC5jbGlyLmludiA9IDE7CisJLyogY2MgY2FwICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCkpIHsKKwkJc2V0dXAuZmllbGRzIHw9IE1OQ0NfRl9DQ0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2NjY2FwKCZzZXR1cC5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9JTklUSUFURUQpOworCisJTE9HUChEQ0MsIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgKCVzKSBzZW5kcyBTRVRVUCB0byAlc1xuIiwKKwkgICAgIHN1YnNjcl9uYW1lKHRyYW5zLT5zdWJzY3IpLCB0cmFucy0+c3Vic2NyLT5leHRlbnNpb24sCisJICAgICBzZXR1cC5jYWxsZWQubnVtYmVyKTsKKworCS8qIGluZGljYXRlIHNldHVwIHRvIE1OQ0MgKi8KKwltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9JTkQsICZzZXR1cCk7CisKKwkvKiBNTkNDIGNvZGUgd2lsbCBtb2RpZnkgdGhlIGNoYW5uZWwgYXN5bmNocm9ub3VzbHksIHdlIHNob3VsZAorCSAqIGlwYWNjZXNzLWJpbmQgb25seSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUgdG8gdGhlCisJICogbGNoYW4tPnRjaF9tb2RlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc21fbW5jYyAqc2V0dXAgPSBhcmc7CisJaW50IHJjLCB0cmFuc19pZDsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwkvKiB0cmFuc2FjdGlvbiBpZCBtdXN0IG5vdCBiZSBhc3NpZ25lZCAqLworCWlmICh0cmFucy0+dHJhbnNhY3Rpb25faWQgIT0gMHhmZikgeyAvKiB1bmFzc3NpZ25lZCAqLworCQlERUJVR1AoRENDLCAiVFggU2V0dXAgd2l0aCBhc3NpZ25lZCB0cmFuc2FjdGlvbi4gIgorCQkJIlRoaXMgaXMgbm90IGFsbG93ZWQhXG4iKTsKKwkJLyogVGVtcG9yYXJpbHkgb3V0IG9mIG9yZGVyICovCisJCXJjID0gbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgICAgICBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisJCisJLyogR2V0IGZyZWUgdHJhbnNhY3Rpb25faWQgKi8KKwl0cmFuc19pZCA9IHRyYW5zX2Fzc2lnbl90cmFuc19pZCh0cmFucy0+c3Vic2NyLCBHU000OF9QRElTQ19DQywgMCk7CisJaWYgKHRyYW5zX2lkIDwgMCkgeworCQkvKiBubyBmcmVlIHRyYW5zYWN0aW9uIElEICovCisJCXJjID0gbW5jY19yZWxlYXNlX2luZCh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCB0cmFucy0+Y2FsbHJlZiwKKwkJCQkgICAgICBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TRVRVUDsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwMywgR1NNNDhfVDMwMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0JFQVJFUl9DQVApCisJCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMCwgJnNldHVwLT5iZWFyZXJfY2FwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmc2V0dXAtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmc2V0dXAtPnByb2dyZXNzKTsKKwkvKiBjYWxsaW5nIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9DQUxMSU5HKQorCQlnc200OF9lbmNvZGVfY2FsbGluZyhtc2csICZzZXR1cC0+Y2FsbGluZyk7CisJLyogY2FsbGVkIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9DQUxMRUQpCisJCWdzbTQ4X2VuY29kZV9jYWxsZWQobXNnLCAmc2V0dXAtPmNhbGxlZCk7CisJLyogdXNlci11c2VyICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZzZXR1cC0+dXNlcnVzZXIpOworCS8qIHJlZGlyZWN0aW5nIHBhcnR5IEJDRCBudW1iZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9SRURJUkVDVElORykKKwkJZ3NtNDhfZW5jb2RlX3JlZGlyZWN0aW5nKG1zZywgJnNldHVwLT5yZWRpcmVjdGluZyk7CisJLyogc2lnbmFsICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfU0lHTkFMKQorCQlnc200OF9lbmNvZGVfc2lnbmFsKG1zZywgc2V0dXAtPnNpZ25hbCk7CisJCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9jYWxsX2NvbmYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNhbGxfY29uZjsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMxMCwgR1NNNDhfVDMxMCk7CisKKwltZW1zZXQoJmNhbGxfY29uZiwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNhbGxfY29uZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisjaWYgMAorCS8qIHJlcGVhdCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9SRVBFQVRfQ0lSKSkKKwkJY2FsbF9jb25mLnJlcGVhdCA9IDE7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9TRVEpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMjsKKyNlbmRpZgorCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZjYWxsX2NvbmYuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQljYWxsX2NvbmYuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZjYWxsX2NvbmYuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQljYWxsX2NvbmYuZmllbGRzIHw9IE1OQ0NfRl9DQ0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2NjY2FwKCZjYWxsX2NvbmYuY2NjYXAsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0NBTExfQ09ORl9JTkQsCisJCQkgICAgJmNhbGxfY29uZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpwcm9jZWVkaW5nID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NBTExfUFJPQzsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19DQUxMX1BST0MpOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0JFQVJFUl9DQVApCisJCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMCwgJnByb2NlZWRpbmctPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnByb2NlZWRpbmctPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZwcm9jZWVkaW5nLT5wcm9ncmVzcyk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9hbGVydGluZyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgYWxlcnRpbmc7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAxLCBHU000OF9UMzAxKTsKKworCW1lbXNldCgmYWxlcnRpbmcsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlhbGVydGluZy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmYWxlcnRpbmcuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCisJLyogcHJvZ3Jlc3MgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUFJPR1JfSU5EKSkgeworCQlhbGVydGluZy5maWVsZHMgfD0gTU5DQ19GX1BST0dSRVNTOworCQlnc200OF9kZWNvZGVfcHJvZ3Jlc3MoJmFsZXJ0aW5nLnByb2dyZXNzLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfUFJPR1JfSU5EKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlhbGVydGluZy5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmYWxlcnRpbmcuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX1JFQ0VJVkVEKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19BTEVSVF9JTkQsCisJCQkgICAgJmFsZXJ0aW5nKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9hbGVydGluZyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqYWxlcnRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQUxFUlRJTkc7CisKKwkvKiBmYWNpbGl0eSAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmYWxlcnRpbmctPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmYWxlcnRpbmctPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoYWxlcnRpbmctPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmFsZXJ0aW5nLT51c2VydXNlcik7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQpOworCQorCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3Byb2dyZXNzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpwcm9ncmVzcyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19QUk9HUkVTUzsKKworCS8qIHByb2dyZXNzICovCisJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMSwgJnByb2dyZXNzLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKHByb2dyZXNzLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZwcm9ncmVzcy0+dXNlcnVzZXIpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqY29ubmVjdCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19DT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEzLCBHU000OF9UMzEzKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmNvbm5lY3QtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChjb25uZWN0LT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZjb25uZWN0LT5wcm9ncmVzcyk7CisJLyogY29ubmVjdGVkIG51bWJlciAqLworCWlmIChjb25uZWN0LT5maWVsZHMgJiBNTkNDX0ZfQ09OTkVDVEVEKQorCQlnc200OF9lbmNvZGVfY29ubmVjdGVkKG1zZywgJmNvbm5lY3QtPmNvbm5lY3RlZCk7CisJLyogdXNlci11c2VyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmNvbm5lY3QtPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX0lORCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJmNvbm5lY3QsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwljb25uZWN0LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjb25uZWN0ZWQgcGFydHkgbnVtYmVyICovCisJaWYgKHRyYW5zLT5zdWJzY3IpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX0NPTk5FQ1RFRDsKKwkJc3RybmNweShjb25uZWN0LmNvbm5lY3RlZC5udW1iZXIsIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkJCXNpemVvZihjb25uZWN0LmNvbm5lY3RlZC5udW1iZXIpLTEpOworCQlzdHJuY3B5KGNvbm5lY3QuaW1zaSwgdHJhbnMtPnN1YnNjci0+aW1zaSwKKwkJCXNpemVvZihjb25uZWN0Lmltc2kpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJmNvbm5lY3QuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZjb25uZWN0LnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZjb25uZWN0LnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DTkYsICZjb25uZWN0KTsKK30KKworCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3RfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0X2FjazsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisJCisJbWVtc2V0KCZjb25uZWN0X2FjaywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3RfYWNrLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU0VUVVBfQ09NUExfSU5ELAorCQkJICAgICZjb25uZWN0X2Fjayk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19DT05ORUNUX0FDSzsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgZGlzYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRKTsKKworCW1lbXNldCgmZGlzYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWRpc2MuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0NBVVNFLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmRpc2MuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJmRpc2MuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZkaXNjLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZkaXNjLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRElTQ19JTkQsICZkaXNjKTsKKworfQorCitzdGF0aWMgc3RydWN0IGdzbV9tbmNjX2NhdXNlIGRlZmF1bHRfY2F1c2UgPSB7CisJLmxvY2F0aW9uCT0gR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCS5jb2RpbmcJCT0gMCwKKwkucmVjCQk9IDAsCisJLnJlY192YWwJPSAwLAorCS52YWx1ZQkJPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDLAorCS5kaWFnX2xlbgk9IDAsCisJLmRpYWcJCT0geyAwIH0sCit9OworCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRpc2MgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRElTQ09OTkVDVDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwNiwgR1NNNDhfVDMwNik7CisKKwkvKiBjYXVzZSAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkaXNjLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwkvKiBmYWNpbGl0eSAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZkaXNjLT5mYWNpbGl0eSk7CisJLyogcHJvZ3Jlc3MgKi8KKwlpZiAoZGlzYy0+ZmllbGRzICYgTU5DQ19GX1BST0dSRVNTKQorCQlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAwLCAmZGlzYy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfVVNFUlVTRVIpCisJCWdzbTQ4X2VuY29kZV91c2VydXNlcihtc2csIDAsICZkaXNjLT51c2VydXNlcik7CisKKwkvKiBzdG9yZSBkaXNjb25uZWN0IGNhdXNlIGZvciBUMzA2IGV4cGlyeSAqLworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgZGlzYywgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHJlbDsKKwlpbnQgcmM7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmcmVsLmNhdXNlLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBVVNFKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnJlbC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmcmVsLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnJlbC5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJaWYgKHRyYW5zLT5jYy5zdGF0ZSA9PSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSB7CisJCS8qIHJlbGVhc2UgY29sbGlzaW9uIDUuNC41ICovCisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJfSBlbHNlIHsKKwkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkgICAgIEdTTTQ4X1BESVNDX0NDIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkgICAgIEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEwpOworCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1JFTF9JTkQsICZyZWwpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9OVUxMKTsKKworCXRyYW5zLT5jYWxscmVmID0gMDsKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZWxlYXNlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpyZWwgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfUkVMRUFTRTsKKworCXRyYW5zLT5jYWxscmVmID0gMDsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDgsIEdTTTQ4X1QzMDgpOworCisJLyogY2F1c2UgKi8KKwlpZiAocmVsLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDAsICZyZWwtPmNhdXNlKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnJlbC0+ZmFjaWxpdHkpOworCS8qIHVzZXItdXNlciAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnJlbC0+dXNlcnVzZXIpOworCisJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMDsKKwltZW1jcHkoJnRyYW5zLT5jYy5tc2csIHJlbCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCisJaWYgKHRyYW5zLT5jYy5zdGF0ZSAhPSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKQorCQluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYyA9IDA7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmVsLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBjYXVzZSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQVVTRSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmcmVsLmNhdXNlLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBVVNFKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX0ZBQ0lMSVRZOworCQlnc200OF9kZWNvZGVfZmFjaWxpdHkoJnJlbC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmcmVsLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJnJlbC5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCXN3aXRjaCAodHJhbnMtPmNjLnN0YXRlKSB7CisJCWNhc2UgR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVKX0lORCwgJnJlbCk7CisJCQlicmVhazsKKwkJY2FzZSBHU01fQ1NUQVRFX1JFTEVBU0VfUkVROgorCQkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywKKwkJCQkJICBNTkNDX1JFTF9DTkYsICZyZWwpOworCQkJLyogRklYTUU6IGluIGNhc2Ugb2YgbXVsdGlwbGUgY2FsbHMsIHdlIGNhbid0IHNpbXBseQorCQkJICogaGFuZyB1cCBoZXJlICEgKi8KKwkJCWxjaGFuX2F1dG9fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywKKwkJCQkJICBNTkNDX1JFTF9JTkQsICZyZWwpOworCQl9CisJfQorCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGwoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJLyogY2F1c2UgKi8KKwlpZiAocmVsLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDAsICZyZWwtPmNhdXNlKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJnJlbC0+ZmFjaWxpdHkpOworCS8qIHVzZXItdXNlciAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnJlbC0+dXNlcnVzZXIpOworCisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9mYWNpbGl0eShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgZmFjOworCisJbWVtc2V0KCZmYWMsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlmYWMuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0ZBQ0lMSVRZLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZmFjLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWZhYy5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmZmFjLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfRkFDSUxJVFlfSU5ELCAmZmFjKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9mYWNpbGl0eShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZmFjID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0ZBQ0lMSVRZOworCisJLyogZmFjaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAxLCAmZmFjLT5mYWNpbGl0eSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ob2xkKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBob2xkOworCisJbWVtc2V0KCZob2xkLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJaG9sZC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0hPTERfSU5ELCAmaG9sZCk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19IT0xEX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2hvbGRfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpob2xkX3JlaiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19IT0xEX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKGhvbGRfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZob2xkX3Jlai0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmV0cmlldmUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIHJldHJpZXZlOworCisJbWVtc2V0KCZyZXRyaWV2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCXJldHJpZXZlLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVUUklFVkVfSU5ELAorCQkJICAgICZyZXRyaWV2ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfUkVUUl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJldHJpZXZlX3JlaiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKHJldHJpZXZlX3Jlai0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmcmV0cmlldmVfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdGFydF9kdG1mKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkdG1mOworCisJbWVtc2V0KCZkdG1mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZHRtZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyoga2V5cGFkIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0tQRF9GQUNJTElUWSkpIHsKKwkJZHRtZi5maWVsZHMgfD0gTU5DQ19GX0tFWVBBRDsKKwkJZ3NtNDhfZGVjb2RlX2tleXBhZCgmZHRtZi5rZXlwYWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0tQRF9GQUNJTElUWSktMSk7CisJfQorCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NUQVJUX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmR0bWYgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfU1RBUlRfRFRNRl9BQ0s7CisKKwkvKiBrZXlwYWQgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0tFWVBBRCkKKwkJZ3NtNDhfZW5jb2RlX2tleXBhZChtc2csIGR0bWYtPmtleXBhZCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX1JFSjsKKworCS8qIGNhdXNlICovCisJaWYgKGR0bWYtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmR0bWYtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0b3BfZHRtZl9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVE9QX0RUTUZfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc3RvcF9kdG1mKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbW5jYyBkdG1mOworCisJbWVtc2V0KCZkdG1mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZHRtZi5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RPUF9EVE1GX0lORCwgJmR0bWYpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJbWVtc2V0KCZtb2RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb2RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIDApOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZtb2RpZnkuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX09SSUdfTU9ESUZZKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19NT0RJRllfSU5ELCAmbW9kaWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9tb2RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRlk7CisKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMjMsIEdTTTQ4X1QzMjMpOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfYmVhcmVyX2NhcChtc2csIDEsICZtb2RpZnktPmJlYXJlcl9jYXApOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19NT0RJRllfQ05GLCAmbW9kaWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9tb2RpZnlfY29tcGxldGUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEw7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X21vZGlmeV9yZWplY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIG1vZGlmeTsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZtb2RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltb2RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIEdTTTQ4X0lFX0NBVVNFKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IEdTTTQ4X0lFX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZtb2RpZnkuYmVhcmVyX2NhcCwKKwkJCQkgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCktMSk7CisJfQorCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZtb2RpZnkuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9SRUosICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9yZWplY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19NT0RJRllfUkVKRUNUOworCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlnc200OF9lbmNvZGVfYmVhcmVyX2NhcChtc2csIDEsICZtb2RpZnktPmJlYXJlcl9jYXApOworCS8qIGNhdXNlICovCisJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJm1vZGlmeS0+Y2F1c2UpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm5vdGlmeSA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19OT1RJRlk7CisKKwkvKiBub3RpZnkgKi8KKwlnc200OF9lbmNvZGVfbm90aWZ5KG1zZywgbm90aWZ5LT5ub3RpZnkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfbm90aWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworLy8Jc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIG5vdGlmeTsKKworCW1lbXNldCgmbm90aWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbm90aWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKy8vCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4pOworCWlmIChwYXlsb2FkX2xlbiA+PSAxKQorCQlnc200OF9kZWNvZGVfbm90aWZ5KCZub3RpZnkubm90aWZ5LCBnaC0+ZGF0YSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTk9USUZZX0lORCwgJm5vdGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnVzZXIgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfVVNFUl9JTkZPOworCisJLyogdXNlci11c2VyICovCisJaWYgKHVzZXItPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMSwgJnVzZXItPnVzZXJ1c2VyKTsKKwkvKiBtb3JlIGRhdGEgKi8KKwlpZiAodXNlci0+bW9yZSkKKwkJZ3NtNDhfZW5jb2RlX21vcmUobXNnKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3VzZXJpbmZvKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyB1c2VyOworCisJbWVtc2V0KCZ1c2VyLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJdXNlci5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfVVNFUl9VU0VSLCAwKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQl1c2VyLmZpZWxkcyB8PSBNTkNDX0ZfVVNFUlVTRVI7CisJCWdzbTQ4X2RlY29kZV91c2VydXNlcigmdXNlci51c2VydXNlciwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUiktMSk7CisJfQorCS8qIG1vcmUgZGF0YSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9NT1JFX0RBVEEpKQorCQl1c2VyLm1vcmUgPSAxOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1VTRVJJTkZPX0lORCwgJnVzZXIpOworfQorCitzdGF0aWMgaW50IF9nc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1vZGUgPSBhcmc7CisKKwlyZXR1cm4gZ3NtNDhfbGNoYW5fbW9kaWZ5KHRyYW5zLT5sY2hhbiwgbW9kZS0+bGNoYW5fbW9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG93bnN0YXRlIHsKKwl1X2ludDMyX3QJc3RhdGVzOworCWludAkJdHlwZTsKKwlpbnQJCSgqcm91dCkgKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpOworfSBkb3duc3RhdGVsaXN0W10gPSB7CisJLyogbW9iaWxlIG9yaWdpbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfSU5JVElBVEVEKSwgLyogNS4yLjEuMiAqLworCSBNTkNDX0NBTExfUFJPQ19SRVEsIGdzbTQ4X2NjX3R4X2NhbGxfcHJvY30sCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpIHwgU0JJVChHU01fQ1NUQVRFX01PX0NBTExfUFJPQyksIC8qIDUuMi4xLjIgfCA1LjIuMS41ICovCisJIE1OQ0NfQUxFUlRfUkVRLCBnc200OF9jY190eF9hbGVydGluZ30sCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpIHwgU0JJVChHU01fQ1NUQVRFX01PX0NBTExfUFJPQykgfCBTQklUKEdTTV9DU1RBVEVfQ0FMTF9ERUxJVkVSRUQpLCAvKiA1LjIuMS4yIHwgNS4yLjEuNiB8IDUuMi4xLjYgKi8KKwkgTU5DQ19TRVRVUF9SU1AsIGdzbTQ4X2NjX3R4X2Nvbm5lY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuNC4yICovCisJIE1OQ0NfUFJPR1JFU1NfUkVRLCBnc200OF9jY190eF9wcm9ncmVzc30sCisJLyogbW9iaWxlIHRlcm1pbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4yLjEgKi8KKwkgTU5DQ19TRVRVUF9SRVEsIGdzbTQ4X2NjX3R4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NPTk5FQ1RfUkVRVUVTVCksCisJIE1OQ0NfU0VUVVBfQ09NUExfUkVRLCBnc200OF9jY190eF9jb25uZWN0X2Fja30sCisJIC8qIHNpZ25hbGxpbmcgZHVyaW5nIGNhbGwgKi8KKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfTk9USUZZX1JFUSwgZ3NtNDhfY2NfdHhfbm90aWZ5fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksCisJIE1OQ0NfRkFDSUxJVFlfUkVRLCBnc200OF9jY190eF9mYWNpbGl0eX0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RBUlRfRFRNRl9SU1AsIGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfYWNrfSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JFSiwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9yZWp9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUT1BfRFRNRl9SU1AsIGdzbTQ4X2NjX3R4X3N0b3BfZHRtZl9hY2t9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19IT0xEX0NORiwgZ3NtNDhfY2NfdHhfaG9sZF9hY2t9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19IT0xEX1JFSiwgZ3NtNDhfY2NfdHhfaG9sZF9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19SRVRSSUVWRV9DTkYsIGdzbTQ4X2NjX3R4X3JldHJpZXZlX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX1JFSiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfcmVqfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfTU9ESUZZX1JFUSwgZ3NtNDhfY2NfdHhfbW9kaWZ5fSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX09SSUdfTU9ESUZZKSwKKwkgTU5DQ19NT0RJRllfUlNQLCBnc200OF9jY190eF9tb2RpZnlfY29tcGxldGV9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SRUosIGdzbTQ4X2NjX3R4X21vZGlmeV9yZWplY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19VU0VSSU5GT19SRVEsIGdzbTQ4X2NjX3R4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtTQklUKEdTTV9DU1RBVEVfSU5JVElBVEVEKSwKKwkgTU5DQ19SRUpfUkVRLCBnc200OF9jY190eF9yZWxlYXNlX2NvbXBsfSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9ESVNDT05ORUNUX0lORCkgLSBTQklUKEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRKSwgLyogNS40LjQgKi8KKwkgTU5DQ19ESVNDX1JFUSwgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdH0sCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCkgLSBTQklUKEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpLCAvKiA1LjQuMy4yICovCisJIE1OQ0NfUkVMX1JFUSwgZ3NtNDhfY2NfdHhfcmVsZWFzZX0sCisJLyogc3BlY2lhbCAqLworCXtBTExfU1RBVEVTLAorCSBNTkNDX0xDSEFOX01PRElGWSwgX2dzbTQ4X2xjaGFuX21vZGlmeX0sCit9OworCisjZGVmaW5lIERPV05TTExFTiBcCisJKHNpemVvZihkb3duc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZG93bnN0YXRlKSkKKworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZykKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTCwgKnRyYW5zdDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IE5VTEw7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJc3RydWN0IGdzbV9tbmNjICpkYXRhID0gYXJnLCByZWw7CisKKwkvKiBoYW5kbGUgc3BlY2lhbCBtZXNzYWdlcyAqLworCXN3aXRjaChtc2dfdHlwZSkgeworCWNhc2UgTU5DQ19CUklER0U6CisJCXJldHVybiB0Y2hfYnJpZGdlKG5ldCwgYXJnKTsKKwljYXNlIE1OQ0NfRlJBTUVfRFJPUDoKKwkJcmV0dXJuIHRjaF9yZWN2X21uY2MobmV0LCBkYXRhLT5jYWxscmVmLCAwKTsKKwljYXNlIE1OQ0NfRlJBTUVfUkVDVjoKKwkJcmV0dXJuIHRjaF9yZWN2X21uY2MobmV0LCBkYXRhLT5jYWxscmVmLCAxKTsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQkvKiBGaW5kIGNhbGxyZWYgKi8KKwkJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBkYXRhLT5jYWxscmVmKTsKKwkJaWYgKCF0cmFucykKKwkJCXJldHVybiAtRUlPOworCQlpZiAoIXRyYW5zLT5sY2hhbikKKwkJCXJldHVybiAwOworCQlpZiAodHJhbnMtPmxjaGFuLT50eXBlICE9IEdTTV9MQ0hBTl9UQ0hfRikKKwkJCXJldHVybiAwOworCQlidHMgPSB0cmFucy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwkJc3dpdGNoIChidHMtPnR5cGUpIHsKKwkJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJCWlmICghdHJhbnMtPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gcnRwX3NlbmRfZnJhbWUodHJhbnMtPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsIGFyZyk7CisJCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCQlyZXR1cm4gdHJhdV9zZW5kX2ZyYW1lKHRyYW5zLT5sY2hhbiwgYXJnKTsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmVsLmNhbGxyZWYgPSBkYXRhLT5jYWxscmVmOworCisJLyogRmluZCBjYWxscmVmICovCisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBkYXRhLT5jYWxscmVmKTsKKworCS8qIENhbGxyZWYgdW5rbm93biAqLworCWlmICghdHJhbnMpIHsKKwkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkJaWYgKG1zZ190eXBlICE9IE1OQ0NfU0VUVVBfUkVRKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCSJ1bmtub3duIGNhbGxyZWYgJWRcbiIsIGRhdGEtPmNhbGxlZC5udW1iZXIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIGRhdGEtPmNhbGxyZWYpOworCQkJLyogSW52YWxpZCBjYWxsIHJlZmVyZW5jZSAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfVFJBTlNfSUQpOworCQl9CisJCWlmICghZGF0YS0+Y2FsbGVkLm51bWJlclswXSAmJiAhZGF0YS0+aW1zaVswXSkgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpKSAiCisJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCSJubyBudW1iZXIgb3IgSU1TSVxuIiwgZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQkJLyogSW52YWxpZCBudW1iZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0lOVl9OUl9GT1JNQVQpOworCQl9CisJCS8qIE5ldyB0cmFuc2FjdGlvbiBkdWUgdG8gc2V0dXAsIGZpbmQgc3Vic2NyaWJlciAqLworCQlpZiAoZGF0YS0+Y2FsbGVkLm51bWJlclswXSkKKwkJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKG5ldCwKKwkJCQkJCQlkYXRhLT5jYWxsZWQubnVtYmVyKTsKKwkJZWxzZQorCQkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKG5ldCwgZGF0YS0+aW1zaSk7CisJCS8qIElmIHN1YnNjcmliZXIgaXMgbm90IGZvdW5kICovCisJCWlmICghc3Vic2NyKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCSJ1bmtub3duIHN1YnNjcmliZXIgJXNcbiIsIGRhdGEtPmNhbGxlZC5udW1iZXIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIGRhdGEtPmNhbGxlZC5udW1iZXIpOworCQkJLyogVW5rbm93biBzdWJzY3JpYmVyICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9VTkFTU0lHTkVEX05SKTsKKwkJfQorCQkvKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCAiYXR0YWNoZWQiICovCisJCWlmICghc3Vic2NyLT5sYWMpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJImRldGFjaGVkIHN1YnNjcmliZXIgJXNcbiIsIGRhdGEtPmNhbGxlZC5udW1iZXIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIGRhdGEtPmNhbGxlZC5udW1iZXIpOworCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJLyogVGVtcG9yYXJpbHkgb3V0IG9mIG9yZGVyICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9ERVNUX09PTyk7CisJCX0KKwkJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJCXRyYW5zID0gdHJhbnNfYWxsb2Moc3Vic2NyLCBHU000OF9QRElTQ19DQywgMHhmZiwgZGF0YS0+Y2FsbHJlZik7CisJCWlmICghdHJhbnMpIHsKKwkJCURFQlVHUChEQ0MsICJObyBtZW1vcnkgZm9yIHRyYW5zLlxuIik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQkvKiBSZXNzb3VyY2UgdW5hdmFpbGFibGUgKi8KKwkJCW1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkvKiBGaW5kIGxjaGFuICovCisJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCQkvKiBJZiBzdWJzY3JpYmVyIGhhcyBubyBsY2hhbiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQkvKiBmaW5kIHRyYW5zYWN0aW9uIHdpdGggdGhpcyBzdWJzY3JpYmVyIGFscmVhZHkgcGFnaW5nICovCisJCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFuc3QsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCQkJLyogVHJhbnNhY3Rpb24gb2Ygb3VyIGxjaGFuPyAqLworCQkJCWlmICh0cmFuc3QgPT0gdHJhbnMgfHwKKwkJCQkgICAgdHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyKQorCQkJCQljb250aW51ZTsKKwkJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJCSJ1bmFsbG9jYXRlZCBjaGFubmVsLCBwYWdpbmcgYWxyZWFkeSAiCisJCQkJCSJzdGFydGVkLlxuIiwgYnRzLT5uciwKKwkJCQkJZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIHN0b3JlIHNldHVwIGluZm9ybWF0aW9ucyB1bnRpbCBwYWdpbmcgd2FzIHN1Y2Nlc3NmdWxsICovCisJCQltZW1jcHkoJnRyYW5zLT5jYy5tc2csIGRhdGEsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJCS8qIFRyaWdnZXIgcGFnaW5nICovCisJCQlwYWdpbmdfcmVxdWVzdChuZXQsIHN1YnNjciwgUlNMX0NIQU5ORUVEX1RDSF9GLAorCQkJCQlzZXR1cF90cmlnX3BhZ19ldnQsIHN1YnNjcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBc3NpZ24gbGNoYW4gKi8KKwkJdHJhbnMtPmxjaGFuID0gbGNoYW47CisJCXVzZV9sY2hhbihsY2hhbik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9CisJbGNoYW4gPSB0cmFucy0+bGNoYW47CisKKwkvKiBpZiBwYWdpbmcgZGlkIG5vdCByZXNwb25kIHlldCAqLworCWlmICghbGNoYW4pIHsKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHBhZ2luZyBzdGF0ZVxuIiwgCisJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQltbmNjX3NldF9jYXVzZSgmcmVsLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfTk9STV9DQUxMX0NMRUFSKTsKKwkJaWYgKG1zZ190eXBlID09IE1OQ0NfUkVMX1JFUSkKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCWVsc2UKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCBzdWIgJXMpICIKKwkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHN0YXRlICVkICglcylcbiIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXRyYW5zLT50cmFuc2FjdGlvbl9pZCwKKwkJKGxjaGFuLT5zdWJzY3IpPyhsY2hhbi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIHRyYW5zLT5jYy5zdGF0ZSwKKwkJY2Nfc3RhdGVfbmFtZXNbdHJhbnMtPmNjLnN0YXRlXSk7CisKKwkvKiBGaW5kIGZ1bmN0aW9uIGZvciBjdXJyZW50IHN0YXRlIGFuZCBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IERPV05TTExFTjsgaSsrKQorCQlpZiAoKG1zZ190eXBlID09IGRvd25zdGF0ZWxpc3RbaV0udHlwZSkKKwkJICYmICgoMSA8PCB0cmFucy0+Y2Muc3RhdGUpICYgZG93bnN0YXRlbGlzdFtpXS5zdGF0ZXMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gRE9XTlNMTEVOKSB7CisJCURFQlVHUChEQ0MsICJNZXNzYWdlIHVuaGFuZGxlZCBhdCB0aGlzIHN0YXRlLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gZG93bnN0YXRlbGlzdFtpXS5yb3V0KHRyYW5zLCBhcmcpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGF0YXN0YXRlIHsKKwl1X2ludDMyX3QJc3RhdGVzOworCWludAkJdHlwZTsKKwlpbnQJCSgqcm91dCkgKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK30gZGF0YXN0YXRlbGlzdFtdID0geworCS8qIG1vYmlsZSBvcmlnaW5hdGluZyBjYWxsIGVzdGFibGlzaG1lbnQgKi8KKwl7U0JJVChHU01fQ1NUQVRFX05VTEwpLCAvKiA1LjIuMS4yICovCisJIEdTTTQ4X01UX0NDX1NFVFVQLCBnc200OF9jY19yeF9zZXR1cH0sCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19FTUVSR19TRVRVUCwgZ3NtNDhfY2Nfcnhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfQ09OTkVDVF9JTkQpLCAvKiA1LjIuMS4yICovCisJIEdTTTQ4X01UX0NDX0NPTk5FQ1RfQUNLLCBnc200OF9jY19yeF9jb25uZWN0X2Fja30sCisJLyogbW9iaWxlIHRlcm1pbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSwgLyogNS4yLjIuMy4yICovCisJIEdTTTQ4X01UX0NDX0NBTExfQ09ORiwgZ3NtNDhfY2NfcnhfY2FsbF9jb25mfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpLCAvKiA/Pz8/IHwgNS4yLjIuMy4yICovCisJIEdTTTQ4X01UX0NDX0FMRVJUSU5HLCBnc200OF9jY19yeF9hbGVydGluZ30sCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpIHwgU0JJVChHU01fQ1NUQVRFX01PX1RFUk1fQ0FMTF9DT05GKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX1JFQ0VJVkVEKSwgLyogKDUuMi4yLjYpIHwgNS4yLjIuNiB8IDUuMi4yLjYgKi8gIAorCSBHU000OF9NVF9DQ19DT05ORUNULCBnc200OF9jY19yeF9jb25uZWN0fSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpLAorCSBHU000OF9NVF9DQ19GQUNJTElUWSwgZ3NtNDhfY2NfcnhfZmFjaWxpdHl9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfTk9USUZZLCBnc200OF9jY19yeF9ub3RpZnl9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVEFSVF9EVE1GLCBnc200OF9jY19yeF9zdGFydF9kdG1mfSwKKwl7QUxMX1NUQVRFUywKKwkgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GLCBnc200OF9jY19yeF9zdG9wX2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVEFUVVNfRU5RLCBnc200OF9jY19yeF9zdGF0dXNfZW5xfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIEdTTTQ4X01UX0NDX0hPTEQsIGdzbTQ4X2NjX3J4X2hvbGR9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfUkVUUiwgZ3NtNDhfY2NfcnhfcmV0cmlldmV9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZLCBnc200OF9jY19yeF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpLAorCSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEwsIGdzbTQ4X2NjX3J4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1QsIGdzbTQ4X2NjX3J4X21vZGlmeV9yZWplY3R9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfVVNFUl9JTkZPLCBnc200OF9jY19yeF91c2VyaW5mb30sCisJLyogY2xlYXJpbmcgKi8KKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfRElTQ09OTkVDVCwgZ3NtNDhfY2NfcnhfZGlzY29ubmVjdH0sCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuNC40LjEuMi4yICovCisJIEdTTTQ4X01UX0NDX1JFTEVBU0UsIGdzbTQ4X2NjX3J4X3JlbGVhc2V9LAorCXtBTExfU1RBVEVTLCAvKiA1LjQuMy40ICovCisJIEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEwsIGdzbTQ4X2NjX3J4X3JlbGVhc2VfY29tcGx9LAorfTsKKworI2RlZmluZSBEQVRBU0xMRU4gXAorCShzaXplb2YoZGF0YXN0YXRlbGlzdCkgLyBzaXplb2Yoc3RydWN0IGRhdGFzdGF0ZSkpCisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfY2Moc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9IGdoLT5tc2dfdHlwZSAmIDB4YmY7CisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoKGdoLT5wcm90b19kaXNjciAmIDB4ZjApIF4gMHg4MCkgPj4gNDsgLyogZmxpcCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyA9IE5VTEw7CisJaW50IGksIHJjID0gMDsKKworCWlmIChtc2dfdHlwZSAmIDB4ODApIHsKKwkJREVCVUdQKERDQywgIk1TRyAweCUyeCBub3QgZGVmaW5lZCBmb3IgUEQgZXJyb3JcbiIsIG1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCS8qIEZpbmQgdHJhbnNhY3Rpb24gKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfaWQobGNoYW4tPnN1YnNjciwgR1NNNDhfUERJU0NfQ0MsIHRyYW5zYWN0aW9uX2lkKTsKKworCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJIlJlY2VpdmVkICclcycgZnJvbSBNUyBpbiBzdGF0ZSAlZCAoJXMpXG4iLAorCQlsY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLCBsY2hhbi0+dHMtPm5yLAorCQl0cmFuc2FjdGlvbl9pZCwgKGxjaGFuLT5zdWJzY3IpPyhsY2hhbi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJZ3NtNDhfY2NfbXNnX25hbWVzW21zZ190eXBlXSwgdHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MCwKKwkJY2Nfc3RhdGVfbmFtZXNbdHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MF0pOworCisJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJaWYgKCF0cmFucykgeworCQlERUJVR1AoRENDLCAiVW5rbm93biB0cmFuc2FjdGlvbiBJRCAleCwgIgorCQkJImNyZWF0aW5nIG5ldyB0cmFucy5cbiIsIHRyYW5zYWN0aW9uX2lkKTsKKwkJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJCXRyYW5zID0gdHJhbnNfYWxsb2MobGNoYW4tPnN1YnNjciwgR1NNNDhfUERJU0NfQ0MsCisJCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKKwkJCXJjID0gZ3NtNDhfdHhfc2ltcGxlKG1zZy0+bGNoYW4sCisJCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnNhY3Rpb25faWQgPDwgNCksCisJCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkvKiBBc3NpZ24gdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMtPmxjaGFuID0gbGNoYW47CisJCXVzZV9sY2hhbihsY2hhbik7CisJfQorCisJLyogZmluZCBmdW5jdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgbWVzc2FnZSAqLworCWZvciAoaSA9IDA7IGkgPCBEQVRBU0xMRU47IGkrKykKKwkJaWYgKChtc2dfdHlwZSA9PSBkYXRhc3RhdGVsaXN0W2ldLnR5cGUpCisJCSAmJiAoKDEgPDwgdHJhbnMtPmNjLnN0YXRlKSAmIGRhdGFzdGF0ZWxpc3RbaV0uc3RhdGVzKSkKKwkJCWJyZWFrOworCWlmIChpID09IERBVEFTTExFTikgeworCQlERUJVR1AoRENDLCAiTWVzc2FnZSB1bmhhbmRsZWQgYXQgdGhpcyBzdGF0ZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGRhdGFzdGF0ZWxpc3RbaV0ucm91dCh0cmFucywgbXNnKTsKKworCXJldHVybiByYzsKK30KKworLyogaGVyZSB3ZSBwYXNzIGluIGEgbXNnYiBmcm9tIHRoZSBSU0wtPlJMTC4gIFdlIGV4cGVjdCB0aGUgbDMgcG9pbnRlciB0byBiZSBzZXQgKi8KK2ludCBnc20wNDA4X3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IHBkaXNjID0gZ2gtPnByb3RvX2Rpc2NyICYgMHgwZjsKKwlpbnQgcmMgPSAwOworCisJaWYgKHNpbGVudF9jYWxsX3Jlcm91dGUobXNnKSkKKwkJcmV0dXJuIHNpbGVudF9jYWxsX3J4KG1zZyk7CisJCisJc3dpdGNoIChwZGlzYykgeworCWNhc2UgR1NNNDhfUERJU0NfQ0M6CisJCXJjID0gZ3NtMDQwOF9yY3ZfY2MobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19NTToKKwkJcmMgPSBnc20wNDA4X3Jjdl9tbShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1JSOgorCQlyYyA9IGdzbTA0MDhfcmN2X3JyKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfU01TOgorCQlyYyA9IGdzbTA0MTFfcmN2X3Ntcyhtc2csIGxpbmtfaWQpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX01NX0dQUlM6CisJY2FzZSBHU000OF9QRElTQ19TTV9HUFJTOgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCAiCisJCQkiR1NNIDA0LjA4IGRpc2NyaW1pbmF0b3IgMHglMDJ4XG4iLCBwZGlzYyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTkNfU1M6CisJCXJjID0gaGFuZGxlX3Jjdl91c3NkKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duICIKKwkJCSJHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsIHBkaXNjKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBkZXF1ZXVlIG1lc3NhZ2VzIHRvIGxheWVyIDQgKi8KK2ludCBic2NfdXBxdWV1ZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKm1uY2M7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd29yayA9IDA7CisKKwlpZiAobmV0KQorCQl3aGlsZSAoKG1zZyA9IG1zZ2JfZGVxdWV1ZSgmbmV0LT51cHF1ZXVlKSkpIHsKKwkJCW1uY2MgPSAoc3RydWN0IGdzbV9tbmNjICopbXNnLT5kYXRhOworCQkJaWYgKG5ldC0+bW5jY19yZWN2KQorCQkJCW5ldC0+bW5jY19yZWN2KG5ldCwgbW5jYy0+bXNnX3R5cGUsIG1uY2MpOworCQkJd29yayA9IDE7IC8qIHdvcmsgZG9uZSAqLworCQkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJfQorCisJcmV0dXJuIHdvcms7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgYmUgcmFuIGJ5IHRoZSBsaW5rZXIgd2hlbiBsb2FkaW5nIHRoZSBEU08uIFdlIHVzZSBpdCB0bworICogZG8gc3lzdGVtIGluaXRpYWxpemF0aW9uLCBlLmcuIHJlZ2lzdHJhdGlvbiBvZiBzaWduYWwgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfMDQwOCh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0xDSEFOLCBnc20wNDA4X2hhbmRsZV9sY2hhbl9zaWduYWwsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0FCSVNJUCwgaGFuZGxlX2FiaXNpcF9zaWduYWwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGYzNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKQEAgLTAsMCArMSw2MjkgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMAorICogdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKKyNkZWZpbmUgR1NNNDhfQUxMT0NfU0laRQkxMDI0CisjZGVmaW5lIEdTTTQ4X0FMTE9DX0hFQURST09NCTEyOAorCisvKiBzaG91bGQgaXAuYWNjZXNzIEJUUyB1c2UgZGlyZWN0IFJUUCBzdHJlYW1zIGJldHdlZW4gZWFjaCBvdGhlciAoMSksCisgKiBvciBzaG91bGQgT3BlbkJTQyBhbHdheXMgYWN0IGFzIFJUUCByZWxheS9wcm94eSBpbiBiZXR3ZWVuICgwKSA/ICovCitpbnQgaXBhY2NfcnRwX2RpcmVjdCA9IDE7CisKK3N0cnVjdCBtc2diICpnc200OF9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oR1NNNDhfQUxMT0NfU0laRSwgR1NNNDhfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIkdTTSAwNC4wOCIpOworfQorCitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZy0+ZGF0YTsKKworCS8qIGlmIHdlIGdldCBwYXNzZWQgYSB0cmFuc2FjdGlvbiByZWZlcmVuY2UsIGRvIHNvbWUgY29tbW9uCisJICogd29yayB0aGF0IHRoZSBjYWxsZXIgbm8gbG9uZ2VyIGhhcyB0byBkbyAqLworCWlmICh0cmFucykgeworCQlnaC0+cHJvdG9fZGlzY3IgPSB0cmFucy0+cHJvdG9jb2wgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpOworCQltc2ctPmxjaGFuID0gdHJhbnMtPmxjaGFuOworCX0KKworCWlmIChtc2ctPmxjaGFuKSB7CisJCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCQlpZiAoKGdoLT5wcm90b19kaXNjciAmIEdTTTQ4X1BESVNDX01BU0spID09IEdTTTQ4X1BESVNDX0NDKQorCQkJREVCVUdQKERDQywgIihidHMgJWQgdHJ4ICVkIHRzICVkIHRpICUwMngpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCisJCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCisJCQkJZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCwKKwkJCQlnc200OF9jY19tc2dfbmFtZXNbZ2gtPm1zZ190eXBlICYgMHgzZl0pOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgcGQgJTAyeCkgIgorCQkJCSJTZW5kaW5nIDB4JTAyeCB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciwgZ2gtPm1zZ190eXBlKTsKKwl9CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS4xLjggLyBUYWJsZSA5LjkgKi8KK3N0cnVjdCBjaHJlcSB7CisJdV9pbnQ4X3QgdmFsOworCXVfaW50OF90IG1hc2s7CisJZW51bSBjaHJlcV90eXBlIHR5cGU7Cit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMVtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YgfSwKKwl7IDB4NjgsIDB4ZmMsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHg2YywgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg0MCwgMHhmMCwgQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IIH0sCisJeyAweDUwLCAweGYwLCBDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCB9LAorCXsgMHgwMCwgMHhmMCwgQ0hSRVFfVF9MT0NBVElPTl9VUEQgfSwKKwl7IDB4MTAsIDB4ZjAsIENIUkVRX1RfU0RDQ0ggfSwKKwl7IDB4ODAsIDB4ZTAsIENIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxIH0sCisJeyAweDIwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GIH0sCisJeyAweDMwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GSCB9LAorCXsgMHg2NywgMHhmZiwgQ0hSRVFfVF9MTVUgfSwKKwl7IDB4NjAsIDB4ZjksIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjEsIDB4ZmIsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjMsCTB4ZmYsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4N2YsIDB4ZmYsIENIUkVRX1RfUkVTRVJWRURfSUdOT1JFIH0sCit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMFtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ggfSwKKwl7IDB4ZTAsIDB4ZTAsIENIUkVRX1RfVENIX0YgfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGUwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTAgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaGFuX3QgY3R5cGVfYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRl0JPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkxdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX1NEQ0NIXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfTE9DQVRJT05fVVBEXQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX1RDSF9GXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkVdCT0gR1NNX0xDSEFOX1VOS05PV04sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBnc21fY2hyZXFfcmVhc29uX3QgcmVhc29uX2J5X2NocmVxW10gPSB7CisJW0NIUkVRX1RfRU1FUkdfQ0FMTF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9EQVRBX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMV0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GSF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9TRENDSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gY3R5cGVfYnlfY2hyZXFbY2hyLT50eXBlXTsKKwl9CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJVbmtub3duIENIQU5ORUwgUkVRVUVTVCBSUUQgMHglMDJ4XG4iLCByYSk7CisJcmV0dXJuIEdTTV9MQ0hBTl9TRENDSDsKK30KKworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNocmVxICpjaHIgPSAmY2hyZXFbaV07CisJCWlmICgocmEgJiBjaHItPm1hc2spID09IGNoci0+dmFsKQorCQkJcmV0dXJuIHJlYXNvbl9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJFQVNPTiAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUjsKK30KKworLyogNy4xLjcgYW5kIDkuMS43OiBSUiBDSEFObmVsIFJFTGVhc2UgKi8KK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX1JFTDsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYXVzZVswXSA9IEdTTTQ4X1JSX0NBVVNFX05PUk1BTDsKKworCURFQlVHUChEUlIsICJTZW5kaW5nIENoYW5uZWwgUmVsZWFzZTogQ2hhbjogTnVtYmVyOiAlZCBUeXBlOiAlZFxuIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHlwZSk7CisKKwkvKiBTZW5kIGFjdHVhbCByZWxlYXNlIHJlcXVlc3QgdG8gTVMgKi8KKwlnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJLyogRklYTUU6IFN0YXJ0IFRpbWVyIFQzMTA5ICovCisKKwkvKiBEZWFjdGl2YXRlIHRoZSBTQUNDSCBvbiB0aGUgQlRTIHNpZGUgKi8KKwlyZXR1cm4gcnNsX2RlYWN0X3NhY2NoKGxjaGFuKTsKK30KKworLyogQ29udmVydCBNb2JpbGUgSWRlbnRpdHkgKDEwLjUuMS40KSB0byBzdHJpbmcgKi8KK2ludCBnc200OF9taV90b19zdHJpbmcoY2hhciAqc3RyaW5nLCBjb25zdCBpbnQgc3RyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKm1pLCBjb25zdCBpbnQgbWlfbGVuKQoreworCWludCBpOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciAqc3RyX2N1ciA9IHN0cmluZzsKKwl1X2ludDMyX3QgdG1zaTsKKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX05PTkU6CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJLyogVGFibGUgMTAuNS40LjMsIHJldmVyc2UgZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaSAqLworCQlpZiAobWlfbGVuID09IEdTTTQ4X1RNU0lfTEVOICYmIG1pWzBdID09ICgweGYwIHwgR1NNX01JX1RZUEVfVE1TSSkpIHsKKwkJCW1lbWNweSgmdG1zaSwgJm1pWzFdLCA0KTsKKwkJCXRtc2kgPSBudG9obCh0bXNpKTsKKwkJCXJldHVybiBzbnByaW50ZihzdHJpbmcsIHN0cl9sZW4sICIldSIsIHRtc2kpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVswXSA+PiA0KTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBtaV9sZW47IGkrKykgeworCQkJaWYgKHN0cl9jdXIgKyAyID49IHN0cmluZyArIHN0cl9sZW4pCisJCQkJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7CisJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gJiAweGYpOworCQkJLyogc2tpcCBsYXN0IG5pYmJsZSBpbiBsYXN0IGlucHV0IGJ5dGUgd2hlbiBHU01fRVZFTiAqLworCQkJaWYoIChpICE9IG1pX2xlbi0xKSB8fCAobWlbMF0gJiBHU01fTUlfT0REKSkKKwkJCQkqc3RyX2N1cisrID0gYmNkMmNoYXIobWlbaV0gPj4gNCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCSpzdHJfY3VyKysgPSAnXDAnOworCisJcmV0dXJuIHN0cl9jdXIgLSBzdHJpbmc7Cit9CisKKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICAgIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KQoreworCXN0cnVjdCByc2xfbXJwY2kgbXJwY2k7CisKKwlpZiAoY2xhc3NtYXJrMl9sdlswXSA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXJwY2kucG93ZXJfY2xhc3MgPSBjbGFzc21hcmsyX2x2WzFdICYgMHg3OworCW1ycGNpLnZnY3NfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PCAxKTsKKwltcnBjaS52YnNfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PDIpOworCW1ycGNpLmdzbV9waGFzZSA9IChjbGFzc21hcmsyX2x2WzFdKSA+PiA1ICYgMHgzOworCisJcmV0dXJuIHJzbF9zaWVtZW5zX21ycGNpKGxjaGFuLCAmbXJwY2kpOworfQorCitpbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCAqbWlfbHYgPSBnaC0+ZGF0YSArIDIgKyAqY2xhc3NtYXJrMl9sdjsKKwkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXJldHVybiBnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBHU000OF9NSV9TSVpFLCBtaV9sdisxLCAqbWlfbHYpOworfQorCitpbnQgZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKworCWlmIChpc19zaWVtZW5zX2J0cyhidHMpKQorCQlzZW5kX3NpZW1lbnNfbXJwY2kobXNnLT5sY2hhbiwgY2xhc3NtYXJrMl9sdik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPnN1YnNjcikgeworCQltc2ctPmxjaGFuLT5zdWJzY3IgPSBzdWJzY3I7CisJfSBlbHNlIGlmIChtc2ctPmxjaGFuLT5zdWJzY3IgIT0gc3Vic2NyKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiPC0gQ2hhbm5lbCBhbHJlYWR5IG93bmVkIGJ5IHNvbWVvbmUgZWxzZT9cbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChEUlIsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgdXNcbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXN1YnNjciA9IG1zZy0+bGNoYW4tPnN1YnNjcjsKKwl9CisKKwlzaWdfZGF0YS5zdWJzY3IgPSBzdWJzY3I7CisJc2lnX2RhdGEuYnRzCT0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXNpZ19kYXRhLmxjaGFuCT0gbXNnLT5sY2hhbjsKKworCWJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCsrOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1BBR0lORywgU19QQUdJTkdfU1VDQ0VFREVELCAmc2lnX2RhdGEpOworCisJLyogU3RvcCBwYWdpbmcgb24gdGhlIGJ0cyB3ZSByZWNlaXZlZCB0aGUgcGFnaW5nIHJlc3BvbnNlICovCisJcGFnaW5nX3JlcXVlc3Rfc3RvcChtc2ctPnRyeC0+YnRzLCBzdWJzY3IsIG1zZy0+bGNoYW4pOworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMS45OiBDaXBoZXJpbmcgTW9kZSBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCB3YW50X2ltZWlzdikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXVfaW50OF90IGNpcGhfbW9kX3NldDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCURFQlVHUChEUlIsICJUWCBDSVBIRVJJTkcgTU9ERSBDTURcbiIpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA8PSBSU0xfRU5DX0FMR19BNSgwKSkKKwkJY2lwaF9tb2Rfc2V0ID0gMDsKKwllbHNlCisJCWNpcGhfbW9kX3NldCA9IChsY2hhbi0+ZW5jci5hbGdfaWQtMik8PDEgfCAxOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQ0lQSF9NX0NNRDsKKwlnaC0+ZGF0YVswXSA9ICh3YW50X2ltZWlzdiAmIDB4MSkgPDwgNCB8IChjaXBoX21vZF9zZXQgJiAweGYpOworCisJcmV0dXJuIHJzbF9lbmNyeXB0aW9uX2NtZChtc2cpOworfQorCitzdGF0aWMgdm9pZCBnc200OF9jZWxsX2Rlc2Moc3RydWN0IGdzbTQ4X2NlbGxfZGVzYyAqY2QsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwljZC0+bmNjID0gKGJ0cy0+YnNpYyA+PiAzICYgMHg3KTsKKwljZC0+YmNjID0gKGJ0cy0+YnNpYyAmIDB4Nyk7CisJY2QtPmFyZmNuX2hpID0gYnRzLT5jMC0+YXJmY24gPj4gODsKKwljZC0+YXJmY25fbG8gPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NoYW5fZGVzYyhzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjICpjZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwl1X2ludDE2X3QgYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY24gJiAweDNmZjsKKworCWNkLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJY2QtPmgwLnRzYyA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYzsKKwljZC0+aDAuaCA9IDA7CisJY2QtPmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWNkLT5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE1OiBIYW5kb3ZlciBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ob19jbWQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4sCisJCSAgICAgIHVfaW50OF90IHBvd2VyX2NvbW1hbmQsIHVfaW50OF90IGhvX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2hvX2NtZCAqaG8gPQorCQkoc3RydWN0IGdzbTQ4X2hvX2NtZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqaG8pKTsKKworCW1zZy0+bGNoYW4gPSBvbGRfbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSEFORE9fQ01EOworCisJLyogbWFuZGF0b3J5IGJpdHMgKi8KKwlnc200OF9jZWxsX2Rlc2MoJmhvLT5jZWxsX2Rlc2MsIG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzKTsKKwlnc200OF9jaGFuX2Rlc2MoJmhvLT5jaGFuX2Rlc2MsIG5ld19sY2hhbik7CisJaG8tPmhvX3JlZiA9IGhvX3JlZjsKKwloby0+cG93ZXJfY29tbWFuZCA9IHBvd2VyX2NvbW1hbmQ7CisKKwkvKiBGSVhNRTogb3B0aW9uYWwgYml0cyBmb3IgdHlwZSBvZiBzeW5jaHJvbml6YXRpb24/ICovCisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBDaGFwdGVyIDkuMS4yOiBBc3NpZ25tZW50IENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX3JyX2Fzc19jbWQoc3RydWN0IGdzbV9sY2hhbiAqZGVzdF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHBvd2VyX2NvbW1hbmQpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9hc3NfY21kICphc3MgPQorCQkoc3RydWN0IGdzbTQ4X2Fzc19jbWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFzcykpOworCisJREVCVUdQKERSUiwgIi0+IEFTU0lHTk1FTlQgQ09NTUFORCB0Y2hfbW9kZT0weCUwMnhcbiIsIGxjaGFuLT50Y2hfbW9kZSk7CisKKwltc2ctPmxjaGFuID0gZGVzdF9sY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9BU1NfQ01EOworCisJLyoKKwkgKiBmaWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQsIHRoaXMgY29kZQorCSAqIHNob3VsZCBwcm9iYWJseSBiZSBzaGFyZWQgd2l0aCByc2xfcnhfY2hhbl9ycWQoKSwKKwkgKiBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5LiBCdXQgYmV3YXJlIHRoYXQgMTAuNS4yLjUKKwkgKiAxMC41LjIuNS5hIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljIGZvcgorCSAqIHRoZSBjaGFuX2Rlc2MuIEJ1dCBhcyBsb25nIGFzIG11bHRpLXNsb3QgY29uZmlndXJhdGlvbnMKKwkgKiBhcmUgbm90IHVzZWQgd2Ugc2VlbSB0byBiZSBmaW5lLgorCSAqLworCWdzbTQ4X2NoYW5fZGVzYygmYXNzLT5jaGFuX2Rlc2MsIGxjaGFuKTsKKwlhc3MtPnBvd2VyX2NvbW1hbmQgPSBwb3dlcl9jb21tYW5kOworCisJbXNnYl90dl9wdXQobXNnLCBHU000OF9JRV9DSEFOTU9ERV8xLCBsY2hhbi0+dGNoX21vZGUpOworCisJLyogaW4gY2FzZSBvZiBtdWx0aSByYXRlIHdlIG5lZWQgdG8gYXR0YWNoIGEgY29uZmlnICovCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCWlmIChsY2hhbi0+bXJfY29uZi52ZXIgPT0gMCkgeworCQkJTE9HUChEUlIsIExPR0xfRVJST1IsICJCVUc6IFVzaW5nIG11bHRpcmF0ZSBjb2RlYyAiCisJCQkJIndpdGhvdXQgbXVsdGlyYXRlIGNvbmZpZy5cbiIpOworCQl9IGVsc2UgeworCQkJdV9pbnQ4X3QgKmRhdGEgPSBtc2diX3B1dChtc2csIDQpOworCQkJZGF0YVswXSA9IEdTTTQ4X0lFX01VTF9SQVRFX0NGRzsKKwkJCWRhdGFbMV0gPSAweDI7CisJCQltZW1jcHkoJmRhdGFbMl0sICZsY2hhbi0+bXJfY29uZiwgMik7CisJCX0KKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiA5LjEuNSBDaGFubmVsIG1vZGUgbW9kaWZ5OiBNb2RpZnkgdGhlIG1vZGUgb24gdGhlIE1TIHNpZGUgKi8KK2ludCBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBtb2RlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqY21tID0KKwkJKHN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjbW0pKTsKKwl1X2ludDE2X3QgYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY24gJiAweDNmZjsKKworCURFQlVHUChEUlIsICItPiBDSEFOTkVMIE1PREUgTU9ESUZZIG1vZGU9MHglMDJ4XG4iLCBtb2RlKTsKKworCWxjaGFuLT50Y2hfbW9kZSA9IG1vZGU7CisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRjsKKworCS8qIGZpbGwgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCwgdGhpcyBjb2RlCisJICogc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIHJzbF9yeF9jaGFuX3JxZCgpICovCisJY21tLT5jaGFuX2Rlc2MuY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWNtbS0+Y2hhbl9kZXNjLmgwLnRzYyA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYzsKKwljbW0tPmNoYW5fZGVzYy5oMC5oID0gMDsKKwljbW0tPmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwljbW0tPmNoYW5fZGVzYy5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7CisJY21tLT5tb2RlID0gbW9kZTsKKworCS8qIGluIGNhc2Ugb2YgbXVsdGkgcmF0ZSB3ZSBuZWVkIHRvIGF0dGFjaCBhIGNvbmZpZyAqLworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikgeworCQlpZiAobGNoYW4tPm1yX2NvbmYudmVyID09IDApIHsKKwkJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQlVHOiBVc2luZyBtdWx0aXJhdGUgY29kZWMgIgorCQkJCSJ3aXRob3V0IG11bHRpcmF0ZSBjb25maWcuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXVfaW50OF90ICpkYXRhID0gbXNnYl9wdXQobXNnLCA0KTsKKwkJCWRhdGFbMF0gPSBHU000OF9JRV9NVUxfUkFURV9DRkc7CisJCQlkYXRhWzFdID0gMHgyOworCQkJbWVtY3B5KCZkYXRhWzJdLCAmbGNoYW4tPm1yX2NvbmYsIDIpOworCQl9CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworaW50IGdzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGNoYW5fbW9kZSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkobGNoYW4sIGxjaGFuX21vZGUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3J4X3JyX21vZGlmX2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqbW9kID0KKwkJCQkoc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKikgZ2gtPmRhdGE7CisKKwlERUJVR1AoRFJSLCAiQ0hBTk5FTCBNT0RFIE1PRElGWSBBQ0tcbiIpOworCisJaWYgKG1vZC0+bW9kZSAhPSBtc2ctPmxjaGFuLT50Y2hfbW9kZSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNIQU5ORUwgTU9ERSBjaGFuZ2UgZmFpbGVkLiBXYW50ZWQ6ICVkIEdvdDogJWRcbiIsCisJCQltc2ctPmxjaGFuLT50Y2hfbW9kZSwgbW9kLT5tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHVwZGF0ZSB0aGUgY2hhbm5lbCB0eXBlICovCisJc3dpdGNoIChtb2QtPm1vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NJR046CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU1BFRUNIOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTRrNToKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfNmswOgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV8zazY6CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9EQVRBOworCQlicmVhazsKKwl9CisKKwkvKiBXZSd2ZSBzdWNjZXNzZnVsbHkgbW9kaWZpZWQgdGhlIE1TIHNpZGUgb2YgdGhlIGNoYW5uZWwsCisJICogbm93IGdvIG9uIHRvIG1vZGlmeSB0aGUgQlRTIHNpZGUgb2YgdGhlIGNoYW5uZWwgKi8KKwlyYyA9IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShtc2ctPmxjaGFuKTsKKworCS8qIEZJWE1FOiB3ZSBub3Qgb25seSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgbW9kZSBtb2RpZnksIGJ1dAorCSAqIGFsc28gYWZ0ZXIgY2hhbm5lbCBhY3RpdmF0aW9uICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMpICYmIG1vZC0+bW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlyc2xfaXBhY2NfY3JjeChtc2ctPmxjaGFuKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9wYXJzZV9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJdV9pbnQ4X3QgKmRhdGEgPSBnaC0+ZGF0YTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBiaXR2ZWMgKm5idiA9ICZidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0OworCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjOworCisJaWYgKGdoLT5tc2dfdHlwZSAhPSBHU000OF9NVF9SUl9NRUFTX1JFUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YVswXSAmIDB4ODApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9CQTE7CisJaWYgKGRhdGFbMF0gJiAweDQwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfVUxfRFRYOworCWlmICgoZGF0YVsxXSAmIDB4NDApID09IDB4MDApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9ETF9WQUxJRDsKKworCXJlcC0+ZGwuZnVsbC5yeF9sZXYgPSBkYXRhWzBdICYgMHgzZjsKKwlyZXAtPmRsLnN1Yi5yeF9sZXYgPSBkYXRhWzFdICYgMHgzZjsKKwlyZXAtPmRsLmZ1bGwucnhfcXVhbCA9IChkYXRhWzNdID4+IDQpICYgMHg3OworCXJlcC0+ZGwuc3ViLnJ4X3F1YWwgPSAoZGF0YVszXSA+PiAxKSAmIDB4NzsKKworCXJlcC0+bnVtX2NlbGwgPSAoKGRhdGFbM10gPj4gNikgJiAweDMpIHwgKChkYXRhWzJdICYgMHgwMSkgPDwgMik7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAxIHx8IHJlcC0+bnVtX2NlbGwgPiA2KQorCQlyZXR1cm4gMDsKKworCS8qIGFuIGVuY29kaW5nIG5pZ2h0bWFyZSBpbiBwZXJmZWN0aW9uICovCisJbXJjID0gJnJlcC0+Y2VsbFswXTsKKwltcmMtPnJ4bGV2ID0gZGF0YVszXSAmIDB4M2Y7CisJbXJjLT5uZWlnaF9pZHggPSBkYXRhWzRdID4+IDM7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs0XSAmIDB4MDcpIDw8IDMpIHwgKGRhdGFbNV0gPj4gNSk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAyKQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbMV07CisJbXJjLT5yeGxldiA9ICgoZGF0YVs1XSAmIDB4MWYpIDw8IDEpIHwgKGRhdGFbNl0gPj4gNyk7CisJbXJjLT5uZWlnaF9pZHggPSAoZGF0YVs2XSA+PiAyKSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs2XSAmIDB4MDMpIDw8IDQpIHwgKGRhdGFbN10gPj4gNCk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCAzKQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbMl07CisJbXJjLT5yeGxldiA9ICgoZGF0YVs3XSAmIDB4MGYpIDw8IDIpIHwgKGRhdGFbOF0gPj4gNik7CisJbXJjLT5uZWlnaF9pZHggPSAoZGF0YVs4XSA+PiAxKSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9ICgoZGF0YVs4XSAmIDB4MDEpIDw8IDUpIHwgKGRhdGFbOV0gPj4gMyk7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA0KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbM107CisJbXJjLT5yeGxldiA9ICgoZGF0YVs5XSAmIDB4MDcpIDw8IDMpIHwgKGRhdGFbMTBdID4+IDUpOworCW1yYy0+bmVpZ2hfaWR4ID0gZGF0YVsxMF0gJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSBkYXRhWzExXSA+PiAyOworCWlmIChyZXAtPm51bV9jZWxsIDwgNSkKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzRdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbMTFdICYgMHgwMykgPDwgNCkgfCAoZGF0YVsxMl0gPj4gNCk7CisJbXJjLT5uZWlnaF9pZHggPSAoKGRhdGFbMTJdICYgMHhmKSA8PCAxKSB8IChkYXRhWzEzXSA+PiA3KTsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKGRhdGFbMTNdID4+IDEpICYgMHgzZjsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDYpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFs1XTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzEzXSAmIDB4MDEpIDw8IDUpIHwgKGRhdGFbMTRdID4+IDMpOworCW1yYy0+bmVpZ2hfaWR4ID0gKChkYXRhWzE0XSAmIDB4MDcpIDw8IDIpIHwgKGRhdGFbMTVdID4+IDYpOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSBkYXRhWzE1XSAmIDB4M2Y7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFjMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMKQEAgLTAsMCArMSwxMjQxIEBACisvKiBQb2ludC10by1Qb2ludCAoUFApIFNob3J0IE1lc3NhZ2UgU2VydmljZSAoU01TKQorICogU3VwcG9ydCBvbiBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjExIHZlcnNpb24gNy4xLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQyIFY3LjEuMCAqLworCisvKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKKyNkZWZpbmUgR1NNNDExX0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000MTFfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgVU1fU0FQSV9TTVMgMwkvKiBTZWUgR1NNIDA0LjA1LzA0LjA2ICovCisKK3ZvaWQgKnRhbGxfZ3Ntc19jdHg7CitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHg0MDAwMDAwMTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgY3BfY2F1c2Vfc3Ryc1tdID0geworCXsgR1NNNDExX0NQX0NBVVNFX05FVF9GQUlMLAkiTmV0d29yayBGYWlsdXJlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0NPTkdFU1RJT04sCSJDb25nZXN0aW9uIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lOVl9UUkFOU19JRCwJIkludmFsaWQgVHJhbnNhY3Rpb24gSUQiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfU0VNQU5UX0lOQ19NU0csICJTZW1hbnRpY2FsbHkgSW5jb3JyZWN0IE1lc3NhZ2UiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX01BTkRfSU5GLAkiSW52YWxpZCBNYW5kYXRvcnkgSW5mb3JtYXRpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCwgIk1lc3NhZ2UgVHlwZSBkb2Vzbid0IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsIAorCQkJCSJNZXNzYWdlIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lFX05PVEVYSVNULAkiSUUgZG9lcyBub3QgZXhpc3QiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfUFJPVE9DT0xfRVJSLAkiUHJvdG9jb2wgRXJyb3IiIH0sCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHJwX2NhdXNlX3N0cnNbXSA9IHsKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19OVU1fVU5BU1NJR05FRCwgIihNTykgTnVtYmVyIG5vdCBhc3NpZ25lZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19PUF9ERVRfQkFSUiwgIihNTykgT3BlcmF0b3IgZGV0ZXJtaW5lZCBiYXJyaW5nIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0NBTExfQkFSUkVELCAiKE1PKSBDYWxsIGJhcnJlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19TTVNfUkVKRUNURUQsICIoTU8pIFNNUyByZWplY3RlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19ERVNUX09VVF9PRl9PUkRFUiwgIihNTykgRGVzdGluYXRpb24gb3V0IG9mIG9yZGVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1VOSURFTlRJRklFRF9TVUJTQ1IsICIoTU8pIFVuaWRlbnRpZmllZCBzdWJzY3JpYmVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0ZBQ0lMSVRZX1JFSiwgIihNTykgRmFjaWxpdHkgcmVqZWN0IiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1VOS05PV05fU1VCU0NSLCAiKE1PKSBVbmtub3duIHN1YnNjcmliZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUiwgIihNTykgTmV0d29yayBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVEVNUF9GQUlMLCAiKE1PKSBUZW1wb3JhcnkgZmFpbHVyZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19DT05HRVNUSU9OLCAiKE1PKSBDb25nZXN0aW9uIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFU19VTkFWQUlMLCAiKE1PKSBSZXNvdXJjZSB1bmF2YWlsYWJsZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVFNVQlNDUiwgIihNTykgUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBzdWJzY3JpYmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFUV9GQUNfTk9USU1QTCwgIihNTykgUmVxdWVzdGVkIGZhY2lsaXR5IG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19JTlRFUldPUktJTkcsICIoTU8pIEludGVyd29ya2luZyIgfSwKKwkvKiB2YWxpZCBvbmx5IGZvciBNVCAqLworCXsgR1NNNDExX1JQX0NBVVNFX01UX01FTV9FWENFRURFRCwgIihNVCkgTWVtb3J5IEV4Y2VlZGVkIiB9LAorCS8qIHZhbGlkIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KKwl7IEdTTTQxMV9SUF9DQVVTRV9JTlZfVFJBTlNfUkVGLCAiSW52YWxpZCBUcmFuc2FjdGlvbiBSZWZlcmVuY2UiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfU0VNQU5UX0lOQ19NU0csICJTZW1hbnRpY2FsbHkgSW5jb3JyZWN0IE1lc3NhZ2UiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GLCAiSW52YWxpZCBNYW5kYXRvcnkgSW5mb3JtYXRpb24iIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCwgIk1lc3NhZ2UgVHlwZSBub24tZXhpc3RhbnQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwgIk1lc3NhZ2UgaW5jb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1QsICJJbmZvcm1hdGlvbiBFbGVtZW50IG5vdCBleGlzdGluZyIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIsICJQcm90b2NvbCBFcnJvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RydWN0IGdzbV9zbXMgKnNtc19hbGxvYyh2b2lkKQoreworCXJldHVybiB0YWxsb2NfemVybyh0YWxsX2dzbXNfY3R4LCBzdHJ1Y3QgZ3NtX3Ntcyk7Cit9CisKK3ZvaWQgc21zX2ZyZWUoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwkvKiBkcm9wIHJlZmVyZW5jZXMgdG8gc3Vic2NyaWJlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoc21zLT5zZW5kZXIpCisJCXN1YnNjcl9wdXQoc21zLT5zZW5kZXIpOworCWlmIChzbXMtPnJlY2VpdmVyKQorCQlzdWJzY3JfcHV0KHNtcy0+cmVjZWl2ZXIpOworCisJdGFsbG9jX2ZyZWUoc21zKTsKK30KKworc3RydWN0IG1zZ2IgKmdzbTQxMV9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oR1NNNDExX0FMTE9DX1NJWkUsIEdTTTQxMV9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjExIik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlpZiAobXNnLT5sY2hhbikKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJbXNnLT5sM2ggPSBtc2ctPmRhdGE7CisKKwlERUJVR1AoRFNNUywgIkdTTTQuMTEgVFggJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCBsaW5rX2lkKTsKK30KKworLyogU01DIFRDMSogaXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgY3BfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gZGF0YTsKKworCURFQlVHUChEU01TLCAiU01DIFRpbWVyIFRDMSogaXMgZXhwaXJlZCwgY2FsbGluZyB0cmFuc19mcmVlKClcbiIpOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIHJlLXRyYW5zbWl0IHRoZSBsYXN0IENQLURBVEEgMS4uMyB0aW1lcyAqLworCXRyYW5zX2ZyZWUodHJhbnMpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSAwNC4wOC8wNC4xMSBDUCBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX2NwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJLyogT3V0Z29pbmcgbmVlZHMgdGhlIGhpZ2hlc3QgYml0IHNldCAqLworCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQ8PDQpOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJLyogYXNzaWduIHRoZSBvdXRnb2luZyBsY2hhbiAqLworCW1zZy0+bGNoYW4gPSB0cmFucy0+bGNoYW47CisKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgKi8KKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDExX01UX0NQX0RBVEE6CisJCS8qIDUuMi4zLjEuMjogZW50ZXIgTU8td2FpdCBmb3IgQ1AtYWNrICovCisJCS8qIDUuMi4zLjIuMzogZW50ZXIgTVQtd2FpdCBmb3IgQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX1dBSVRfQ1BfQUNLOworCQl0cmFucy0+c21zLmNwX3RpbWVyLmRhdGEgPSB0cmFuczsKKwkJdHJhbnMtPnNtcy5jcF90aW1lci5jYiA9IGNwX3RpbWVyX2V4cGlyZWQ7CisJCS8qIDUuMy4yLjE6IFNldCBUaW1lciBUQzFBICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lciwgR1NNNDExX1RNUl9UQzFBKTsKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtREFUQSAiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfQUNLOgorCQlERUJVR1AoRFNNUywgIlRYOiBDUC1BQ0sgIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0VSUk9SOgorCQlERUJVR1AoRFNNUywgIlRYOiBDUC1FUlJPUiAiKTsKKwkJYnJlYWs7CisJfQorCisJREVCVUdQQyhEU01TLCAidHJhbnM9JXhcbiIsIHRyYW5zLT50cmFuc2FjdGlvbl9pZCk7CisKKwlyZXR1cm4gZ3NtNDExX3NlbmRtc2cobXNnLCB0cmFucy0+c21zLmxpbmtfaWQpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSBSUC1EQVRBIGhlYWRlciBhbmQgc2VuZCBhcyBDUC1EQVRBICovCitzdGF0aWMgaW50IGdzbTQxMV9ycF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICB1X2ludDhfdCBycF9tc2dfdHlwZSwgdV9pbnQ4X3QgcnBfbXNnX3JlZikKK3sKKwlzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnA7CisJdV9pbnQ4X3QgbGVuID0gbXNnLT5sZW47CisKKwkvKiBHU00gMDQuMTEgUlAtREFUQSBoZWFkZXIgKi8KKwlycCA9IChzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqKW1zZ2JfcHVzaChtc2csIHNpemVvZigqcnApKTsKKwlycC0+bGVuID0gbGVuICsgMjsKKwlycC0+bXNnX3R5cGUgPSBycF9tc2dfdHlwZTsKKwlycC0+bXNnX3JlZiA9IHJwX21zZ19yZWY7IC8qIEZJWE1FOiBDaG9vc2UgcmFuZG9tbHkgKi8KKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfREFUQSk7Cit9CisKKy8qIFR1cm4gaW50IGludG8gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbjogOTggPT4gMHg4OSAqLworc3RhdGljIHVfaW50OF90IGJjZGlmeSh1X2ludDhfdCB2YWx1ZSkKK3sKKwl1X2ludDhfdCByZXQ7CisKKwlyZXQgPSB2YWx1ZSAvIDEwOworCXJldCB8PSAodmFsdWUgJSAxMCkgPDwgNDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFR1cm4gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbiBpbnRvIGludDogMHg4OSA9PiA5OCAqLworc3RhdGljIHVfaW50OF90IHVuYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCWlmICgodmFsdWUgJiAweDBGKSA+IDkgfHwgKHZhbHVlID4+IDQpID4gOSkKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAKKwkJICAgICAidW5iY2RpZnkgZ290IHRvbyBiaWcgbmliYmxlOiAweCUwMlhcbiIsIHZhbHVlKTsKKworCXJldCA9ICh2YWx1ZSYweDBGKSoxMDsKKwlyZXQgKz0gdmFsdWU+PjQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZW5lcmF0ZSAwMy40MCBUUC1TQ1RTICovCitzdGF0aWMgdm9pZCBnc20zNDBfZ2VuX3NjdHModV9pbnQ4X3QgKnNjdHMsIHRpbWVfdCB0aW1lKQoreworCXN0cnVjdCB0bSAqdG0gPSBsb2NhbHRpbWUoJnRpbWUpOworCisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1feWVhciAlIDEwMCk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbW9uICsgMSk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbWRheSk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1faG91cik7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fbWluKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9zZWMpOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX2dtdG9mZi8oNjAqMTUpKTsKK30KKworLyogRGVjb2RlIDAzLjQwIFRQLVNDVFMgKGludG8gdXRjL2dtdCB0aW1lc3RhbXApICovCitzdGF0aWMgdGltZV90IGdzbTM0MF9zY3RzKHVfaW50OF90ICpzY3RzKQoreworCXN0cnVjdCB0bSB0bTsKKworCXVfaW50OF90IHlyID0gdW5iY2RpZnkoKnNjdHMrKyk7CisKKwlpZiAoeXIgPD0gODApCisJCXRtLnRtX3llYXIgPSAxMDAgKyB5cjsKKwllbHNlCisJCXRtLnRtX3llYXIgPSB5cjsKKwl0bS50bV9tb24gID0gdW5iY2RpZnkoKnNjdHMrKykgLSAxOworCXRtLnRtX21kYXkgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9ob3VyID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1fbWluICA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX3NlYyAgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwkvKiBhY2NvcmRpbmcgdG8gZ3NtIDAzLjQwIHRpbWUgem9uZSBpcworCSAgICJleHByZXNzZWQgaW4gcXVhcnRlcnMgb2YgYW4gaG91ciIgKi8KKwl0bS50bV9nbXRvZmYgPSB1bmJjZGlmeSgqc2N0cysrKSAqIDE1KjYwOworCisJcmV0dXJuIG1rdGltZSgmdG0pOworfQorCisvKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsaWRpdHkgcGVyaW9kIGluIG1pbnV0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9kZWZhdWx0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCS8qIERlZmF1bHQgdmFsaWRpdHk6IHR3byBkYXlzICovCisJbWludXRlcyA9IDI0ICogNjAgKiAyOworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAncmVsYXRpdmUnICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmUodV9pbnQ4X3QgKnNtc192cCkKK3sKKwkvKiBDaGFwdGVyIDkuMi4zLjEyLjEgKi8KKwl1X2ludDhfdCB2cDsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisKKwl2cCA9ICooc21zX3ZwKTsKKwlpZiAodnAgPD0gMTQzKQorCQltaW51dGVzID0gdnAgKyAxICogNTsKKwllbHNlIGlmICh2cCA8PSAxNjcpCisJCW1pbnV0ZXMgPSAxMio2MCArICh2cC0xNDMpICogMzA7CisJZWxzZSBpZiAodnAgPD0gMTk2KQorCQltaW51dGVzID0gdnAtMTY2ICogNjAgKiAyNDsKKwllbHNlCisJCW1pbnV0ZXMgPSB2cC0xOTIgKiA2MCAqIDI0ICogNzsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ2Fic29sdXRlJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX2Fic29sdXRlKHVfaW50OF90ICpzbXNfdnApCit7CisJLyogQ2hhcHRlciA5LjIuMy4xMi4yICovCisJdGltZV90IGV4cGlyZXMsIG5vdzsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisKKwlleHBpcmVzID0gZ3NtMzQwX3NjdHMoc21zX3ZwKTsKKwlub3cgPSBta3RpbWUoZ210aW1lKE5VTEwpKTsKKwlpZiAoZXhwaXJlcyA8PSBub3cpCisJCW1pbnV0ZXMgPSAwOworCWVsc2UKKwkJbWludXRlcyA9IChleHBpcmVzLW5vdykvNjA7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZSBpbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX3JlbGF0aXZlX2ludGVnZXIodV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1X2ludDhfdCB2cDsKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJdnAgPSAqKHNtc192cCk7CisJaWYgKHZwID09IDApIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkgICAgICJyZXNlcnZlZCByZWxhdGl2ZV9pbnRlZ2VyIHZhbGlkaXR5IHBlcmlvZFxuIik7CisJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCX0KKwltaW51dGVzID0gdnAvNjA7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZSBpbiBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX3JlbGF0aXZlX3NlbWlvY3RldCh1X2ludDhfdCAqc21zX3ZwKQoreworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwltaW51dGVzID0gdW5iY2RpZnkoKnNtc192cCsrKSo2MDsgIC8qIGhvdXJzICovCisJbWludXRlcyArPSB1bmJjZGlmeSgqc21zX3ZwKyspOyAgICAvKiBtaW51dGVzICovCisJbWludXRlcyArPSB1bmJjZGlmeSgqc21zX3ZwKyspLzYwOyAvKiBzZWNvbmRzICovCisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIGRlY29kZSB2YWxpZGl0eSBwZXJpb2QuIHJldHVybiBtaW51dGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdmFsaWRpdHlfcGVyaW9kKHVfaW50OF90IHNtc192cGYsIHVfaW50OF90ICpzbXNfdnApCit7CisJdV9pbnQ4X3QgZmk7IC8qIGZ1bmN0aW9uYWxpdHkgaW5kaWNhdG9yICovCisKKwlzd2l0Y2ggKHNtc192cGYpIHsKKwljYXNlIEdTTTM0MF9UUF9WUEZfUkVMQVRJVkU6CisJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmUoc21zX3ZwKTsKKwljYXNlIEdTTTM0MF9UUF9WUEZfQUJTT0xVVEU6CisJCXJldHVybiBnc20zNDBfdnBfYWJzb2x1dGUoc21zX3ZwKTsKKwljYXNlIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQ6CisJCS8qIENoYXB0ZXIgOS4yLjMuMTIuMyAqLworCQlmaSA9ICpzbXNfdnArKzsKKwkJLyogaWdub3JlIGFkZGl0aW9uYWwgZmkgKi8KKwkJaWYgKGZpICYgKDE8PDcpKSBzbXNfdnArKzsKKwkJLyogcmVhZCB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICovCisJCXN3aXRjaCAoZmkgJiAwYjExMSkgeworCQljYXNlIDBiMDAwOgorCQkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7IC8qIG5vIHZwZiBzcGVjaWZpZWQgKi8KKwkJY2FzZSAwYjAwMToKKwkJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmUoc21zX3ZwKTsKKwkJY2FzZSAwYjAxMDoKKwkJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmVfaW50ZWdlcihzbXNfdnApOworCQljYXNlIDBiMDExOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZV9zZW1pb2N0ZXQoc21zX3ZwKTsKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZSBHU00gc3BlYyBzYXlzIHRoYXQgdGhlIFNDIHNob3VsZCByZWplY3QgYW55CisJCQkgICB1bnN1cHBvcnRlZCBhbmQvb3IgdW5kZWZpbmVkIHZhbHVlcy4gRklYTUUgKi8KKwkJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwKKwkJCSAgICAgIlJlc2VydmVkIGVuaGFuY2VkIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXRcbiIpOworCQkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJCX0KKwljYXNlIEdTTTM0MF9UUF9WUEZfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwl9Cit9CisKKy8qIGRldGVybWluZSBjb2RpbmcgYWxwaGFiZXQgZGVwZW5kZW50IG9uIEdTTSAwMy4zOCBTZWN0aW9uIDQgRENTICovCitlbnVtIHNtc19hbHBoYWJldCBnc20zMzhfZ2V0X3Ntc19hbHBoYWJldCh1X2ludDhfdCBkY3MpCit7CisJdV9pbnQ4X3QgY2diaXRzID0gZGNzID4+IDQ7CisJZW51bSBzbXNfYWxwaGFiZXQgYWxwaGEgPSBEQ1NfTk9ORTsKKworCWlmICgoY2diaXRzICYgMHhjKSA9PSAwKSB7CisJCWlmIChjZ2JpdHMgJiAyKQorCQkJTE9HUChEU01TLCBMT0dMX05PVElDRSwKKwkJCSAgICAgIkNvbXByZXNzZWQgU01TIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKworCQlzd2l0Y2ggKChkY3MgPj4gMikmMHgwMykgeworCQljYXNlIDA6CisJCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYWxwaGEgPSBEQ1NfOEJJVF9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFscGhhID0gRENTX1VDUzI7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoY2diaXRzID09IDB4YyB8fCBjZ2JpdHMgPT0gMHhkKQorCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJZWxzZSBpZiAoY2diaXRzID09IDB4ZSkKKwkJYWxwaGEgPSBEQ1NfVUNTMjsKKwllbHNlIGlmIChjZ2JpdHMgPT0gMHhmKSB7CisJCWlmIChkY3MgJiA0KQorCQkJYWxwaGEgPSBEQ1NfOEJJVF9EQVRBOworCQllbHNlCisJCQlhbHBoYSA9IERDU183QklUX0RFRkFVTFQ7CisJfQorCisJcmV0dXJuIGFscGhhOworfQorCitzdGF0aWMgaW50IGdzbTM0MF9yeF9zbXNfc3VibWl0KHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc21zICpnc21zKQoreworCWlmIChkYl9zbXNfc3RvcmUoZ3NtcykgIT0gMCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gc3RvcmUgU01TIGluIERhdGFiYXNlXG4iKTsKKwkJcmV0dXJuIEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSOworCX0KKwkvKiBkaXNwYXRjaCBhIHNpZ25hbCB0byB0ZWxsIGhpZ2hlciBsZXZlbCBhYm91dCBpdCAqLworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX1NVQk1JVFRFRCwgZ3Ntcyk7CisJLyogdHJ5IGRlbGl2ZXJpbmcgdGhlIFNNUyByaWdodCBub3cgKi8KKwkvL2dzbTQxMV9zZW5kX3Ntc19zdWJzY3IoZ3Ntcy0+cmVjZWl2ZXIsIGdzbXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdlbmVyYXRlIGEgVFBEVSBhZGRyZXNzIGZpZWxkIGNvbXBsaWFudCB3aXRoIDAzLjQwIHNlYy4gOS4xLjIuNSAqLworc3RhdGljIGludCBnc20zNDBfZ2VuX29hKHVfaW50OF90ICpvYSwgdW5zaWduZWQgaW50IG9hX2xlbiwKKwkJCSBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgbGVuX2luX2J5dGVzOworCisJb2FbMV0gPSAweGI5OyAvKiBuZXR3b3Jrcy1zcGVjaWZpYyBudW1iZXIsIHByaXZhdGUgbnVtYmVyaW5nIHBsYW4gKi8KKworCWxlbl9pbl9ieXRlcyA9IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKG9hLCBvYV9sZW4sIDEsIHN1YnNjci0+ZXh0ZW5zaW9uKTsKKworCS8qIEdTTSAwMy40MCB0ZWxscyB1cyB0aGUgbGVuZ3RoIGlzIGluICd1c2VmdWwgc2VtaS1vY3RldHMnICovCisJb2FbMF0gPSBzdHJsZW4oc3Vic2NyLT5leHRlbnNpb24pICYgMHhmZjsKKworCXJldHVybiBsZW5faW5fYnl0ZXM7Cit9CisKKy8qIGdlbmVyYXRlIGEgbXNnYiBjb250YWluaW5nIGEgVFBEVSBkZXJpdmVkIGZyb20gc3RydWN0IGdzbV9zbXMsCisgKiByZXR1cm5zIHRvdGFsIHNpemUgb2YgVFBEVSAqLworc3RhdGljIGludCBnc20zNDBfZ2VuX3RwZHUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwl1X2ludDhfdCAqc21zcDsKKwl1X2ludDhfdCBvYVsxMl07CS8qIG1heCBsZW4gcGVyIDAzLjQwICovCisJdV9pbnQ4X3Qgb2FfbGVuID0gMDsKKwl1X2ludDhfdCBvY3RldF9sZW47CisJdW5zaWduZWQgaW50IG9sZF9tc2dfbGVuID0gbXNnLT5sZW47CisKKwkvKiBnZW5lcmF0ZSBmaXJzdCBvY3RldCB3aXRoIG1hc2tlZCBiaXRzICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJLyogVFAtTVRJIChtZXNzYWdlIHR5cGUgaW5kaWNhdG9yKSAqLworCSpzbXNwID0gR1NNMzQwX1NNU19ERUxJVkVSX1NDMk1TOworCS8qIFRQLU1NUyAobW9yZSBtZXNzYWdlcyB0byBzZW5kKSAqLworCWlmICgwIC8qIEZJWE1FICovKQorCQkqc21zcCB8PSAweDA0OworCS8qIFRQLVNSSShkZWxpdmVyKS9TUlIoc3VibWl0KSAqLworCWlmIChzbXMtPnN0YXR1c19yZXBfcmVxKQorCQkqc21zcCB8PSAweDIwOworCS8qIFRQLVVESEkgKGluZGljYXRpbmcgVFAtVUQgY29udGFpbnMgYSBoZWFkZXIpICovCisJaWYgKHNtcy0+dWRfaGRyX2luZCkKKwkJKnNtc3AgfD0gMHg0MDsKKyNpZiAwCisJLyogVFAtUlAgKGluZGljYXRpbmcgdGhhdCBhIHJlcGx5IHBhdGggZXhpc3RzKSAqLworCWlmIChzbXMtPgorCQkqc21zcCB8PSAweDgwOworI2VuZGlmCisJCisJLyogZ2VuZXJhdGUgb3JpZ2luYXRvciBhZGRyZXNzICovCisJb2FfbGVuID0gZ3NtMzQwX2dlbl9vYShvYSwgc2l6ZW9mKG9hKSwgc21zLT5zZW5kZXIpOworCXNtc3AgPSBtc2diX3B1dChtc2csIG9hX2xlbik7CisJbWVtY3B5KHNtc3AsIG9hLCBvYV9sZW4pOworCisJLyogZ2VuZXJhdGUgVFAtUElEICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKnNtc3AgPSBzbXMtPnByb3RvY29sX2lkOworCisJLyogZ2VuZXJhdGUgVFAtRENTICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKnNtc3AgPSBzbXMtPmRhdGFfY29kaW5nX3NjaGVtZTsKKworCS8qIGdlbmVyYXRlIFRQLVNDVFMgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCA3KTsKKwlnc20zNDBfZ2VuX3NjdHMoc21zcCwgdGltZShOVUxMKSk7CisKKwkvKiBnZW5lcmF0ZSBUUC1VREwgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+dXNlcl9kYXRhX2xlbjsKKworCS8qIGdlbmVyYXRlIFRQLVVEICovCisJc3dpdGNoIChnc20zMzhfZ2V0X3Ntc19hbHBoYWJldChzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSkpIHsKKwljYXNlIERDU183QklUX0RFRkFVTFQ6CisJCW9jdGV0X2xlbiA9IHNtcy0+dXNlcl9kYXRhX2xlbio3Lzg7CisJCWlmIChzbXMtPnVzZXJfZGF0YV9sZW4qNyU4ICE9IDApCisJCQlvY3RldF9sZW4rKzsKKwkJLyogV2FybmluZywgdXNlcl9kYXRhX2xlbiBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBzZXB0ZXRzCisJCSAqIChjaGFyYWN0ZXJzKSwgd2UgbmVlZCBhbW91bnQgb2Ygb2N0ZXRzIG9jY3VwaWVkICovCisJCXNtc3AgPSBtc2diX3B1dChtc2csIG9jdGV0X2xlbik7CisJCW1lbWNweShzbXNwLCBzbXMtPnVzZXJfZGF0YSwgb2N0ZXRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEQ1NfVUNTMjoKKwljYXNlIERDU184QklUX0RBVEE6CisJCXNtc3AgPSBtc2diX3B1dChtc2csIHNtcy0+dXNlcl9kYXRhX2xlbik7CisJCW1lbWNweShzbXNwLCBzbXMtPnVzZXJfZGF0YSwgc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBEYXRhIENvZGluZyBTY2hlbWU6IDB4JTAyWFxuIiwKKwkJICAgICBzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBtc2ctPmxlbiAtIG9sZF9tc2dfbGVuOworfQorCisvKiBwcm9jZXNzIGFuIGluY29taW5nIFRQRFUgKGNhbGxlZCBmcm9tIFJQLURBVEEpIAorICogcmV0dXJuIHZhbHVlID4gMDogUlAgQ0FVU0UgZm9yIEVSUk9SOyA8IDA6IHNpbGVudCBlcnJvcjsgMCA9IHN1Y2Nlc3MgKi8gCitzdGF0aWMgaW50IGdzbTM0MF9yeF90cGR1KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwl1X2ludDhfdCAqc21zcCA9IG1zZ2Jfc21zKG1zZyk7CisJc3RydWN0IGdzbV9zbXMgKmdzbXM7CisJdV9pbnQ4X3Qgc21zX210aSwgc21zX21tcywgc21zX3ZwZiwgc21zX2FscGhhYmV0LCBzbXNfcnA7CisJdV9pbnQ4X3QgKnNtc192cDsKKwl1X2ludDhfdCBkYV9sZW5fYnl0ZXM7CisJdV9pbnQ4X3QgYWRkcmVzc19sdlsxMl07IC8qIGFjY29yZGluZyB0byAwMy40MCAvIDkuMS4yLjUgKi8KKwlpbnQgcmMgPSAwOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuc3VibWl0dGVkKTsKKworCWdzbXMgPSBzbXNfYWxsb2MoKTsKKwlpZiAoIWdzbXMpCisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKworCS8qIGludmVydCB0aG9zZSBmaWVsZHMgd2hlcmUgMCBtZWFucyBhY3RpdmUvcHJlc2VudCAqLworCXNtc19tdGkgPSAqc21zcCAmIDB4MDM7CisJc21zX21tcyA9ICEhKCpzbXNwICYgMHgwNCk7CisJc21zX3ZwZiA9ICgqc21zcCAmIDB4MTgpID4+IDM7CisJZ3Ntcy0+c3RhdHVzX3JlcF9yZXEgPSAoKnNtc3AgJiAweDIwKTsKKwlnc21zLT51ZF9oZHJfaW5kID0gKCpzbXNwICYgMHg0MCk7CisJc21zX3JwICA9ICgqc21zcCAmIDB4ODApOworCisJc21zcCsrOworCWdzbXMtPm1zZ19yZWYgPSAqc21zcCsrOworCisJLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJZGFfbGVuX2J5dGVzID0gMiArICpzbXNwLzIgKyAqc21zcCUyOworCWlmIChkYV9sZW5fYnl0ZXMgPiAxMikgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJEZXN0aW5hdGlvbiBBZGRyZXNzID4gMTIgYnl0ZXMgPyE/XG4iKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfU0VNQU5UX0lOQ19NU0c7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoYWRkcmVzc19sdiwgMCwgc2l6ZW9mKGFkZHJlc3NfbHYpKTsKKwltZW1jcHkoYWRkcmVzc19sdiwgc21zcCwgZGFfbGVuX2J5dGVzKTsKKwkvKiBtYW5nbGUgZmlyc3QgYnl0ZSB0byByZWZsZWN0IGxlbmd0aCBpbiBieXRlcywgbm90IGRpZ2l0cyAqLworCWFkZHJlc3NfbHZbMF0gPSBkYV9sZW5fYnl0ZXMgLSAxOworCS8qIGNvbnZlcnQgdG8gcmVhbCBudW1iZXIgKi8KKwlnc200OF9kZWNvZGVfYmNkX251bWJlcihnc21zLT5kZXN0X2FkZHIsIHNpemVvZihnc21zLT5kZXN0X2FkZHIpLCBhZGRyZXNzX2x2LCAxKTsKKwlzbXNwICs9IGRhX2xlbl9ieXRlczsKKworCWdzbXMtPnByb3RvY29sX2lkID0gKnNtc3ArKzsKKwlnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUgPSAqc21zcCsrOworCisJc21zX2FscGhhYmV0ID0gZ3NtMzM4X2dldF9zbXNfYWxwaGFiZXQoZ3Ntcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKworCXN3aXRjaCAoc21zX3ZwZikgeworCWNhc2UgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRToKKwkJc21zX3ZwID0gc21zcCsrOworCQlicmVhazsKKwljYXNlIEdTTTM0MF9UUF9WUEZfQUJTT0xVVEU6CisJY2FzZSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VEOgorCQlzbXNfdnAgPSBzbXNwOworCQkvKiB0aGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGluZGljYXRvci4uLiAqLworCQlpZiAoc21zX3ZwZiA9PSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VEICYmICpzbXNwICYgKDE8PDcpKQorCQkJc21zcCsrOworCQlzbXNwICs9IDc7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9OT05FOgorCQlzbXNfdnAgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAKKwkJICAgICAiU01TIFZhbGlkaXR5IHBlcmlvZCBub3QgaW1wbGVtZW50ZWQ6IDB4JTAyeFxuIiwgc21zX3ZwZik7CisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKwl9CisJZ3Ntcy0+dXNlcl9kYXRhX2xlbiA9ICpzbXNwKys7CisJaWYgKGdzbXMtPnVzZXJfZGF0YV9sZW4pIHsKKwkJbWVtY3B5KGdzbXMtPnVzZXJfZGF0YSwgc21zcCwgZ3Ntcy0+dXNlcl9kYXRhX2xlbik7CisKKwkJc3dpdGNoIChzbXNfYWxwaGFiZXQpIHsKKwkJY2FzZSBEQ1NfN0JJVF9ERUZBVUxUOgorCQkJZ3NtXzdiaXRfZGVjb2RlKGdzbXMtPnRleHQsIHNtc3AsIGdzbXMtPnVzZXJfZGF0YV9sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgRENTXzhCSVRfREFUQToKKwkJY2FzZSBEQ1NfVUNTMjoKKwkJY2FzZSBEQ1NfTk9ORToKKwkJCWJyZWFrOworCQl9CisJfQorCisJZ3Ntcy0+c2VuZGVyID0gc3Vic2NyX2dldChtc2ctPmxjaGFuLT5zdWJzY3IpOworCisJTE9HUChEU01TLCBMT0dMX0lORk8sICJSWCBTTVM6IFNlbmRlcjogJXMsIE1USTogMHglMDJ4LCBWUEY6IDB4JTAyeCwgIgorCSAgICAgIk1SOiAweCUwMnggUElEOiAweCUwMngsIERDUzogMHglMDJ4LCBEQTogJXMsICIKKwkgICAgICJVc2VyRGF0YUxlbmd0aDogMHglMDJ4LCBVc2VyRGF0YTogXCIlc1wiXG4iLAorCSAgICAgc3Vic2NyX25hbWUoZ3Ntcy0+c2VuZGVyKSwgc21zX210aSwgc21zX3ZwZiwgZ3Ntcy0+bXNnX3JlZiwKKwkgICAgIGdzbXMtPnByb3RvY29sX2lkLCBnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIGdzbXMtPmRlc3RfYWRkciwKKwkgICAgIGdzbXMtPnVzZXJfZGF0YV9sZW4sCisJCQlzbXNfYWxwaGFiZXQgPT0gRENTXzdCSVRfREVGQVVMVCA/IGdzbXMtPnRleHQgOiAKKwkJCQloZXhkdW1wKGdzbXMtPnVzZXJfZGF0YSwgZ3Ntcy0+dXNlcl9kYXRhX2xlbikpOworCisJZ3Ntcy0+dmFsaWRpdHlfbWludXRlcyA9IGdzbTM0MF92YWxpZGl0eV9wZXJpb2Qoc21zX3ZwZiwgc21zX3ZwKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIDAsIGdzbXMpOworCisJLyogZGV0ZXJtaW5lIGdzbXMtPnJlY2VpdmVyIGJhc2VkIG9uIGRpYWxsZWQgbnVtYmVyICovCisJZ3Ntcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihidHMtPm5ldHdvcmssIGdzbXMtPmRlc3RfYWRkcik7CisJaWYgKCFnc21zLT5yZWNlaXZlcikgeworCQlyYyA9IDE7IC8qIGNhdXNlIDE6IHVua25vd24gc3Vic2NyaWJlciAqLworCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLnNtcy5ub19yZWNlaXZlcik7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoc21zX210aSkgeworCWNhc2UgR1NNMzQwX1NNU19TVUJNSVRfTVMyU0M6CisJCS8qIE1TIGlzIHN1Ym1pdHRpbmcgYSBTTVMgKi8KKwkJcmMgPSBnc20zNDBfcnhfc21zX3N1Ym1pdChtc2csIGdzbXMpOworCQlicmVhazsKKwljYXNlIEdTTTM0MF9TTVNfQ09NTUFORF9NUzJTQzoKKwljYXNlIEdTTTM0MF9TTVNfREVMSVZFUl9SRVBfTVMyU0M6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkIE1USSAweCUwMnhcbiIsIHNtc19tdGkpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuZGVmaW5lZCBNVEkgMHglMDJ4XG4iLCBzbXNfbXRpKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1Q7CisJCWJyZWFrOworCX0KKworCWlmICghcmMgJiYgIWdzbXMtPnJlY2VpdmVyKQorCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9NT19OVU1fVU5BU1NJR05FRDsKKworb3V0OgorCXNtc19mcmVlKGdzbXMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdV9pbnQ4X3QgbXNnX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKworCURFQlVHUChEU01TLCAiVFg6IFNNUyBSUCBBQ0tcbiIpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9BQ0tfTVQsIG1zZ19yZWYpOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2Vycm9yKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJCXVfaW50OF90IG1zZ19yZWYsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCisJbXNnYl90dl9wdXQobXNnLCAxLCBjYXVzZSk7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFg6IFNNUyBSUCBFUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgY2F1c2UsCisJCWdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfRVJST1JfTVQsIG1zZ19yZWYpOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgVFBEVSBpbnNpZGUgUlAtREFUQSAvIHVzZXIgZGF0YSAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfdWQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgsCisJCQkgIHVfaW50OF90IHNyY19sZW4sIHVfaW50OF90ICpzcmMsCisJCQkgIHVfaW50OF90IGRzdF9sZW4sIHVfaW50OF90ICpkc3QsCisJCQkgIHVfaW50OF90IHRwZHVfbGVuLCB1X2ludDhfdCAqdHBkdSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHNyY19sZW4gJiYgc3JjKQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSUC1EQVRBIChNTykgd2l0aCBTUkMgPyE/XG4iKTsKKworCWlmICghZHN0X2xlbiB8fCAhZHN0IHx8ICF0cGR1X2xlbiB8fCAhdHBkdSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlAtREFUQSAoTU8pIHdpdGhvdXQgRFNUIG9yIFRQRFUgPyE/XG4iKTsKKwkJZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkgICAgIEdTTTQxMV9SUF9DQVVTRV9JTlZfTUFORF9JTkYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT5zbXNoID0gdHBkdTsKKworCURFQlVHUChEU01TLCAiRFNUKCV1LCVzKVxuIiwgZHN0X2xlbiwgaGV4ZHVtcChkc3QsIGRzdF9sZW4pKTsKKworCXJjID0gZ3NtMzQwX3J4X3RwZHUobXNnKTsKKwlpZiAocmMgPT0gMCkKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Fjayh0cmFucywgcnBoLT5tc2dfcmVmKTsKKwllbHNlIGlmIChyYyA+IDApCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLCByYyk7CisJZWxzZQorCQlyZXR1cm4gcmM7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBSUC1EQVRBIG1lc3NhZ2UgaW4gYWNjb3JkYW5jZSB3aXRoIFNlY3Rpb24gNy4zLjEuMiAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfZGF0YShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwl1X2ludDhfdCBzcmNfbGVuLCBkc3RfbGVuLCBycHVkX2xlbjsKKwl1X2ludDhfdCAqc3JjID0gTlVMTCwgKmRzdCA9IE5VTEwgLCAqcnBfdWQgPSBOVUxMOworCisJLyogaW4gdGhlIE1PIGNhc2UsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGxlbmd0aCAqLworCXNyY19sZW4gPSBycGgtPmRhdGFbMF07CisJaWYgKHNyY19sZW4pCisJCXNyYyA9ICZycGgtPmRhdGFbMV07CisKKwlkc3RfbGVuID0gcnBoLT5kYXRhWzErc3JjX2xlbl07CisJaWYgKGRzdF9sZW4pCisJCWRzdCA9ICZycGgtPmRhdGFbMStzcmNfbGVuKzFdOworCisJcnB1ZF9sZW4gPSBycGgtPmRhdGFbMStzcmNfbGVuKzErZHN0X2xlbl07CisJaWYgKHJwdWRfbGVuKQorCQlycF91ZCA9ICZycGgtPmRhdGFbMStzcmNfbGVuKzErZHN0X2xlbisxXTsKKworCURFQlVHUChEU01TLCAiUlhfUlAtREFUQTogc3JjX2xlbj0ldSwgZHN0X2xlbj0ldSB1ZF9sZW49JXVcbiIsCisJCXNyY19sZW4sIGRzdF9sZW4sIHJwdWRfbGVuKTsKKwlyZXR1cm4gZ3NtNDExX3J4X3JwX3VkKG1zZywgdHJhbnMsIHJwaCwgc3JjX2xlbiwgc3JjLCBkc3RfbGVuLCBkc3QsCisJCQkJcnB1ZF9sZW4sIHJwX3VkKTsKK30KKworLyogUmVjZWl2ZSBhIDA0LjExIFJQLUFDSyBtZXNzYWdlIChyZXNwb25zZSB0byBSUC1EQVRBIGZyb20gdXMpICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9hY2soc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CisKKwkvKiBBY25rb3dsZWRnZW1lbnQgdG8gTVQgUlBfREFUQSwgaS5lLiB0aGUgTVMgY29uZmlybXMgaXQKKwkgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYSBTTVMuICBXZSBjYW4gbm93IHNhZmVseSBtYXJrIGl0IGFzCisJICogdHJhbnNtaXR0ZWQgKi8KKworCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1BQ0sgb24gYSBNTyB0cmFuc2ZlciA/XG4iKTsKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSk7CisJfQorCisJaWYgKCFzbXMpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiUlggUlAtQUNLIGJ1dCBubyBzbXMgaW4gdHJhbnNhY3Rpb24/IT9cbiIpOworCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIpOworCX0KKworCS8qIG1hcmsgdGhpcyBTTVMgYXMgc2VudCBpbiBkYXRhYmFzZSAqLworCWRiX3Ntc19tYXJrX3NlbnQoc21zKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX0RFTElWRVJFRCwgc21zKTsKKworCXNtc19mcmVlKHNtcyk7CisJdHJhbnMtPnNtcy5zbXMgPSBOVUxMOworCisJLyogY2hlY2sgZm9yIG1vcmUgbWVzc2FnZXMgZm9yIHRoaXMgc3Vic2NyaWJlciAqLworCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3IobXNnLT5sY2hhbi0+c3Vic2NyKTsKKwlpZiAoc21zKQorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4obXNnLT5sY2hhbiwgc21zKTsKKworCS8qIGZyZWUgdGhlIHRyYW5zYWN0aW9uIGhlcmUgKi8KKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCS8qIHJlbGVhc2UgY2hhbm5lbCBpZiBkb25lICovCisJaWYgKCFzbXMpCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9lcnJvcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSB0cmFucy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gdHJhbnMtPnNtcy5zbXM7CisJdV9pbnQ4X3QgY2F1c2VfbGVuID0gcnBoLT5kYXRhWzBdOworCXVfaW50OF90IGNhdXNlID0gcnBoLT5kYXRhWzFdOworCisJLyogRXJyb3IgaW4gcmVzcG9uc2UgdG8gTVQgUlBfREFUQSwgaS5lLiB0aGUgTVMgZGlkIG5vdAorCSAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlIHRoZSBTTVMuICBXZSBuZWVkIHRvIGludmVzdGlnYXRlCisJICogdGhlIGNhdXNlIGFuZCB0YWtlIGFjdGlvbiBkZXBlbmRpbmcgb24gaXQgKi8KKworCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICIlczogUlggU01TIFJQLUVSUk9SLCBjYXVzZSAlZDolZCAoJXMpXG4iLAorCSAgICAgc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+c3Vic2NyKSwgY2F1c2VfbGVuLCBjYXVzZSwKKwkgICAgIGdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1FUlIgb24gYSBNTyB0cmFuc2ZlciA/XG4iKTsKKyNpZiAwCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUpOworI2VuZGlmCisJfQorCisJaWYgKCFzbXMpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJIlJYIFJQLUVSUiwgYnV0IG5vIHNtcyBpbiB0cmFuc2FjdGlvbj8hP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSKTsKKyNlbmRpZgorCX0KKworCWlmIChjYXVzZSA9PSBHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVEKSB7CisJCS8qIE1TIGhhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgbWVzc2FnZS4gIFdlIG5lZWQKKwkJICogdG8gc3RvcmUgdGhpcyBpbiBvdXIgZGF0YWJhc2UgYW5kIHdhdGkgZm9yIGEgU01NQSBtZXNzYWdlICovCisJCS8qIEZJWE1FICovCisJCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX01FTV9FWENFRURFRCwgdHJhbnMtPnN1YnNjcik7CisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pOworCX0gZWxzZQorCQljb3VudGVyX2luYyhuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpOworCisJc21zX2ZyZWUoc21zKTsKKwl0cmFucy0+c21zLnNtcyA9IE5VTEw7CisKKwkvL3RyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX3NtbWEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9zZW5kX3JwX2Fjayh0cmFucywgcnBoLT5tc2dfcmVmKTsKKwl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19JRExFOworCisJLyogTVMgdGVsbHMgdXMgdGhhdCBpdCBoYXMgbWVtb3J5IGZvciBtb3JlIFNNUywgd2UgbmVlZAorCSAqIHRvIGNoZWNrIGlmIHdlIGhhdmUgYW55IHBlbmRpbmcgbWVzc2FnZXMgZm9yIGl0IGFuZCB0aGVuCisJICogdHJhbnNmZXIgdGhvc2UgKi8KKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19TTU1BLCB0cmFucy0+c3Vic2NyKTsKKworCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKG1zZy0+bGNoYW4tPnN1YnNjcik7CisJaWYgKHNtcykKKwkJZ3NtNDExX3NlbmRfc21zX2xjaGFuKG1zZy0+bGNoYW4sIHNtcyk7CisJZWxzZQorCQlyc2xfcmVsZWFzZV9yZXF1ZXN0KG1zZy0+bGNoYW4sIHRyYW5zLT5zbXMubGlua19pZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X2NwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbTQ4X2hkciAqZ2gsCisJCQkgICAgIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycF9kYXRhID0gKHN0cnVjdCBnc200MTFfcnBfaGRyKikmZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAgcnBfZGF0YS0+bXNnX3R5cGUgJiAweDA3OworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfUlBfREFUQV9NTzoKKwkJREVCVUdQKERTTVMsICJSWCBTTVMgUlAtREFUQSAoTU8pXG4iKTsKKwkJLyogc3RhcnQgVFIyTiBhbmQgZW50ZXIgJ3dhaXQgdG8gc2VuZCBSUC1BQ0sgc3RhdGUnICovCisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLOworCQlyYyA9IGdzbTQxMV9yeF9ycF9kYXRhKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9BQ0tfTU86CisJCURFQlVHUChEU01TLCJSWCBTTVMgUlAtQUNLIChNTylcbiIpOworCQlyYyA9IGdzbTQxMV9yeF9ycF9hY2sobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX1NNTUFfTU86CisJCURFQlVHUChEU01TLCAiUlggU01TIFJQLVNNTUFcbiIpOworCQkvKiBzdGFydCBUUjJOIGFuZCBlbnRlciAnd2FpdCB0byBzZW5kIFJQLUFDSyBzdGF0ZScgKi8KKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfV0FJVF9UT19UWF9SUF9BQ0s7CisJCXJjID0gZ3NtNDExX3J4X3JwX3NtbWEobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX0VSUk9SX01POgorCQlyYyA9IGdzbTQxMV9yeF9ycF9lcnJvcihtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIkludmFsaWQgUlAgdHlwZSAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBfZGF0YS0+bXNnX3JlZiwKKwkJCQkJICBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VuZCBDUC1BQ0sgdG8gZ2l2ZW4gdHJhbnNhY3Rpb24gKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3R4X2NwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9BQ0spOworCisJaWYgKHRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJLyogSWYgdGhpcyBpcyBhIE1UIFNNUyBERUxJVkVSLCB3ZSBjYW4gY2xlYXIgdHJhbnNhY3Rpb24gaGVyZSAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkvL3RyYW5zX2ZyZWUodHJhbnMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfdHhfY3BfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjYXVzZXA7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFggQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGNhdXNlLAorCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGNhdXNlKSk7CisKKwljYXVzZXAgPSBtc2diX3B1dChtc2csIDEpOworCSpjYXVzZXAgPSBjYXVzZTsKKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfRVJST1IpOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgR1NNNDhfUERJU0NfU01TIGZyb20gYWJpc19yc2wuYyAqLworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlOworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChnaC0+cHJvdG9fZGlzY3IgPj4gNCkgXiAweDgpOyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCByYyA9IDA7CisKKwlpZiAoIWxjaGFuLT5zdWJzY3IpCisJCXJldHVybiAtRUlPOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKworCURFQlVHUChEU01TLCAidHJhbnNfaWQ9JXggIiwgdHJhbnNhY3Rpb25faWQpOworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsCisJCQkJIHRyYW5zYWN0aW9uX2lkKTsKKwlpZiAoIXRyYW5zKSB7CisJCURFQlVHUEMoRFNNUywgIihuZXcpICIpOworCQl0cmFucyA9IHRyYW5zX2FsbG9jKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1BDKERTTVMsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5pc19tdCA9IDA7CisJCXRyYW5zLT5zbXMubGlua19pZCA9IGxpbmtfaWQ7CisKKwkJdHJhbnMtPmxjaGFuID0gbGNoYW47CisJCXVzZV9sY2hhbihsY2hhbik7CisJfQorCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfQ1BfREFUQToKKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLURBVEFcbiIpOworCisJCS8qIDUuNDogRm9yIE1PLCBpZiBhIENQLURBVEEgaXMgcmVjZWl2ZWQgZm9yIGEgbmV3CisJCSAqIHRyYW5zYWN0aW9uLCBlcXVhbHMgcmVjZXB0aW9uIG9mIGFuIGltcGxpY2l0CisJCSAqIGxhc3QgQ1AtQUNLIGZvciBwcmV2aW91cyB0cmFuc2FjdGlvbiAqLworCQlpZiAodHJhbnMtPnNtcy5jcF9zdGF0ZSA9PSBHU000MTFfQ1BTX0lETEUpIHsKKwkJCWludCBpOworCQkJc3RydWN0IGdzbV90cmFucyAqcHRyYW5zOworCisJCQkvKiBTY2FuIHRocm91Z2ggYWxsIHJlbW90ZSBpbml0aWF0ZWQgdHJhbnNhY3Rpb25zICovCisJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHJhbnNhY3Rpb25faWQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcHRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgR1NNNDhfUERJU0NfU01TLCBpKTsKKwkJCQlpZiAoIXB0cmFucykKKwkJCQkJY29udGludWU7CisKKwkJCQlERUJVR1AoRFNNUywgIkltcGxpY2l0IENQLUFDSyBmb3IgdHJhbnNfaWQ9JXhcbiIsIGkpOworCisJCQkJLyogRmluaXNoIGl0IGZvciBnb29kICovCisJCQkJYnNjX2RlbF90aW1lcigmcHRyYW5zLT5zbXMuY3BfdGltZXIpOworCQkJCXB0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkJCXRyYW5zX2ZyZWUocHRyYW5zKTsKKwkJCX0KKwkJfQorCisJCS8qIDUuMi4zLjEuMzogTU8gc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZAorCQkgKiBDUC1EQVRBLCBpbmNsdWRpbmcgc2VuZGluZyBvZiB0aGUgYXNzb2MuIENQLUFDSyAqLworCQkvKiA1LjIuMy4yLjQ6IE1UIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQKKwkJICogQ1AtREFUQSwgaW5jbHVkaW5nIHNlbmRpbmcgb2YgdGhlIGFzc29jLiBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQ7CisKKwkJLyogU01DIGluc3RhbmNlIGFja25vd2xlZGdlcyB0aGUgQ1AtREFUQSBmcmFtZSAqLworCQlnc200MTFfdHhfY3BfYWNrKHRyYW5zKTsKKwkJCisJCXJjID0gZ3NtNDExX3J4X2NwX2RhdGEobXNnLCBnaCwgdHJhbnMpOworI2lmIDAKKwkJLyogU2VuZCBDUC1BQ0sgb3IgQ1AtRVJPUlIgaW4gcmVzcG9uc2UgKi8KKwkJaWYgKHJjIDwgMCkgeworCQkJcmMgPSBnc200MTFfdHhfY3BfZXJyb3IodHJhbnMsIEdTTTQxMV9DUF9DQVVTRV9ORVRfRkFJTCk7CisJCX0gZWxzZQorCQkJcmMgPSBnc200MTFfdHhfY3BfYWNrKHRyYW5zKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9BQ0s6CisJCS8qIHByZXZpb3VzIENQLURBVEEgaW4gdGhpcyB0cmFuc2FjdGlvbiB3YXMgY29uZmlybWVkICovCisJCURFQlVHUEMoRFNNUywgIlJYIFNNUyBDUC1BQ0tcbiIpOworCQkvKiA1LjIuMy4xLjM6IE1PIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQgQ1AtQUNLICovCisJCS8qIDUuMi4zLjIuNDogTVQgc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZCBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQ7CisJCS8qIFN0b3AgVEMxKiBhZnRlciBDUC1BQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7CisKKwkJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCQkvKiBGSVhNRTogd2UgaGF2ZSBzb250IG9uZSBDUC1EQVRBLCB3aGljaCB3YXMgbm93CisJCQkgKiBhY2tub3dsZWRnZWQuICBDaGVjayBpZiB3ZSB3YW50IHRvIHRyYW5zZmVyIG1vcmUsCisJCQkgKiBpLmUuIG11bHRpLXBhcnQgbWVzc2FnZSAqLworCQkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJCXRyYW5zX2ZyZWUodHJhbnMpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0VSUk9SOgorCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGdoLT5kYXRhWzBdLAorCQkJZ2V0X3ZhbHVlX3N0cmluZyhjcF9jYXVzZV9zdHJzLCBnaC0+ZGF0YVswXSkpOworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRFNNUywgIlJYIFVuaW1wbGVtZW50ZWQgQ1AgbXNnX3R5cGU6IDB4JTAyeFxuIiwgbXNnX3R5cGUpOworCQlyYyA9IGdzbTQxMV90eF9jcF9lcnJvcih0cmFucywgR1NNNDExX0NQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QpOworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogVGVzdCBUUERVIC0gQUxMIFlPVVIgKi8KK3N0YXRpYyB1X2ludDhfdCB0cGR1X3Rlc3RbXSA9IHsKKwkweDA0LCAweDA0LCAweDgxLCAweDMyLCAweDI0LCAweDAwLCAweDAwLCAweDgwLCAweDIxLCAweDAzLCAweDQxLCAweDI0LAorCTB4MzIsIDB4NDAsIDB4MUYsIDB4NDEsIDB4MjYsIDB4MTMsIDB4OTQsIDB4N0QsIDB4NTYsIDB4QTUsIDB4MjAsIDB4MjgsCisJMHhGMiwgMHhFOSwgMHgyQywgMHg4MiwgMHg4MiwgMHhEMiwgMHgyMiwgMHg0OCwgMHg1OCwgMHg2NCwgMHgzRSwgMHg5RCwKKwkweDQ3LCAweDEwLCAweEY1LCAweDA5LCAweEFBLCAweDRFLCAweDAxCit9OworI2VuZGlmCisKKy8qIFRha2UgYSBTTVMgaW4gZ3NtX3NtcyBzdHJ1Y3R1cmUgYW5kIHNlbmQgaXQgdGhyb3VnaCBhbiBhbHJlYWR5CisgKiBleGlzdGluZyBsY2hhbi4gV2UgYWxzbyBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGVuc3VyZWQgdGhpcyBsY2hhbiBhbHJlYWR5CisgKiBoYXMgYSBTQVBJMyBSTEwgY29ubmVjdGlvbiEgKi8KK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJdV9pbnQ4X3QgKmRhdGEsICpycF91ZF9sZW47CisJdV9pbnQ4X3QgbXNnX3JlZiA9IDQyOworCWludCB0cmFuc2FjdGlvbl9pZDsKKwlpbnQgcmM7CisKKwl0cmFuc2FjdGlvbl9pZCA9IHRyYW5zX2Fzc2lnbl90cmFuc19pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsIDApOworCWlmICh0cmFuc2FjdGlvbl9pZCA9PSAtMSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBhdmFpbGFibGUgdHJhbnNhY3Rpb24gaWRzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlERUJVR1AoRFNNUywgInNlbmRfc21zX2xjaGFuKClcbiIpOworCisJLyogRklYTUU6IGFsbG9jYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVzc2FnZSByZWZlcmVuY2UgKi8KKwl0cmFucyA9IHRyYW5zX2FsbG9jKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCSAgICB0cmFuc2FjdGlvbl9pZCwgbmV3X2NhbGxyZWYrKyk7CisJaWYgKCF0cmFucykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJLyogRklYTUU6IHNlbmQgc29tZSBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisJdHJhbnMtPnNtcy5pc19tdCA9IDE7CisJdHJhbnMtPnNtcy5zbXMgPSBzbXM7CisJdHJhbnMtPnNtcy5saW5rX2lkID0gVU1fU0FQSV9TTVM7CS8qIEZJWE1FOiBtYWluIG9yIFNBQ0NIID8gKi8KKworCXRyYW5zLT5sY2hhbiA9IGxjaGFuOworCXVzZV9sY2hhbihsY2hhbik7CisKKwkvKiBIYXJkY29kZSBTTVNDIE9yaWdpbmF0aW5nIEFkZHJlc3MgZm9yIG5vdyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDgpOworCWRhdGFbMF0gPSAweDA3OwkvKiBvcmlnaW5hdG9yIGxlbmd0aCA9PSA3ICovCisJZGF0YVsxXSA9IDB4OTE7IC8qIHR5cGUgb2YgbnVtYmVyOiBpbnRlcm5hdGlvbmFsLCBJU0ROICovCisJZGF0YVsyXSA9IDB4NDQ7IC8qIDQ0Nzc4NTAxNjAwNSAqLworCWRhdGFbM10gPSAweDc3OworCWRhdGFbNF0gPSAweDU4OworCWRhdGFbNV0gPSAweDEwOworCWRhdGFbNl0gPSAweDA2OworCWRhdGFbN10gPSAweDUwOworCisJLyogSGFyZGNvZGVkIERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwlkYXRhID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gMDsJLyogZGVzdGluYXRpb24gbGVuZ3RoID09IDAgKi8KKworCS8qIG9idGFpbiBhIHBvaW50ZXIgZm9yIHRoZSBycF91ZF9sZW4sIHNvIHdlIGNhbiBmaWxsIGl0IGxhdGVyICovCisJcnBfdWRfbGVuID0gKHVfaW50OF90ICopbXNnYl9wdXQobXNnLCAxKTsKKworI2lmIDEKKwkvKiBnZW5lcmF0ZSB0aGUgMDMuNDAgVFBEVSAqLworCXJjID0gZ3NtMzQwX2dlbl90cGR1KG1zZywgc21zKTsKKwlpZiAocmMgPCAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmM7CisJfQorCisJKnJwX3VkX2xlbiA9IHJjOworI2Vsc2UKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YodHBkdV90ZXN0KSk7CisJbWVtY3B5KGRhdGEsIHRwZHVfdGVzdCwgc2l6ZW9mKHRwZHVfdGVzdCkpOworCSpycF91ZF9sZW4gPSBzaXplb2YodHBkdV90ZXN0KTsKKyNlbmRpZgorCisJREVCVUdQKERTTVMsICJUWDogU01TIERFTElWRVJcbiIpOworCisJY291bnRlcl9pbmMobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLmRlbGl2ZXJlZCk7CisKKwlyZXR1cm4gZ3NtNDExX3JwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX1JQX0RBVEFfTVQsIG1zZ19yZWYpOworCS8qIEZJWE1FOiBlbnRlciAnd2FpdCBmb3IgUlAtQUNLJyBzdGF0ZSwgc3RhcnQgVFIxTiAqLworfQorCisvKiBSTEwgU0FQSTMgZXN0YWJsaXNoIGNhbGxiYWNrLiBOb3cgd2UgaGF2ZSBhIFJMTCBjb25uZWN0aW9uIGFuZAorICogY2FuIGRlbGl2ZXIgdGhlIGFjdHVhbCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBybGxfaW5kX2NiKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkJdm9pZCAqX3NtcywgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gX3NtczsKKworCURFQlVHUChEU01TLCAicmxsX2luZF9jYihsY2hhbj0lcCwgbGlua19pZD0ldSwgc21zPSVwLCB0eXBlPSV1XG4iLAorCQlsY2hhbiwgbGlua19pZCwgc21zLCB0eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQlNDX1JMTFJfSU5EX0VTVF9DT05GOgorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4obGNoYW4sIHNtcyk7CisJCWJyZWFrOworCWNhc2UgQlNDX1JMTFJfSU5EX1JFTF9JTkQ6CisJY2FzZSBCU0NfUkxMUl9JTkRfRVJSX0lORDoKKwljYXNlIEJTQ19STExSX0lORF9USU1FT1VUOgorCQlzbXNfZnJlZShzbXMpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHBhZ2luZyBjYWxsYmFjay4gSGVyZSB3ZSBnZXQgY2FsbGVkIGlmIHBhZ2luZyBhIHN1YnNjcmliZXIgaGFzCisgKiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLworc3RhdGljIGludCBwYWdpbmdfY2Jfc2VuZF9zbXModW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqX3NtcykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gX3NtczsKKwlpbnQgcmM7CisKKwlERUJVR1AoRFNNUywgInBhZ2luZ19jYl9zZW5kX3Ntcyhob29rbnVtPSV1LCBldmVudD0ldSwgbXNnPSVwLCIKKwkJImxjaGFuPSVwLCBzbXM9JXApXG4iLCBob29rbnVtLCBldmVudCwgbXNnLCBsY2hhbiwgc21zKTsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJLyogUGFnaW5nIGFib3J0ZWQgd2l0aG91dCBsY2hhbiA/IT8gKi8KKwkJaWYgKCFsY2hhbikgeworCQkJc21zX2ZyZWUoc21zKTsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCS8qIEVzdGFibGlzaCBhIFNBUEkzIFJMTCBjb25uZWN0aW9uIGZvciBTTVMgKi8KKwkJcmMgPSBybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywgcmxsX2luZF9jYiwgc21zKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCXNtc19mcmVlKHNtcyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gc2VuZCBhIFNNUyB0byBhIGdpdmVuIHN1YnNjcmliZXIuIFRoZSBmdW5jdGlvbgorICogd2lsbCB0YWtlIGNhcmUgb2YgcGFnaW5nIHRoZSBzdWJzY3JpYmVyLCBlc3RhYmxpc2hpbmcgdGhlIFJMTCBTQVBJMworICogY29ubmVjdGlvbiwgZXRjLiAqLworaW50IGdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWludCByYzsKKworCS8qIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBvcGVuIGxjaGFuIHRvIHRoZSBzdWJzY3JpYmVyLgorCSAqIGlmIHllcywgc2VuZCB0aGUgU01TIHRoaXMgd2F5ICovCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJaWYgKGxjaGFuKQorCQlyZXR1cm4gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsCisJCQkJICAgICBybGxfaW5kX2NiLCBzbXMpOworCisJLyogaWYgbm90LCB3ZSBoYXZlIHRvIHN0YXJ0IHBhZ2luZyAqLworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgUlNMX0NIQU5ORUVEX1NEQ0NILAorCQkJICAgIHBhZ2luZ19jYl9zZW5kX3Ntcywgc21zKTsKKwlpZiAocmMgPD0gMCkKKwkJc21zX2ZyZWUoc21zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1YnNjcl9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TVUJTQ1JfQVRUQUNIRUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuIENoZWNrIGlmIHRoZXJlIGFyZQorCQkgKiBhbnkgcGVuZGluZyBTTVMgZm9yIGhpbSB0byBiZSBkZWxpdmVyZWQgKi8KKwkJc3Vic2NyID0gc2lnbmFsX2RhdGE7CisJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIWxjaGFuKQorCQkJYnJlYWs7CisJCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFzbXMpCisJCQlicmVhazsKKwkJLyogRXN0YWJsaXNoIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24gZm9yIFNNUyAqLworCQlybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywgcmxsX2luZF9jYiwgc21zKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfc21zKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCBzdWJzY3Jfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MTI3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCkBAIC0wLDAgKzEsMzMwIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgTWlrZSBIYWJlbiA8bWljaGFlbC5oYWJlbkBidGludGVybmV0LmNvbT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBwYXJzZV91c3NkKHVfaW50OF90ICp1c3NkLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModV9pbnQ4X3QgKnVzc2RfaWUsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX2ZhY2lsaXR5X2llKHVfaW50OF90ICpmYWNpbGl0eV9pZSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9zc19pbnZva2UodV9pbnQ4X3QgKmludm9rZV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcSh1X2ludDhfdCAqdXNzX3JlcV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl93cmFwX3dpdGhfVEwoc3RydWN0IG1zZ2IgKm1zZ2IsIHVfaW50OF90IHRhZykKK3sKKwltc2diLT5kYXRhIC09IDI7CisJbXNnYi0+ZGF0YVswXSA9IHRhZzsKKwltc2diLT5kYXRhWzFdID0gbXNnYi0+bGVuOworCW1zZ2ItPmxlbiArPSAyOworCXJldHVybiBtc2diLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfcHVzaF9UTFYxKHN0cnVjdCBtc2diICptc2diLCB1X2ludDhfdCB0YWcsCisJCQkJCSAgICB1X2ludDhfdCB2YWx1ZSkKK3sKKwltc2diLT5kYXRhIC09IDM7CisJbXNnYi0+bGVuICs9IDM7CisJbXNnYi0+ZGF0YVswXSA9IHRhZzsKKwltc2diLT5kYXRhWzFdID0gMTsKKwltc2diLT5kYXRhWzJdID0gdmFsdWU7CisJcmV0dXJuIG1zZ2ItPmRhdGE7Cit9CisKKworLyogRGVjb2RlIGEgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRC1yZXF1ZXN0IG1lc3NhZ2UgKi8KK2ludCBnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDA7CisJdV9pbnQ4X3QgKnBhcnNlX3B0ciA9IG1zZ2JfbDMobXNnKTsKKworCWlmICgoKnBhcnNlX3B0ciAmIDB4MEYpID09IEdTTTQ4X1BESVNDX05DX1NTKSB7CisJCXJlcS0+dHJhbnNhY3Rpb25faWQgPSAqcGFyc2VfcHRyICYgMHg3MDsKKwkJcmMgPSBwYXJzZV91c3NkKHBhcnNlX3B0cisxLCByZXEpOworCX0KKworCWlmICghcmMpCisJCURFQlVHUChETU0sICJFcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHJlY2VpdmVkIFVTU0QhXG4iKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV91c3NkKHVfaW50OF90ICp1c3NkLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9IHVzc2RbMF0gJiAweEJGOyAgLyogbWVzc2FnZS10eXBlIC0gc2VjdGlvbiAzLjQgKi8KKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURToKKwkJREVCVUdQKERNTSwgIlVTUyBSZWxlYXNlIENvbXBsZXRlXG4iKTsKKwkJLyogY291bGQgYWxzbyBwYXJzZSBvdXQgdGhlIG9wdGlvbmFsIENhdXNlL0ZhY2lsaXR5IGRhdGEgKi8KKwkJcmVxLT50ZXh0WzBdID0gMHhGRjsKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX01UWVBFX1JFR0lTVEVSOgorCWNhc2UgR1NNMDQ4MF9NVFlQRV9GQUNJTElUWToKKwkJcmMgJj0gcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVzc2QrMSwgcmVxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIEdTTSAwNC44MCBtZXNzYWdlLXR5cGUgZmllbGQgMHglMDJ4XG4iLAorCQkJdXNzZFswXSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1X2ludDhfdCAqdXNzZF9pZSwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYzsKKwkvKiBJbmZvcm1hdGlvbiBFbGVtZW50IElkZW50aWZpZXIgLSB0YWJsZSAzLjIgJiBHU00gMDQuMDggc2VjdGlvbiAxMC41ICovCisJdV9pbnQ4X3QgaWVpID0gdXNzZF9pZVswXTsKKwl1X2ludDhfdCBpZWlfbGVuZ3RoID0gdXNzZF9pZVsxXTsKKworCXN3aXRjaCAoaWVpKSB7CisJY2FzZSBHU000OF9JRV9DQVVTRToKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX0lFX0ZBQ0lMSVRZOgorCQlyYyA9IHBhcnNlX2ZhY2lsaXR5X2llKHVzc2RfaWUrMiwgaWVpX2xlbmd0aCwgcmVxKTsKKwkJYnJlYWs7CisJY2FzZSBHU00wNDgwX0lFX1NTX1ZFUlNJT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5oYW5kbGVkIEdTTSAwNC4wOCBvciAwNC44MCBJRUkgMHglMDJ4XG4iLAorCQkJaWVpKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZmFjaWxpdHlfaWUodV9pbnQ4X3QgKmZhY2lsaXR5X2llLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBvZmZzZXQgPSAwOworCisJZG8geworCQkvKiBDb21wb25lbnQgVHlwZSB0YWcgLSB0YWJsZSAzLjcgKi8KKwkJdV9pbnQ4X3QgY29tcG9uZW50X3R5cGUgPSBmYWNpbGl0eV9pZVtvZmZzZXRdOworCQl1X2ludDhfdCBjb21wb25lbnRfbGVuZ3RoID0gZmFjaWxpdHlfaWVbb2Zmc2V0KzFdOworCisJCXN3aXRjaCAoY29tcG9uZW50X3R5cGUpIHsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX0lOVk9LRToKKwkJCXJjICY9IHBhcnNlX3NzX2ludm9rZShmYWNpbGl0eV9pZSsyLAorCQkJCQkJY29tcG9uZW50X2xlbmd0aCwKKwkJCQkJCXJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQ6CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9FUlJPUjoKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVKRUNUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gR1NNIDA0LjgwIEZhY2lsaXR5ICIKKwkJCQkiQ29tcG9uZW50IFR5cGUgMHglMDJ4XG4iLCBjb21wb25lbnRfdHlwZSk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlvZmZzZXQgKz0gKGNvbXBvbmVudF9sZW5ndGgrMik7CisJfSB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKTsKKworCXJldHVybiByYzsKK30KKworLyogUGFyc2UgYW4gSW52b2tlIGNvbXBvbmVudCAtIHNlZSB0YWJsZSAzLjMgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfc3NfaW52b2tlKHVfaW50OF90ICppbnZva2VfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3Qgb2Zmc2V0OworCisJLyogbWFuZGF0b3J5IHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbMF0gIT0gR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lEKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBHU00gMDQuODAgQ29tcG9uZW50LUlEIHRhZyAiCisJCQkiMHglMDJ4IChleHBlY3RpbmcgSW52b2tlIElEIHRhZylcbiIsIGludm9rZV9kYXRhWzBdKTsKKwl9CisKKwlvZmZzZXQgPSBpbnZva2VfZGF0YVsxXSArIDI7CisJcmVxLT5pbnZva2VfaWQgPSBpbnZva2VfZGF0YVsyXTsKKworCS8qIG9wdGlvbmFsIHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbb2Zmc2V0XSA9PSBHU00wNDgwX0NPTVBJRFRBR19MSU5LRURfSUQpCisJCW9mZnNldCArPSBpbnZva2VfZGF0YVtvZmZzZXQrMV0gKyAyOyAgLyogc2tpcCBvdmVyIGl0ICovCisKKwkvKiBtYW5kYXRvcnkgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVtvZmZzZXRdID09IEdTTTA0ODBfT1BFUkFUSU9OX0NPREUpIHsKKwkJdV9pbnQ4X3Qgb3BlcmF0aW9uX2NvZGUgPSBpbnZva2VfZGF0YVtvZmZzZXQrMl07CisJCXN3aXRjaCAob3BlcmF0aW9uX2NvZGUpIHsKKwkJY2FzZSBHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVROgorCQkJcmMgPSBwYXJzZV9wcm9jZXNzX3Vzc19yZXEoaW52b2tlX2RhdGEgKyBvZmZzZXQgKyAzLAorCQkJCQkJICAgbGVuZ3RoIC0gb2Zmc2V0IC0gMywKKwkJCQkJCSAgIHJlcSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiR1NNIDA0LjgwIG9wZXJhdGlvbiBjb2RlIDB4JTAyeCAiCisJCQkJImlzIG5vdCB5ZXQgaGFuZGxlZFxuIiwgb3BlcmF0aW9uX2NvZGUpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgR1NNIDA0LjgwIENvbXBvbmVudC1JRCB0YWcgMHglMDJ4ICIKKwkJCSIoZXhwZWN0aW5nIE9wZXJhdGlvbiBDb2RlIHRhZylcbiIsCisJCQlpbnZva2VfZGF0YVswXSk7CisJCXJjID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgUHJvY2VzcyBVbnN0cnVjdHVyZWRTUyBSZXF1ZXN0ICovCitzdGF0aWMgaW50IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcSh1X2ludDhfdCAqdXNzX3JlcV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBudW1fY2hhcnM7CisJdV9pbnQ4X3QgZGNzOworCisJaWYgKHVzc19yZXFfZGF0YVswXSA9PSBHU01fMDQ4MF9TRVFVRU5DRV9UQUcpIHsKKwkJaWYgKHVzc19yZXFfZGF0YVsyXSA9PSBBU04xX09DVEVUX1NUUklOR19UQUcpIHsKKwkJCWRjcyA9IHVzc19yZXFfZGF0YVs0XTsKKwkJCWlmICgoZGNzID09IDB4MEYpICYmCisJCQkgICAgKHVzc19yZXFfZGF0YVs1XSA9PSBBU04xX09DVEVUX1NUUklOR19UQUcpKSB7CisJCQkJbnVtX2NoYXJzID0gKHVzc19yZXFfZGF0YVs2XSAqIDgpIC8gNzsKKwkJCQkvKiBQcmV2ZW50IGEgbW9iaWxlLW9yaWdpbmF0ZWQgYnVmZmVyLW92ZXJydW4hICovCisJCQkJaWYgKG51bV9jaGFycyA+IE1BWF9MRU5fVVNTRF9TVFJJTkcpCisJCQkJCW51bV9jaGFycyA9IE1BWF9MRU5fVVNTRF9TVFJJTkc7CisJCQkJZ3NtXzdiaXRfZGVjb2RlKHJlcS0+dGV4dCwKKwkJCQkJCSYodXNzX3JlcV9kYXRhWzddKSwgbnVtX2NoYXJzKTsKKwkJCQkvKiBhcHBlbmQgbnVsbC10ZXJtaW5hdG9yICovCisJCQkJcmVxLT50ZXh0W251bV9jaGFycysxXSA9IDA7ICAKKwkJCQlyYyA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBTZW5kIHJlc3BvbnNlIHRvIGEgbW9iaWxlLW9yaWdpbmF0ZWQgUHJvY2Vzc1Vuc3RydWN0dXJlZFNTLVJlcXVlc3QgKi8KK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyICpyZXNwb25zZV90ZXh0LAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdV9pbnQ4X3QgKnB0cjg7CisJaW50IHJlc3BvbnNlX2xlbjsKKworCXJlc3BvbnNlX2xlbiA9IChzdHJsZW4ocmVzcG9uc2VfdGV4dCkgKiA3KSAvIDg7CisJaWYgKCgoc3RybGVuKHJlc3BvbnNlX3RleHQpICogNykgJSA4KSAhPSAwKQorCQlyZXNwb25zZV9sZW4gKz0gMTsKKworCW1zZy0+YnRzX2xpbmsgPSBpbl9tc2ctPmJ0c19saW5rOworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgcHV0IHRoZSBwYXlsb2FkIHRleHQgaW50byB0aGUgbWVzc2FnZSAqLworCXB0cjggPSBtc2diX3B1dChtc2csIHJlc3BvbnNlX2xlbik7CisJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIHJlc3BvbnNlX3RleHQpOworCisJLyogVGhlbiB3cmFwIGl0IGFzIGFuIE9jdGV0IFN0cmluZyAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBEQ1Mgb2N0ZXQgc3RyaW5nICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBBU04xX09DVEVUX1NUUklOR19UQUcsIDB4MEYpOworCisJLyogVGhlbiB3cmFwIHRoZXNlIGFzIGEgU2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgb3BlcmF0aW9uIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfT1BFUkFUSU9OX0NPREUsCisJCQlHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVRKTsKKworCS8qIFdyYXAgdGhlIG9wZXJhdGlvbiBjb2RlIGFuZCBJQTUgc3RyaW5nIGFzIGEgc2VxdWVuY2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTV8wNDgwX1NFUVVFTkNFX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgaW52b2tlIElEICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQsIHJlcS0+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJldHVybiBSZXN1bHQgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQpOworCisJLyogV3JhcCB0aGUgY29tcG9uZW50IGluIGEgRmFjaWxpdHkgbWVzc2FnZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9JRV9GQUNJTElUWSk7CisKKwkvKiBBbmQgZmluYWxseSBwcmUtcGVuZCB0aGUgTDMgaGVhZGVyICovCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTkNfU1MgfCByZXEtPnRyYW5zYWN0aW9uX2lkCisJCQkJCXwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKmluX21zZywKKwkJCQljb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+YnRzX2xpbmsgPSBpbl9tc2ctPmJ0c19saW5rOworCW1zZy0+bGNoYW4gPSBpbl9tc2ctPmxjaGFuOworCisJLyogRmlyc3QgaW5zZXJ0IHRoZSBwcm9ibGVtIGNvZGUgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfR0VORVJBTCwKKwkJCUdTTV8wNDgwX0dFTl9QUk9CX0NPREVfVU5SRUNPR05JU0VEKTsKKworCS8qIEJlZm9yZSBpdCBpbnNlcnQgdGhlIGludm9rZSBJRCAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lELCByZXEtPmludm9rZV9pZCk7CisKKwkvKiBXcmFwIHRoaXMgdXAgYXMgYSBSZWplY3QgY29tcG9uZW50ICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0NUWVBFX1JFSkVDVCk7CisKKwkvKiBXcmFwIHRoZSBjb21wb25lbnQgaW4gYSBGYWNpbGl0eSBtZXNzYWdlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0lFX0ZBQ0lMSVRZKTsKKworCS8qIEFuZCBmaW5hbGx5IHByZS1wZW5kIHRoZSBMMyBoZWFkZXIgKi8KKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19OQ19TUzsKKwlnaC0+cHJvdG9fZGlzY3IgfD0gcmVxLT50cmFuc2FjdGlvbl9pZCB8ICgxPDw3KTsgIC8qIFRJIGRpcmVjdGlvbiA9IDEgKi8KKwlnaC0+bXNnX3R5cGUgPSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxNGQxMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0YXRpYyBMTElTVF9IRUFEKGJ0c19tb2RlbHMpOworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcykKK3sKKwl0cy0+ZTFfbGluay5lMV9uciA9IGUxX25yOworCXRzLT5lMV9saW5rLmUxX3RzID0gZTFfdHM7CisJdHMtPmUxX2xpbmsuZTFfdHNfc3MgPSBlMV90c19zczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnBjaGFuX25hbWVzW10gPSB7CisJW0dTTV9QQ0hBTl9OT05FXQk9ICJOT05FIiwKKwlbR1NNX1BDSEFOX0NDQ0hdCT0gIkNDQ0giLAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdCT0gIkNDQ0grU0RDQ0g0IiwKKwlbR1NNX1BDSEFOX1RDSF9GXQk9ICJUQ0gvRiIsCisJW0dTTV9QQ0hBTl9UQ0hfSF0JPSAiVENIL0giLAorCVtHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOENdID0gIlNEQ0NIOCIsCisJW0dTTV9QQ0hBTl9QRENIXQk9ICJQRENIIiwKKwlbR1NNX1BDSEFOX1RDSF9GX1BEQ0hdCT0gIlRDSC9GX1BEQ0giLAorCVtHU01fUENIQU5fVU5LTk9XTl0JPSAiVU5LTk9XTiIsCit9OworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpCit7CisJaWYgKGMgPj0gQVJSQVlfU0laRShwY2hhbl9uYW1lcykpCisJCXJldHVybiAiSU5WQUxJRCI7CisKKwlyZXR1cm4gcGNoYW5fbmFtZXNbY107Cit9CisKK2VudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZ3NtX3BjaGFuX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2hhbl9uYW1lcyk7IGkrKykgeworCQlpZiAoIXN0cmNhc2VjbXAobmFtZSwgcGNoYW5fbmFtZXNbaV0pKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbGNoYW5fbmFtZXNbXSA9IHsKKwlbR1NNX0xDSEFOX05PTkVdCT0gIk5PTkUiLAorCVtHU01fTENIQU5fU0RDQ0hdCT0gIlNEQ0NIIiwKKwlbR1NNX0xDSEFOX1RDSF9GXQk9ICJUQ0gvRiIsCisJW0dTTV9MQ0hBTl9UQ0hfSF0JPSAiVENIL0giLAorCVtHU01fTENIQU5fVU5LTk9XTl0JPSAiVU5LTk9XTiIsCit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpCit7CisJaWYgKGMgPj0gQVJSQVlfU0laRShsY2hhbl9uYW1lcykpCisJCXJldHVybiAiSU5WQUxJRCI7CisKKwlyZXR1cm4gbGNoYW5fbmFtZXNbY107Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxjaGFuX3NfbmFtZXNbXSA9IHsKKwl7IExDSEFOX1NfTk9ORSwJCSJOT05FIiB9LAorCXsgTENIQU5fU19BQ1RfUkVRLAkiQUNUSVZBVElPTiBSRVFVRVNURUQiIH0sCisJeyBMQ0hBTl9TX0FDVElWRSwJIkFDVElWRSIgfSwKKwl7IExDSEFOX1NfSU5BQ1RJVkUsCSJJTkFDVElWRSIgfSwKKwl7IExDSEFOX1NfUkVMX1JFUSwJIlJFTEVBU0UgUkVRVUVTVEVEIiB9LAorCXsgMCwJCQlOVUxMIH0sCit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsY2hhbl9zX25hbWVzLCBzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNocmVxX25hbWVzW10gPSB7CisJW0dTTV9DSFJFUV9SRUFTT05fRU1FUkddCT0gIkVNRVJHRU5DWSIsCisJW0dTTV9DSFJFUV9SRUFTT05fUEFHXQkJPSAiUEFHSU5HIiwKKwlbR1NNX0NIUkVRX1JFQVNPTl9DQUxMXQkJPSAiQ0FMTCIsCisJW0dTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBEXQk9ICJMT0NBVElPTl9VUERBVEUiLAorCVtHU01fQ0hSRVFfUkVBU09OX09USEVSXQk9ICJPVEhFUiIsCit9OworCitjb25zdCBjaGFyICpnc21fY2hyZXFfbmFtZShlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBjKQoreworCWlmIChjID49IEFSUkFZX1NJWkUoY2hyZXFfbmFtZXMpKQorCQlyZXR1cm4gIklOVkFMSUQiOworCisJcmV0dXJuIGNocmVxX25hbWVzW2NdOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgKmJ0c19tb2RlbF9maW5kKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobW9kZWwsICZidHNfbW9kZWxzLCBsaXN0KSB7CisJCWlmIChtb2RlbC0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIG1vZGVsOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgZ3NtX2J0c19tb2RlbF9yZWdpc3RlcihzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwpCit7CisJaWYgKGJ0c19tb2RlbF9maW5kKG1vZGVsLT50eXBlKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwl0bHZfZGVmX3BhdGNoKCZtb2RlbC0+bm1fYXR0X3RsdmRlZiwgJm5tX2F0dF90bHZkZWYpOworCWxsaXN0X2FkZF90YWlsKCZtb2RlbC0+bGlzdCwgJmJ0c19tb2RlbHMpOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHRhbGxvY196ZXJvKGJ0cywgc3RydWN0IGdzbV9idHNfdHJ4KTsKKwlpbnQgazsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gTlVMTDsKKworCXRyeC0+YnRzID0gYnRzOworCXRyeC0+bnIgPSBidHMtPm51bV90cngrKzsKKwl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID0gTk1fU1RBVEVfVU5MT0NLRUQ7CisKKwlmb3IgKGsgPSAwOyBrIDwgVFJYX05SX1RTOyBrKyspIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2tdOworCQlpbnQgbDsKKwkJCisJCXRzLT50cnggPSB0cng7CisJCXRzLT5uciA9IGs7CisJCXRzLT5wY2hhbiA9IEdTTV9QQ0hBTl9OT05FOworCisJCWZvciAobCA9IDA7IGwgPCBUU19NQVhfTENIQU47IGwrKykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbF07CisKKwkJCWxjaGFuLT50cyA9IHRzOworCQkJbGNoYW4tPm5yID0gbDsKKwkJCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJCX0KKwl9CisKKwlpZiAodHJ4LT5uciAhPSAwKQorCQl0cngtPm5vbWluYWxfcG93ZXIgPSBidHMtPmMwLT5ub21pbmFsX3Bvd2VyOworCisJbGxpc3RfYWRkX3RhaWwoJnRyeC0+bGlzdCwgJmJ0cy0+dHJ4X2xpc3QpOworCisJcmV0dXJuIHRyeDsKK30KKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRhbGxvY196ZXJvKG5ldCwgc3RydWN0IGdzbV9idHMpOworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCA9IGJ0c19tb2RlbF9maW5kKHR5cGUpOworCWludCBpOworCisJaWYgKCFidHMpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFtb2RlbCAmJiB0eXBlICE9IEdTTV9CVFNfVFlQRV9VTktOT1dOKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ0cy0+bmV0d29yayA9IG5ldDsKKwlidHMtPm5yID0gbmV0LT5udW1fYnRzKys7CisJYnRzLT50eXBlID0gdHlwZTsKKwlidHMtPm1vZGVsID0gbW9kZWw7CisJYnRzLT50c2MgPSB0c2M7CisJYnRzLT5ic2ljID0gYnNpYzsKKwlidHMtPm51bV90cnggPSAwOworCUlOSVRfTExJU1RfSEVBRCgmYnRzLT50cnhfbGlzdCk7CisJYnRzLT5tc19tYXhfcG93ZXIgPSAxNTsJLyogZEJtICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCA9IDI7IC8qIDQgZEIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiA9IDA7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5uZWlnaF9saXN0OworCWJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3QuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3QpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YSA9IGJ0cy0+c2lfY29tbW9uLmRhdGEuY2VsbF9hbGxvYzsKKwlidHMtPnNpX2NvbW1vbi5jZWxsX2FsbG9jLmRhdGFfbGVuID0KKwkJCQlzaXplb2YoYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jKTsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wucmUgPSAxOyAvKiBubyByZS1lc3RhYmxpc2htZW50ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSA5OyAgLyogMTIgc2xvdHMgc3ByZWFkIC0gMjE3LzExNSBzbG90cyBkZWxheSAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMgPSAzOyAvKiA3IHJldHJhbnNtaXNzaW9ucyAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50MiA9IDQ7IC8qIG5vIGVtZXJnZW5jeSBjYWxscyAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJYnRzLT5ncHJzLm5zdmNbaV0uYnRzID0gYnRzOworCQlidHMtPmdwcnMubnN2Y1tpXS5pZCA9IGk7CisJfQorCisJLyogY3JlYXRlIG91ciBwcmltYXJ5IFRSWCAqLworCWJ0cy0+YzAgPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWlmICghYnRzLT5jMCkgeworCQl0YWxsb2NfZnJlZShidHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnRzLT5jMC0+dHNbMF0ucGNoYW4gPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisKKwlsbGlzdF9hZGRfdGFpbCgmYnRzLT5saXN0LCAmbmV0LT5idHNfbGlzdCk7CisKKwlyZXR1cm4gYnRzOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbV9uZXR3b3JrX2luaXQodV9pbnQxNl90IGNvdW50cnlfY29kZSwgdV9pbnQxNl90IG5ldHdvcmtfY29kZSwKKwkJCQkgICAgIGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKworCW5ldCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGdzbV9uZXR3b3JrKTsKKwlpZiAoIW5ldCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXQtPmNvdW50cnlfY29kZSA9IGNvdW50cnlfY29kZTsKKwluZXQtPm5ldHdvcmtfY29kZSA9IG5ldHdvcmtfY29kZTsKKwluZXQtPm51bV9idHMgPSAwOworCW5ldC0+cmVqZWN0X2NhdXNlID0gR1NNNDhfUkVKRUNUX1JPQU1JTkdfTk9UX0FMTE9XRUQ7CisJbmV0LT5UMzEwMSA9IEdTTV9UMzEwMV9ERUZBVUxUOworCW5ldC0+VDMxMTMgPSBHU01fVDMxMTNfREVGQVVMVDsKKwkvKiBGSVhNRTogaW5pdGlhbGl6ZSBhbGwgb3RoZXIgdGltZXJzISAqLworCisJLyogZGVmYXVsdCBzZXQgb2YgaGFuZG92ZXIgcGFyYW1ldGVycyAqLworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZyA9IDEwOworCW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcgPSAxOworCW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IDEwOworCW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsID0gNjsKKwluZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzID0gMzsKKwluZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IDk5OTk7CisKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+dHJhbnNfbGlzdCk7CisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPnVwcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT5idHNfbGlzdCk7CisKKwluZXQtPnN0YXRzLmNocmVxLnRvdGFsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLnRvdGFsIik7CisJbmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsID0gY291bnRlcl9hbGxvYygibmV0LmNocmVxLm5vX2NoYW5uZWwiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5hdHRlbXB0ZWQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIubm9fY2hhbm5lbCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci50aW1lb3V0Iik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuZmFpbGVkIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5hdHRhY2giKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLm5vcm1hbCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5wZXJpb2RpYyIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5pbXNpX2RldGFjaC5jb3VudCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3Jlc3AucmVqZWN0Iik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0ID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfcmVzcC5hY2NlcHQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmF0dGVtcHRlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmRldGFjaGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5kZXRhY2hlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuY29tcGxldGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuZXhwaXJlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuZXhwaXJlZCIpOworCW5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMuc3VibWl0dGVkIik7CisJbmV0LT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLm5vX3JlY2VpdmVyIik7CisJbmV0LT5zdGF0cy5zbXMuZGVsaXZlcmVkID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5kZWxpdmVyZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfbWVtIik7CisJbmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ycF9lcnJfb3RoZXIiKTsKKwluZXQtPnN0YXRzLmNhbGwuZGlhbGxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmRpYWxsZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuYWxlcnRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmFsZXJ0ZWQiKTsKKwluZXQtPnN0YXRzLmNhbGwuY29ubmVjdGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuY29ubmVjdGVkIik7CisKKwluZXQtPm1uY2NfcmVjdiA9IG1uY2NfcmVjdjsKKworCXJldHVybiBuZXQ7Cit9CisKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX251bShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKG51bSA+PSBuZXQtPm51bV9idHMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoYnRzLT5uciA9PSBudW0pCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqbmVpZ2g7CisJLyogRklYTUU6IHVzZSBzb21lIGJldHRlciBoZXVyaXN0aWNzIGhlcmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGwKKwkgKiB1c2luZyB0aGlzIEFSRkNOIHJlYWxseSBpcyBjbG9zZXN0IHRvIHRoZSB0YXJnZXQgY2VsbC4gIEZvcgorCSAqIG5vdyB3ZSBzaW1wbHkgYXNzdW1lIHRoYXQgZWFjaCBBUkZDTiB3aWxsIG9ubHkgYmUgdXNlZCBieSBvbmUKKwkgKiBjZWxsICovCisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaCwgJmJ0cy0+bmV0d29yay0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5laWdoLT5jMC0+YXJmY24gPT0gYXJmY24gJiYKKwkJICAgIG5laWdoLT5ic2ljID09IGJzaWMpCisJCQlyZXR1cm4gbmVpZ2g7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAobnVtID49IGJ0cy0+bnVtX3RyeCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWlmICh0cngtPm5yID09IG51bSkKKwkJCXJldHVybiB0cng7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIHRzMnN0clsyNTVdOworCitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkKSIsCisJCSB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworCitjaGFyICpnc21fdHNfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXNucHJpbnRmKHRzMnN0ciwgc2l6ZW9mKHRzMnN0ciksICIoYnRzPSVkLHRyeD0lZCx0cz0lZCkiLAorCQkgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gbGNoYW4tPnRzOworCisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkLHRzPSVkLHNzPSVkKSIsCisJCSB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yLCBsY2hhbi0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJ0c190eXBlc1tdID0geworCVtHU01fQlRTX1RZUEVfVU5LTk9XTl0gPSAidW5rbm93biIsCisJW0dTTV9CVFNfVFlQRV9CUzExXSA9ICJiczExIiwKKwlbR1NNX0JUU19UWVBFX05BTk9CVFNdID0gIm5hbm9idHMiLAorfTsKKworZW51bSBnc21fYnRzX3R5cGUgcGFyc2VfYnRzdHlwZShjb25zdCBjaGFyICphcmcpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzX3R5cGVzKTsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZywgYnRzX3R5cGVzW2ldKSkKKwkJCXJldHVybiBpOworCX0JCisJcmV0dXJuIEdTTV9CVFNfVFlQRV9CUzExOyAvKiBEZWZhdWx0OiBCUzExICovCit9CisKK2NvbnN0IGNoYXIgKmJ0c3R5cGUyc3RyKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJaWYgKHR5cGUgPiBBUlJBWV9TSVpFKGJ0c190eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gYnRzX3R5cGVzW3R5cGVdOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2J5X25yKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBucikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRyeC0+bnIgPT0gbnIpCisJCQlyZXR1cm4gdHJ4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogU2VhcmNoIGZvciBhIEJUUyBpbiB0aGUgZ2l2ZW4gTG9jYXRpb24gQXJlYTsgb3B0aW9uYWxseSBzdGFydCBzZWFyY2hpbmcKKyAqIHdpdGggc3RhcnRfYnRzIChmb3IgY29udGludWluZyB0byBzZWFyY2ggYWZ0ZXIgdGhlIGZpcnN0IHJlc3VsdCkgKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKQoreworCWludCBpOworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IHNraXAgPSAwOworCisJaWYgKHN0YXJ0X2J0cykKKwkJc2tpcCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1fYnRzOyBpKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBpKTsKKworCQlpZiAoc2tpcCkgeworCQkJaWYgKHN0YXJ0X2J0cyA9PSBidHMpCisJCQkJc2tpcCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTIHx8IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID09IGxhYykKKwkJCXJldHVybiBidHM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ3NtX2F1dGhfcG9saWN5X25hbWVzW10gPSB7CisJW0dTTV9BVVRIX1BPTElDWV9DTE9TRURdID0gImNsb3NlZCIsCisJW0dTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMXSA9ICJhY2NlcHQtYWxsIiwKKwlbR1NNX0FVVEhfUE9MSUNZX1RPS0VOXSA9ICJ0b2tlbiIsCit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdzbV9hdXRoX3BvbGljeV9uYW1lcyk7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmcsIGdzbV9hdXRoX3BvbGljeV9uYW1lc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIEdTTV9BVVRIX1BPTElDWV9DTE9TRUQ7Cit9CisKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSkKK3sKKwlpZiAocG9saWN5ID4gQVJSQVlfU0laRShnc21fYXV0aF9wb2xpY3lfbmFtZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIGdzbV9hdXRoX3BvbGljeV9uYW1lc1twb2xpY3ldOworfQorCisvKiB0aGlzIHNob3VsZCBub3QgYmUgaGVyZSBidXQgaW4gZ3NtXzA0XzA4Li4uIGJ1dCB0aGF0IGNyZWF0ZXMKKyAgIGluIHR1cm4gYSBkZXBlbmRlbmN5IG5pZ2h0bWFyZSAoYWJpc19ubSBkZXBlbmRpbmcgb24gMDRfMDgsIC4uLikgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfY29uc3RydWN0X3JhKHVfaW50OF90ICpidWYsIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXVfaW50MTZfdCBtY2MgPSByYWlkLT5tY2M7CisJdV9pbnQxNl90IG1uYyA9IHJhaWQtPm1uYzsKKworCWJ1ZlswXSA9ICgobWNjIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwlidWZbMV0gPSAobWNjICUgMTApOworCisJLyogSSB3b25kZXIgd2hvIGNhbWUgdXAgd2l0aCB0aGUgc3R1cGlkaXR5IG9mIGVuY29kaW5nIHRoZSBNTkMKKwkgKiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGlnaXRzIGl0cyBkZWNpbWFsIG51bWJlciBoYXMhICovCisJaWYgKG1uYyA8IDEwMCkgeworCQlidWZbMV0gfD0gMHhmMDsKKwkJYnVmWzJdID0gKChtbmMgLyAxMCkgJSAxMCkgfCAoKG1uYyAlIDEwKSA8PCA0KTsKKwl9IGVsc2UgeworCQlidWZbMV0gfD0gKG1uYyAlIDEwKSA8PCA0OworCQlidWZbMl0gPSAoKG1uYyAvIDEwMCkgJSAxMCkgfCAoKChtY2MgLyAxMCkgJSAxMCkgPDwgNCk7CisJfQorCisJKih1X2ludDE2X3QgKikoYnVmKzMpID0gaHRvbnMocmFpZC0+bGFjKTsKKworCWJ1Zls1XSA9IHJhaWQtPnJhYzsKKworCXJldHVybiA2OworfQorCit2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJhaWQtPm1jYyA9IGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlOworCXJhaWQtPm1uYyA9IGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlOworCXJhaWQtPmxhYyA9IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlOworCXJhaWQtPnJhYyA9IGJ0cy0+Z3Bycy5yYWM7Cit9CisKK2ludCBnc200OF9yYV9pZF9ieV9idHModV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYWlkOworCisJZ3Byc19yYV9pZF9ieV9idHMoJnJhaWQsIGJ0cyk7CisKKwlyZXR1cm4gZ3NtNDhfY29uc3RydWN0X3JhKGJ1ZiwgJnJhaWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWVzW10gPSB7CisJW1JSTFBfTU9ERV9OT05FXSA9ICJub25lIiwKKwlbUlJMUF9NT0RFX01TX0JBU0VEXSA9ICJtcy1iYXNlZCIsCisJW1JSTFBfTU9ERV9NU19QUkVGXSA9ICJtcy1wcmVmZXJyZWQiLAorCVtSUkxQX01PREVfQVNTX1BSRUZdID0gImFzcy1wcmVmZXJyZWQiLAorfTsKKworZW51bSBycmxwX21vZGUgcnJscF9tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShycmxwX21vZGVfbmFtZXMpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYXJnLCBycmxwX21vZGVfbmFtZXNbaV0pKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiBSUkxQX01PREVfTk9ORTsKK30KKworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSkKK3sKKwlpZiAobW9kZSA+IEFSUkFZX1NJWkUocnJscF9tb2RlX25hbWVzKSkKKwkJcmV0dXJuICJub25lIjsKKwlyZXR1cm4gcnJscF9tb2RlX25hbWVzW21vZGVdOworfQorCitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1lYXNfcmVwOworCisJbWVhc19yZXAgPSAmbGNoYW4tPm1lYXNfcmVwW2xjaGFuLT5tZWFzX3JlcF9pZHhdOworCW1lbXNldChtZWFzX3JlcCwgMCwgc2l6ZW9mKCptZWFzX3JlcCkpOworCW1lYXNfcmVwLT5sY2hhbiA9IGxjaGFuOworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAobGNoYW4tPm1lYXNfcmVwX2lkeCArIDEpCisJCQkJCSUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCisJcmV0dXJuIG1lYXNfcmVwOworfQorCitpbnQgZ3NtX3NldF9idHNfdHlwZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKworCW1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaWYgKCFtb2RlbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJLyogU2V0IHRoZSBkZWZhdWx0IE9NTCBTdHJlYW0gSUQgdG8gMHhmZiAqLworCQlidHMtPm9tbF90ZWkgPSAweGZmOworCQlidHMtPmMwLT5ub21pbmFsX3Bvd2VyID0gMjM7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNTA4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIFRoZSBjb25jZXB0IG9mIGEgc3Vic2NyaWJlciBmb3IgdGhlIE1TQywgcm91Z2hseSBITFIvVkxSIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgKnN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIodm9pZCk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWlmIChzdHJsZW4oc3Vic2NyLT5uYW1lKSkKKwkJcmV0dXJuIHN1YnNjci0+bmFtZTsKKworCXJldHVybiBzdWJzY3ItPmltc2k7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV90bXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIHVfaW50MzJfdCB0bXNpKQoreworCWNoYXIgdG1zaV9zdHJpbmdbMTRdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogd2UgbWlnaHQgaGF2ZSBhIHJlY29yZCBpbiBtZW1vcnkgYWxyZWFkeSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAodG1zaSA9PSBzdWJzY3ItPnRtc2kpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXNwcmludGYodG1zaV9zdHJpbmcsICIldSIsIHRtc2kpOworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX1RNU0ksIHRtc2lfc3RyaW5nKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2ltc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3RyY21wKHN1YnNjci0+aW1zaSwgaW1zaSkgPT0gMCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgaW1zaSk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN0cmNtcChzdWJzY3ItPmV4dGVuc2lvbiwgZXh0KSA9PSAwKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9FWFRFTlNJT04sIGV4dCk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGlkKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCWNoYXIgYnVmWzMyXTsKKwlzcHJpbnRmKGJ1ZiwgIiVsbHUiLCBpZCk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN1YnNjci0+aWQgPT0gaWQpCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lELCBidWYpOworfQorCisKK2ludCBzdWJzY3JfdXBkYXRlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcywgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlYXNvbikKK3sKKwkvKiBGSVhNRTogTWlncmF0ZSBwZW5kaW5nIHJlcXVlc3RzIGZyb20gb25lIEJTQyB0byBhbm90aGVyICovCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRDoKKwkJcy0+bmV0ID0gYnRzLT5uZXR3b3JrOworCQkvKiBJbmRpY2F0ZSAiYXR0YWNoZWQgdG8gTEFDIiAqLworCQlzLT5sYWMgPSBidHMtPmxvY2F0aW9uX2FyZWFfY29kZTsKKwkJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgQVRUQUNIRUQgTEFDPSV1XG4iLAorCQkJc3Vic2NyX25hbWUocyksIHMtPmxhYyk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0FUVEFDSEVELCBzKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQ6CisJCS8qIE9ubHkgZGV0YWNoIGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gdGhpcyBhcmVhICovCisJCWlmIChidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9PSBzLT5sYWMpCisJCQlzLT5sYWMgPSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEOworCQlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBERVRBQ0hFRFxuIiwgc3Vic2NyX25hbWUocykpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9ERVRBQ0hFRCwgcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAic3Vic2NyX3VwZGF0ZSB3aXRoIHVua25vd24gcmVhc29uOiAlZFxuIiwKKwkJCXJlYXNvbik7CisJCWJyZWFrOworCX07CisJcmV0dXJuIGRiX3N5bmNfc3Vic2NyaWJlcihzKTsKK30KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlODljMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGFzIHNlZW4gYnkgdGhlIEJTQyAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworTExJU1RfSEVBRChhY3RpdmVfc3Vic2NyaWJlcnMpOwordm9pZCAqdGFsbF9zdWJzY3JfY3R4Owordm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKKworLyogZm9yIHRoZSBnc21fc3Vic2NyaWJlci5jICovCitzdHJ1Y3QgbGxpc3RfaGVhZCAqc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcih2b2lkKQoreworCXJldHVybiAmYWN0aXZlX3N1YnNjcmliZXJzOworfQorCisvKgorICogU3RydWN0IGZvciBwZW5kaW5nIGNoYW5uZWwgcmVxdWVzdHMuIFRoaXMgaXMgbWFuYWdlZCBpbiB0aGUKKyAqIGxsaXN0X2hlYWQgcmVxdWVzdHMgb2YgZWFjaCBzdWJzY3JpYmVyLiBUaGUgcmVmZXJlbmNlIGNvdW50aW5nCisgKiBzaG91bGQgd29yayBpbiBzdWNoIGEgd2F5IHRoYXQgYSBzdWJzY3JpYmVyIHdpdGggYSBwZW5kaW5nIHJlcXVlc3QKKyAqIHJlbWFpbnMgaW4gbWVtb3J5LgorICovCitzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogYmFjayByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCB0eXBlICovCisJaW50IGNoYW5uZWxfdHlwZTsKKworCS8qIHRoZSBjYWxsYmFjayBkYXRhICovCisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqcGFyYW07Cit9OworCisvKgorICogV2UgZ290IHRoZSBjaGFubmVsIGFzc2lnbmVkIGFuZCBjYW4gbm93IGhhbmQgdGhpcyBjaGFubmVsCisgKiBvdmVyIHRvIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorICovCitzdGF0aWMgaW50IHN1YnNjcl9wYWdpbmdfY2IodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqKXBhcmFtOworCisJLyogVGhlcmUgaXMgbm8gcmVxdWVzdCBhbnltb3JlLi4uICovCisJaWYgKGxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBGSVhNRTogV2hhdCB0byBkbyB3aXRoIHBhZ2luZyByZXF1ZXN0cyBjb21pbmcgZHVyaW5nCisJICogdGhpcyBjYWxsYmFjaz8gV2UgbXVzdCBiZSBzdXJlIHRvIG5vdCBzdGFydCBwYWdpbmcgd2hlbgorCSAqIHdlIGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gYSBzdWJzY3JpYmVyIGFuZCB0byBtYWtlCisJICogdGhlIHN1YnNjcl9wdXRfY2hhbm5lbCB3b3JrIGFzIHJlcXVpcmVkLi4uCisJICovCisJcmVxdWVzdCA9IChzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKilzdWJzY3ItPnJlcXVlc3RzLm5leHQ7CisJbGxpc3RfZGVsKCZyZXF1ZXN0LT5lbnRyeSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDE7CisJcmVxdWVzdC0+Y2Jmbihob29rbnVtLCBldmVudCwgbXNnLCBkYXRhLCByZXF1ZXN0LT5wYXJhbSk7CisJc3Vic2NyLT5pbl9jYWxsYmFjayA9IDA7CisKKwl0YWxsb2NfZnJlZShyZXF1ZXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByYzsKKworCWFzc2VydCghbGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKTsKKworCXJlcXVlc3QgPSAoc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICopc3Vic2NyLT5yZXF1ZXN0cy5uZXh0OworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgcmVxdWVzdC0+Y2hhbm5lbF90eXBlLAorCQkJICAgIHN1YnNjcl9wYWdpbmdfY2IsIHN1YnNjcik7CisKKwkvKiBwYWdpbmcgZmFpbGVkLCBxdWl0IG5vdyAqLworCWlmIChyYyA8PSAwKSB7CisJCXN1YnNjcl9wYWdpbmdfY2IoR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX0VYUElSRUQsCisJCQkJIE5VTEwsIE5VTEwsIHJlcXVlc3QtPnBhcmFtKTsKKwl9Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzOworCisJcyA9IHRhbGxvY196ZXJvKHRhbGxfc3Vic2NyX2N0eCwgc3RydWN0IGdzbV9zdWJzY3JpYmVyKTsKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfYWRkX3RhaWwoJnMtPmVudHJ5LCAmYWN0aXZlX3N1YnNjcmliZXJzKTsKKwlzLT51c2VfY291bnQgPSAxOworCXMtPnRtc2kgPSBHU01fUkVTRVJWRURfVE1TSTsKKworCUlOSVRfTExJU1RfSEVBRCgmcy0+cmVxdWVzdHMpOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9mcmVlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWxsaXN0X2RlbCgmc3Vic2NyLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoc3Vic2NyKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50Kys7CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJcmV0dXJuIHN1YnNjcjsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfcHV0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN1YnNjci0+dXNlX2NvdW50LS07CisJREVCVUdQKERSRUYsICJzdWJzY3IgJXMgdXNhZ2UgZGVjcmVhc2VkIHVzYWdlIHRvOiAlZFxuIiwKKwkJCXN1YnNjci0+ZXh0ZW5zaW9uLCBzdWJzY3ItPnVzZV9jb3VudCk7CisJaWYgKHN1YnNjci0+dXNlX2NvdW50IDw9IDApCisJCXN1YnNjcl9mcmVlKHN1YnNjcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlyZXF1ZXN0ID0gdGFsbG9jKHRhbGxfc3ViX3JlcV9jdHgsIHN0cnVjdCBzdWJzY3JfcmVxdWVzdCk7CisJaWYgKCFyZXF1ZXN0KSB7CisJCWlmIChjYmZuKQorCQkJY2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfT09NLAorCQkJCU5VTEwsIE5VTEwsIHBhcmFtKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2YoKnJlcXVlc3QpKTsKKwlyZXF1ZXN0LT5zdWJzY3IgPSBzdWJzY3I7CisJcmVxdWVzdC0+Y2hhbm5lbF90eXBlID0gdHlwZTsKKwlyZXF1ZXN0LT5jYmZuID0gY2JmbjsKKwlyZXF1ZXN0LT5wYXJhbSA9IHBhcmFtOworCisJLyoKKwkgKiBGSVhNRTogV2UgbWlnaHQgYmUgYWJsZSB0byBhc3NpZ24gbW9yZSB0aGFuIG9uZQorCSAqIGNoYW5uZWwsIGUuZy4gdm9pY2UgYW5kIFNNUyBzdWJtaXQgYXQgdGhlIHNhbWUKKwkgKiB0aW1lLgorCSAqLworCWlmICghc3Vic2NyLT5pbl9jYWxsYmFjayAmJiBsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpIHsKKwkJLyogYWRkIHRvIHRoZSBsaXN0LCBzZW5kIGEgcmVxdWVzdCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3Qoc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiB0aGlzIHdpbGwgYmUgcGlja2VkIHVwIGxhdGVyLCBmcm9tIHN1YnNjcl9wdXRfY2hhbm5lbCAqLworCQlsbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+ZW50cnksICZzdWJzY3ItPnJlcXVlc3RzKTsKKwl9Cit9CisKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCS8qCisJICogRklYTUU6IENvbnRpbnVlIHdpdGggb3RoZXIgcmVxdWVzdHMgbm93Li4uIGJ5IGNoZWNraW5nCisJICogdGhlIGdzbV9zdWJzY3JpYmVyIGluc2lkZSB0aGUgZ3NtX2xjaGFuLiBEcm9wIHRoZSByZWYgY291bnQKKwkgKiBvZiB0aGUgbGNoYW4gYWZ0ZXIgaGF2aW5nIGFza2VkIHRoZSBuZXh0IHJlcXVlc3RlZSB0byBoYW5kbGUKKwkgKiB0aGUgY2hhbm5lbC4KKwkgKi8KKwkvKgorCSAqIEZJWE1FOiBpcyB0aGUgbGNoYW4gaXMgb2YgYSBkaWZmZXJlbnQgdHlwZSB3ZSBjb3VsZCBzdGlsbAorCSAqIGlzc3VlIGFuIGltbWVkaWF0ZSBhc3NpZ25tZW50IGZvciBhbm90aGVyIGNoYW5uZWwgYW5kIHRoZW4KKwkgKiBjbG9zZSB0aGlzIG9uZS4KKwkgKi8KKwkvKgorCSAqIEN1cnJlbnRseSB3ZSB3aWxsIGRyb3AgdGhlIGxhc3QgcmVmIG9mIHRoZSBsY2hhbiB3aGljaAorCSAqIHdpbGwgcmVzdWx0IGluIGEgY2hhbm5lbCByZWxlYXNlIG9uIFJTTCBhbmQgd2Ugd2lsbCBzdGFydAorCSAqIHRoZSBwYWdpbmcuIFRoaXMgc2hvdWxkIHdvcmsgbW9zdCBvZiB0aGUgdGltZSBhcyB0aGUgTVMKKwkgKiB3aWxsIGxpc3RlbiB0byB0aGUgcGFnaW5nIHJlcXVlc3RzIGJlZm9yZSB3ZSB0aW1lb3V0CisJICovCisKKwlwdXRfbGNoYW4obGNoYW4pOworCisJaWYgKGxjaGFuLT5zdWJzY3IgJiYgIWxsaXN0X2VtcHR5KCZsY2hhbi0+c3Vic2NyLT5yZXF1ZXN0cykpCisJCXN1YnNjcl9zZW5kX3BhZ2luZ19yZXF1ZXN0KGxjaGFuLT5zdWJzY3IpOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFmY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpAQCAtMCwwICsxLDI5OCBAQAorLyogSGFuZG92ZXIgRGVjaXNpb24gbWFraW5nIGZvciBJbnRlci1CVFMgKEludHJhLUJTQykgSGFuZG92ZXIuICBUaGlzCisgKiBvbmx5IGltcGxlbWVudHMgdGhlIGhhbmRvdmVyIGFsZ29yaXRobS9kZWNpc2lvbiwgYnV0IG5vdCBleGVjdXRpb24KKyAqIG9mIGl0ICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9oYW5kb3Zlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorCisvKiBpc3N1ZSBoYW5kb3ZlciB0byBhIGNlbGwgaWRlbnRpZmllZCBieSBBUkZDTiBhbmQgQlNJQyAqLworc3RhdGljIGludCBoYW5kb3Zlcl90b19hcmZjbl9ic2ljKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJCSAgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpuZXdfYnRzOworCisJLyogcmVzb2x2ZSB0aGUgZ3NtX2J0cyBzdHJ1Y3R1cmUgZm9yIHRoZSBiZXN0IG5laWdoYm9yICovCisJbmV3X2J0cyA9IGdzbV9idHNfbmVpZ2hib3IobGNoYW4tPnRzLT50cngtPmJ0cywgYXJmY24sIGJzaWMpOworCWlmICghbmV3X2J0cykgeworCQlMT0dQKERITywgTE9HTF9OT1RJQ0UsICJ1bmFibGUgdG8gZGV0ZXJtaW5lIG5laWdoYm9yIEJUUyAiCisJCSAgICAgImZvciBBUkZDTiAldSBCU0lDICV1ID8hP1xuIiwgYXJmY24sIGJzaWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbmQgYWN0dWFsbHkgdHJ5IHRvIGhhbmRvdmVyIHRvIHRoYXQgY2VsbCAqLworCXJldHVybiBic2NfaGFuZG92ZXJfc3RhcnQobGNoYW4sIG5ld19idHMpOworfQorCisvKiBkaWQgd2UgZ2V0IGEgUlhMRVYgZm9yIGEgZ2l2ZW4gY2VsbCBpbiB0aGUgZ2l2ZW4gcmVwb3J0PyAqLworc3RhdGljIGludCByeGxldl9mb3JfY2VsbF9pbl9yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKworCQkvKiBzZWFyY2ggZm9yIG1hdGNoaW5nIHJlcG9ydCAqLworCQlpZiAoIShtcmMtPmFyZmNuID09IGFyZmNuICYmIG1yYy0+YnNpYyA9PSBic2ljKSkKKwkJCWNvbnRpbnVlOworCisJCW1yYy0+ZmxhZ3MgfD0gTVJDX0ZfUFJPQ0VTU0VEOworCQlyZXR1cm4gbXJjLT5yeGxldjsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIG9idGFpbiBhdmVyYWdlZCByeGxldiBmb3IgZ2l2ZW4gbmVpZ2hib3IgKi8KK3N0YXRpYyBpbnQgbmVpZ2hfbWVhc19hdmcoc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wLCBpbnQgd2luZG93KQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGF2ZyA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobm1wLT5yeGxldiksCisJCQkJbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpLAorCQkJCXdpbmRvdyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2luZG93OyBpKyspIHsKKwkJaW50IGogPSAoaWR4K2kpICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKworCQlhdmcgKz0gbm1wLT5yeGxldltqXTsKKwl9CisKKwlyZXR1cm4gYXZnIC8gd2luZG93OworfQorCisvKiBmaW5kIGVtcHR5IG9yIGV2aWN0IGJhZCBuZWlnaGJvciAqLworc3RhdGljIHN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmZpbmRfZXZpY3RfbmVpZ2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaW50IGosIHdvcnN0ID0gOTk5OTk5OworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcF93b3JzdDsKKworCS8qIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVtcHR5L3VudXNlZCBzbG90ICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQlpZiAoIW5tcC0+YXJmY24pCisJCQlyZXR1cm4gbm1wOworCX0KKworCS8qIG5vIGVtcHR5IHNsb3QgZm91bmQuIGV2aWN0IHdvcnN0IG5laWdoYm9yIGZyb20gbGlzdCAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaisrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZsY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJaW50IGF2ZyA9IG5laWdoX21lYXNfYXZnKG5tcCwgTUFYX1dJTl9ORUlHSF9BVkcpOworCQlpZiAoYXZnIDwgd29yc3QpIHsKKwkJCXdvcnN0ID0gYXZnOworCQkJbm1wX3dvcnN0ID0gbm1wOworCQl9CisJfQorCisJcmV0dXJuIG5tcF93b3JzdDsKK30KKworLyogcHJvY2VzcyBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50IHJlcG9ydHMgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVhc19uZWlnaChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlpbnQgaSwgaiwgaWR4OworCisJLyogZm9yIGVhY2ggcmVwb3J0ZWQgY2VsbCwgdHJ5IHRvIHVwZGF0ZSBnbG9iYWwgc3RhdGUgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJdW5zaWduZWQgaW50IGlkeDsKKwkJaW50IHJ4bGV2OworCisJCS8qIHNraXAgdW51c2VkIGVudHJpZXMgKi8KKwkJaWYgKCFubXAtPmFyZmNuKQorCQkJY29udGludWU7CisKKwkJcnhsZXYgPSByeGxldl9mb3JfY2VsbF9pbl9yZXAobXIsIG5tcC0+YXJmY24sIG5tcC0+YnNpYyk7CisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJaWYgKHJ4bGV2ID49IDApIHsKKwkJCW5tcC0+cnhsZXZbaWR4XSA9IHJ4bGV2OworCQkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisJCX0gZWxzZQorCQkJbm1wLT5yeGxldltpZHhdID0gMDsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwl9CisKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiByZXBvcnRlZCBjZWxscywgY2hlY2sgaWYgd2UgZGlkIG5vdAorCSAqIHByb2Nlc3MgYWxsIG9mIHRoZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcDsKKworCQlpZiAobXJjLT5mbGFncyAmIE1SQ19GX1BST0NFU1NFRCkKKwkJCWNvbnRpbnVlOworCisJCW5tcCA9IGZpbmRfZXZpY3RfbmVpZ2gobXItPmxjaGFuKTsKKworCQlubXAtPmFyZmNuID0gbXJjLT5hcmZjbjsKKwkJbm1wLT5ic2ljID0gbXJjLT5ic2ljOworCisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJbm1wLT5yeGxldltpZHhdID0gbXJjLT5yeGxldjsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisKKwkJbXJjLT5mbGFncyB8PSBNUkNfRl9QUk9DRVNTRUQ7CisJfQorfQorCisvKiBhdHRlbXB0IHRvIGRvIGEgaGFuZG92ZXIgKi8KK3N0YXRpYyBpbnQgYXR0ZW1wdF9oYW5kb3ZlcihzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG1yLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmJlc3RfY2VsbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGJlc3RfYmV0dGVyX2RiID0gMDsKKwlpbnQgaSwgcmM7CisKKwkvKiBmaW5kIHRoZSBiZXN0IGNlbGwgaW4gdGhpcyByZXBvcnQgdGhhdCBpcyBhdCBsZWFzdCBSWExFVl9IWVNUCisJICogYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgc2VydmluZyBjZWxsICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBpKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tpXTsKKwkJaW50IGF2ZywgYmV0dGVyOworCisJCS8qIHNraXAgZW1wdHkgc2xvdHMgKi8KKwkJaWYgKG5tcC0+YXJmY24gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNhY3VsYXRlIGF2ZXJhZ2UgcnhsZXYgZm9yIHRoaXMgY2VsbCBvdmVyIHRoZSB3aW5kb3cgKi8KKwkJYXZnID0gbmVpZ2hfbWVhc19hdmcobm1wLCBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gpOworCisJCS8qIGNoZWNrIGlmIGh5c3RlcmVzaXMgaXMgZnVsZmlsbGVkICovCisJCWlmIChhdmcgPCBtci0+ZGwuZnVsbC5yeF9sZXYgKyBuZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzKQorCQkJY29udGludWU7CisKKwkJYmV0dGVyID0gYXZnIC0gbXItPmRsLmZ1bGwucnhfbGV2OworCQlpZiAoYmV0dGVyID4gYmVzdF9iZXR0ZXJfZGIpIHsKKwkJCWJlc3RfY2VsbCA9IG5tcDsKKwkJCWJlc3RfYmV0dGVyX2RiID0gYmV0dGVyOworCQl9CisJfQorCisJaWYgKCFiZXN0X2NlbGwpCisJCXJldHVybiAwOworCisJTE9HUChESE8sIExPR0xfSU5GTywgIiVzOiBDZWxsIG9uIEFSRkNOICV1IGlzIGJldHRlcjogIiwKKwkJZ3NtX3RzX25hbWUobXItPmxjaGFuLT50cyksIGJlc3RfY2VsbC0+YXJmY24pOworCWlmICghbmV0LT5oYW5kb3Zlci5hY3RpdmUpIHsKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJTa2lwcGluZywgSGFuZG92ZXIgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGhhbmRvdmVyX3RvX2FyZmNuX2JzaWMobXItPmxjaGFuLCBiZXN0X2NlbGwtPmFyZmNuLCBiZXN0X2NlbGwtPmJzaWMpOworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiU3RhcnRpbmcgaGFuZG92ZXJcbiIpOworCQlicmVhazsKKwljYXNlIC1FTk9TUEM6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiTm8gY2hhbm5lbCBhdmFpbGFibGVcbiIpOworCQlicmVhazsKKwljYXNlIC1FQlVTWToKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJIYW5kb3ZlciBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1BDKERITywgTE9HTF9FUlJPUiwgIlVua25vd24gZXJyb3JcbiIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIHByb2Nlc3MgYW4gYWxyZWFkeSBwYXJzZWQgbWVhc3VyZW1lbnQgcmVwb3J0IGFuZCBkZWNpZGUgaWYgd2Ugd2FudCB0bworICogYXR0ZW1wdCBhIGhhbmRvdmVyICovCitzdGF0aWMgaW50IHByb2Nlc3NfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBtci0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlpbnQgYXZfcnhsZXY7CisKKwkvKiB3ZSBjdXJyZW50bHkgb25seSBkbyBoYW5kb3ZlciBmb3IgVENIIGNoYW5uZWxzICovCisJc3dpdGNoIChtci0+bGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcGFyc2UgYWN0dWFsIG5laWdoYm9yIGNlbGwgaW5mbyAqLworCWlmIChtci0+bnVtX2NlbGwgPiAwICYmIG1yLT5udW1fY2VsbCA8IDcpCisJCXByb2Nlc3NfbWVhc19uZWlnaChtcik7CisKKwlhdl9yeGxldiA9IGdldF9tZWFzX3JlcF9hdmcobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWExFVl9GVUxMLAorCQkJCSAgICBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcpOworCisJLyogSW50ZXJmZXJlbmNlIEhPICovCisJaWYgKHJ4bGV2MmRibShhdl9yeGxldikgPiAtODUgJiYKKwkgICAgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCQkJCSAgIDMsIDQsIDUpKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBCYWQgUXVhbGl0eSAqLworCWlmIChtZWFzX3JlcF9uX291dF9vZl9tX2JlKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJCQkJICAgMywgNCwgNSkpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIExvdyBMZXZlbCAqLworCWlmIChyeGxldjJkYm0oYXZfcnhsZXYpIDw9IC0xMTApCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIERpc3RhbmNlICovCisJaWYgKG1yLT5tc19sMS50YSA+IG5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBQb3dlciBCdWRnZXQgQUtBIEJldHRlciBDZWxsICovCisJaWYgKChtci0+bnIgJSBuZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCkgPT0gMCkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBob19kZWNfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1yOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19MQ0hBTl9NRUFTX1JFUDoKKwkJbXIgPSBzaWduYWxfZGF0YTsKKwkJcHJvY2Vzc19tZWFzX3JlcChtcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG9uX2Rzb19sb2FkX2hvX2RlYyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0xDSEFOLCBob19kZWNfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGM1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKiBIYW5kb3ZlciBMb2dpYyBmb3IgSW50ZXItQlRTIChJbnRyYS1CU0MpIEhhbmRvdmVyLiAgVGhpcyBkb2VzIG5vdAorICogYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBoYW5kb3ZlciBhbGdvcml0aG0vZGVjaXNpb24sIGJ1dCBleGVjdXRlcyBhCisgKiBoYW5kb3ZlciBkZWNpc2lvbiAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RydWN0IGJzY19oYW5kb3ZlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW47CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMzsKKworCXVfaW50OF90IGhvX3JlZjsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKGJzY19oYW5kb3ZlcnMpOworCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X25ld19sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5uZXdfbGNoYW4gPT0gbmV3X2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X29sZF9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5vbGRfbGNoYW4gPT0gb2xkX2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBIYW5kIG92ZXIgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGNoYW5uZWwgdG8gdGhlIHNwZWNpZmllZCBuZXcgQlRTLgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFjdHVhbCBoYW5kb3ZlciBhbGdvcml0aG0sCisgKiBhZnRlciBpdCBoYXMgZGVjaWRlZCBpdCB3YW50cyB0byBpbml0aWF0ZSBITyB0byBhIHNwZWNpZmljIEJUUyAqLworaW50IGJzY19oYW5kb3Zlcl9zdGFydChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCXN0YXRpYyB1X2ludDhfdCBob19yZWY7CisJaW50IHJjOworCisJLyogZG9uJ3QgYXR0ZW1wdCBtdWx0aXBsZSBoYW5kb3ZlcnMgZm9yIHRoZSBzYW1lIGxjaGFuIGF0CisJICogdGhlIHNhbWUgdGltZSAqLworCWlmIChic2NfaG9fYnlfb2xkX2xjaGFuKG9sZF9sY2hhbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlERUJVR1AoREhPLCAiKG9sZF9sY2hhbiBvbiBCVFMgJXUsIG5ldyBCVFMgJXUpXG4iLAorCQlvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGJ0cy0+bnIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpOworCisJbmV3X2xjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBvbGRfbGNoYW4tPnR5cGUpOworCWlmICghbmV3X2xjaGFuKSB7CisJCUxPR1AoREhPLCBMT0dMX05PVElDRSwgIk5vIGZyZWUgY2hhbm5lbFxuIik7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWhvID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IGJzY19oYW5kb3Zlcik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9GQVRBTCwgIk91dCBvZiBNZW1vcnlcbiIpOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwloby0+b2xkX2xjaGFuID0gb2xkX2xjaGFuOworCWhvLT5uZXdfbGNoYW4gPSBuZXdfbGNoYW47CisJaG8tPmhvX3JlZiA9IGhvX3JlZisrOworCisJLyogY29weSBzb21lIHBhcmFtZXRlcnMgZnJvbSBvbGQgbGNoYW4gKi8KKwltZW1jcHkoJm5ld19sY2hhbi0+ZW5jciwgJm9sZF9sY2hhbi0+ZW5jciwgc2l6ZW9mKG5ld19sY2hhbi0+ZW5jcikpOworCW5ld19sY2hhbi0+bXNfcG93ZXIgPSBvbGRfbGNoYW4tPm1zX3Bvd2VyOworCW5ld19sY2hhbi0+YnNfcG93ZXIgPSBvbGRfbGNoYW4tPmJzX3Bvd2VyOworCW5ld19sY2hhbi0+cnNsX2Ntb2RlID0gb2xkX2xjaGFuLT5yc2xfY21vZGU7CisJbmV3X2xjaGFuLT50Y2hfbW9kZSA9IG9sZF9sY2hhbi0+dGNoX21vZGU7CisJbmV3X2xjaGFuLT5zdWJzY3IgPSBzdWJzY3JfZ2V0KG9sZF9sY2hhbi0+c3Vic2NyKTsKKworCS8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIHRpbWluZyBhZHZhbmNlPyAqLworCXJjID0gcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obmV3X2xjaGFuLCBSU0xfQUNUX0lOVEVSX0FTWU5DLCAwLAorCQkJCSAgICAgaG8tPmhvX3JlZik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBhY3RpdmF0ZSBjaGFubmVsXG4iKTsKKwkJdGFsbG9jX2ZyZWUoaG8pOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlsbGlzdF9hZGQoJmhvLT5saXN0LCAmYnNjX2hhbmRvdmVycyk7CisJLyogd2UgY29udGludWUgaW4gdGhlIFNTX0xDSEFOIGhhbmRsZXIgLyBob19jaGFuX2FjdGl2X2FjayAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFQzMTAzIGV4cGlyZWQ6IEhhbmRvdmVyIGhhcyBmYWlsZWQgd2l0aG91dCBITyBDT01QTEVURSBvciBITyBGQUlMICovCitzdGF0aWMgdm9pZCBob19UMzEwM19jYih2b2lkICpfaG8pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG8gPSBfaG87CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBoby0+bmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisKKwlERUJVR1AoREhPLCAiSE8gVDMxMDMgZXhwaXJlZFxuIik7CisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KTsKKworCWxjaGFuX2ZyZWUoaG8tPm5ld19sY2hhbik7CisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworfQorCisvKiBSU0wgaGFzIGFja25vd2xlZGdlZCBhY3RpdmF0aW9uIG9mIHRoZSBuZXcgbGNoYW4gKi8KK3N0YXRpYyBpbnQgaG9fY2hhbl9hY3Rpdl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCWludCByYzsKKworCS8qIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGFjdGl2YXRpb24gaXMgcmVsYXRlZCB0bworCSAqIGEgaGFuZG92ZXIgYXQgYWxsIChhbmQgaWYsIHdoaWNoIHBhcnRpY3VsYXIgaGFuZG92ZXIpICovCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlERUJVR1AoREhPLCAiaGFuZG92ZXIgYWN0aXZhdGUgYWNrLCBzZW5kIEhPIENvbW1hbmRcbiIpOworCisJLyogd2UgY2FuIG5vdyBzZW5kIHRoZSAwNC4wOCBIQU5ET1ZFUiBDT01NQU5EIHRvIHRoZSBNUworCSAqIHVzaW5nIHRoZSBvbGQgbGNoYW4gKi8KKworCXJjID0gZ3NtNDhfc2VuZF9ob19jbWQoaG8tPm9sZF9sY2hhbiwgbmV3X2xjaGFuLCAwLCBoby0+aG9fcmVmKTsKKworCS8qIHN0YXJ0IFQzMTAzLiAgV2UgY2FuIGNvbnRpbnVlIGVpdGhlciB3aXRoIFQzMTAzIGV4cGlyYXRpb24sCisJICogMDQuMDggSEFORE9WRVIgQ09NUExFVEUgb3IgMDQuMDggSEFORE9WRVIgRkFJTCAqLworCWhvLT5UMzEwMy5jYiA9IGhvX1QzMTAzX2NiOworCWhvLT5UMzEwMy5kYXRhID0gaG87CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZoby0+VDMxMDMsIDEwLCAwKTsKKworCS8qIGNyZWF0ZSBhIFJUUCBjb25uZWN0aW9uICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhuZXdfbGNoYW4tPnRzLT50cngtPmJ0cykpCisJCXJzbF9pcGFjY19jcmN4KG5ld19sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUlNMIGhhcyBub3QgYWNrbm93bGVkZ2VkIGFjdGl2YXRpb24gb2YgdGhlIG5ldyBsY2hhbiAqLworc3RhdGljIGludCBob19jaGFuX2FjdGl2X25hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXRhbGxvY19mcmVlKGhvKTsKKworCS8qIEZJWE1FOiBtYXliZSB3ZSBzaG91bGQgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IExDSEFOIGhlcmU/ICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIENPTVBMRVRFIGhhcyBiZWVuIHJlY2VpdmVkIG9uIG5ldyBjaGFubmVsICovCitzdGF0aWMgaW50IGhvX2dzbTQ4X2hvX2NvbXBsKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCUxPR1AoREhPLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIEhPIGZyb20gQlRTICV1LT4ldSBvbiBBUkZDTiAiCisJICAgICAiJXUtPiV1XG4iLCBzdWJzY3JfbmFtZShoby0+b2xkX2xjaGFuLT5zdWJzY3IpLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YXJmY24sIG5ld19sY2hhbi0+dHMtPnRyeC0+YXJmY24pOworCisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpOworCisJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKKworCS8qIHVwZGF0ZSBsY2hhbiBwb2ludGVyIG9mIHRyYW5zYWN0aW9uICovCisJdHJhbnNfbGNoYW5fY2hhbmdlKGhvLT5vbGRfbGNoYW4sIG5ld19sY2hhbik7CisKKwloby0+b2xkX2xjaGFuLT5zdGF0ZSA9IExDSEFOX1NfSU5BQ1RJVkU7CisJbGNoYW5fYXV0b19yZWxlYXNlKGhvLT5vbGRfbGNoYW4pOworCisJLyogZG8gc29tZXRoaW5nIHRvIHJlLXJvdXRlIHRoZSBhY3R1YWwgc3BlZWNoIGZyYW1lcyAhICovCisKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIEZBSUwgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgaG9fZ3NtNDhfaG9fZmFpbChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X29sZF9sY2hhbihvbGRfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCk7CisKKwlic2NfZGVsX3RpbWVyKCZoby0+VDMxMDMpOworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXB1dF9sY2hhbihoby0+bmV3X2xjaGFuKTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA4LjU4IEhBTkRPVkVSIERFVEVDVCBoYXMgYmVlbiByZWNlaXZlZCAqLworc3RhdGljIGludCBob19yc2xfZGV0ZWN0KHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBGSVhNRTogZG8gd2UgYWN0dWFsbHkgd2FudCB0byBkbyBzb21ldGhpbmcgaGVyZSA/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob19pcGFjX2NyY3hfYWNrKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqb2xkX3JzLCAqbmV3X3JzLCAqb3RoZXJfcnM7CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCS8qIGl0IGlzIHBlcmZlY3RseSBub3JtYWwsIHdlIGhhdmUgQ1JDWCBldmVuIGluIG5vbi1ITyBjYXNlcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBoYW5kb3ZlciBpbiBkaXJlY3QgUlRQIG1vZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSVFAgUHJveHkgbW9kZSAqLworCW5ld19ycyA9IG5ld19sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCW9sZF9ycyA9IGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKworCWlmICghbmV3X3JzKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAibm8gUlRQIHNvY2tldCBmb3IgbmV3X2xjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhuZXdfbGNoYW4pOworCisJaWYgKCFvbGRfcnMpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJubyBSVFAgc29jZWt0IGZvciBvbGRfbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBjb3B5IHJ4X2FjdGlvbiBhbmQgcmVmZXJlbmNlIHRvIG90aGVyIHNvY2sgKi8KKwluZXdfcnMtPnJ4X2FjdGlvbiA9IG9sZF9ycy0+cnhfYWN0aW9uOworCW5ld19ycy0+dHhfYWN0aW9uID0gb2xkX3JzLT50eF9hY3Rpb247CisJbmV3X3JzLT50cmFuc21pdCA9IG9sZF9ycy0+dHJhbnNtaXQ7CisKKwlzd2l0Y2ggKGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldC0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCW90aGVyX3JzID0gb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrOworCQlydHBfc29ja2V0X3Byb3h5KG5ld19ycywgb3RoZXJfcnMpOworCQkvKiBkZWxldGUgcmVmZXJlbmNlIHRvIG90aGVyIGVuZCBzb2NrZXQgdG8gcHJldmVudAorCQkgKiBydHBfc29ja2V0X2ZyZWUoKSBmcm9tIHJlbW92aW5nIHRoZSBpbnZlcnNlIHJlZmVyZW5jZSAqLworCQlvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQluZXdfcnMtPnJlY2VpdmUgPSBvbGRfcnMtPnJlY2VpdmU7CisJCWJyZWFrOworCWNhc2UgUlRQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2xvZ2ljX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTU19MQ0hBTjoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX0FDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X2FjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9OQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfbmFjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1Q6CisJCQlyZXR1cm4gaG9fcnNsX2RldGVjdChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTDoKKwkJCXJldHVybiBob19nc200OF9ob19jb21wbChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2ZhaWwobGNoYW4pOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NfQUJJU0lQOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfQUJJU0lQX0NSQ1hfQUNLOgorCQkJcmV0dXJuIGhvX2lwYWNfY3JjeF9hY2sobGNoYW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfaG9fbG9naWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNhNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMCwwICsxLDcwMSBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgaXAuYWNjZXNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBkYXRhIHN0cnVjdHVyZSBmb3Igb25lIEUxIGludGVyZmFjZSB3aXRoIEEtYmlzICovCitzdHJ1Y3QgaWFfZTFfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGxpc3Rlbl9mZDsKKwlzdHJ1Y3QgYnNjX2ZkIHJzbF9saXN0ZW5fZmQ7CisJc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlhX2UxX2hhbmRsZSAqZTFoOworCisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwb25nW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9QT05HIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfYWNrW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9BQ0sgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9yZXFbXSA9IHsgMCwgMTcsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwgCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbF9OdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0X05hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb25fMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbl8yIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudF9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlX1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVBfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXRfSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworaW50IGlwYWNjZXNzX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisKKwkJREVCVUdQQyhETUksICIlcz0nJXMnICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJZGVjLT5sdlt0X3RhZ10ubGVuID0gdF9sZW47CisJCWRlYy0+bHZbdF90YWddLnZhbCA9IGN1cjsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZmluZF9idHNfYnlfdW5pdGlkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCSAgIHVfaW50MTZfdCBzaXRlX2lkLCB1X2ludDE2X3QgYnRzX2lkKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID09IHNpdGVfaWQgJiYKKwkJICAgIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCA9PSBidHNfaWQpCisJCQlyZXR1cm4gYnRzOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VuaXRpZChjb25zdCBjaGFyICpzdHIsIHVfaW50MTZfdCAqc2l0ZV9pZCwgdV9pbnQxNl90ICpidHNfaWQsCisJCQl1X2ludDE2X3QgKnRyeF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKmVuZHB0cjsKKwljb25zdCBjaGFyICpucHRyOworCisJbnB0ciA9IHN0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdGVfaWQpCisJCSpzaXRlX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnRzX2lkKQorCQkqYnRzX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRyeF9pZCkKKwkJKnRyeF9pZCA9IHVsICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbmQgdGhlIGlkIGFjayAqLworaW50IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGludCBmZCkKK3sKKwlyZXR1cm4gd3JpdGUoZmQsIGlkX2Fjaywgc2l6ZW9mKGlkX2FjaykpOworfQorCitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoaW50IGZkKQoreworCXJldHVybiB3cml0ZShmZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7Cit9CisKKy8qIGJhc2UgaGFuZGxpbmcgb2YgdGhlIGlwLmFjY2VzcyBwcm90b2NvbCAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csCisJCQkgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfUElORzoKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgcG9uZywgc2l6ZW9mKHBvbmcpKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfUE9ORzoKKwkJREVCVUdQKERNSSwgIlBPTkchXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9hY2soYmZkLT5mZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19yY3Ztc2coc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHRsdl9wYXJzZWQgdGx2cDsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCXVfaW50MTZfdCBzaXRlX2lkID0gMCwgYnRzX2lkID0gMCwgdHJ4X2lkID0gMDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogaGFuZGxlIGJhc2UgbWVzc2FnZXMgKi8KKwlpcGFjY2Vzc19yY3Ztc2dfYmFzZShtc2csIGJmZCk7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfSURfUkVTUDoKKwkJREVCVUdQKERNSSwgIklEX1JFU1AgIik7CisJCS8qIHBhcnNlIHRhZ3MsIHNlYXJjaCBmb3IgVW5pdCBJRCAqLworCQlpcGFjY2Vzc19pZHRhZ19wYXJzZSgmdGx2cCwgKHVfaW50OF90ICopbXNnLT5sMmggKyAyLAorCQkJCSBtc2diX2wybGVuKG1zZyktMik7CisJCURFQlVHUChETUksICJcbiIpOworCisJCWlmICghVExWUF9QUkVTRU5UKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpKQorCQkJYnJlYWs7CisKKwkJLyogbG9va3VwIEJUUywgY3JlYXRlIHNpZ25fbGluaywgLi4uICovCisJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAorCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CisJCWJ0cyA9IGZpbmRfYnRzX2J5X3VuaXRpZChlMWgtPmdzbW5ldCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFidHMpIHsKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBmaW5kIEJUUyBjb25maWd1cmF0aW9uIGZvciAiCisJCQkgICAgICAgIiAldS8ldS8ldSwgZGlzY29ubmVjdGluZ1xuIiwgc2l0ZV9pZCwgYnRzX2lkLAorCQkJCXRyeF9pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCWlmIChiZmQtPnByaXZfbnIgPT0gMSkgeworCQkJYnRzLT5vbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoJmxpbmUtPnRzWzEtMV0sCisJCQkJCQkgIEUxSU5QX1NJR05fT01MLCBidHMtPmMwLAorCQkJCQkJICBidHMtPm9tbF90ZWksIDApOworCQl9IGVsc2UgaWYgKGJmZC0+cHJpdl9uciA9PSAyKSB7CisJCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwkJCXN0cnVjdCBic2NfZmQgKm5ld2JmZDsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X2lkKTsKKwkJCQorCQkJYmZkLT5kYXRhID0gbGluZSA9IGJ0cy0+b21sX2xpbmstPnRzLT5saW5lOworCQkJZTFpX3RzID0gJmxpbmUtPnRzWzIrdHJ4X2lkIC0gMV07CisJCQluZXdiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJCQllMWlucF90c19jb25maWcoZTFpX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJCQl0cngtPnJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShlMWlfdHMsCisJCQkJCQkJRTFJTlBfU0lHTl9SU0wsIHRyeCwKKwkJCQkJCQl0cngtPnJzbF90ZWksIDApOworCQkJLyogZ2V0IHJpZCBvZiBvdXIgb2xkIHRlbXBvcmFyeSBiZmQgKi8KKwkJCW1lbWNweShuZXdiZmQsIGJmZCwgc2l6ZW9mKCpuZXdiZmQpKTsKKwkJCW5ld2JmZC0+cHJpdl9uciA9IDIrdHJ4X2lkOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWJzY19yZWdpc3Rlcl9mZChuZXdiZmQpOworCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT01MX1VQCQkweDAwMDEKKyNkZWZpbmUgUlNMX1VQCQkweDAwMDIKKworLyoKKyAqIHJlYWQgb25lIGlwYSBtZXNzYWdlIGZyb20gdGhlIHNvY2tldAorICogcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJWQgJXNcbiIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwkvKiB0aGVuIHJlYWQgdGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiBoZWFkZXIgKi8KKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCWxlbiA9IG50b2hzKGhoLT5sZW4pOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5sMmgsIGxlbiwgMCk7CisJaWYgKHJldCA8IGxlbikgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJzaG9ydCByZWFkIVxuIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQgPSAwLCBlcnJvcjsKKworCW1zZyA9IGlwYWNjZXNzX3JlYWRfbXNnKGJmZCwgJmVycm9yKTsKKwlpZiAoIW1zZykgeworCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsoZTFpX3RzLCBJUEFDX1BST1RPX09NTCwgMCk7CisJCQlpZiAobGluaykgeworCQkJCWxpbmstPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgPSAwOworCQkJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJCVFMgJXUgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iLAorCQkJCQlsaW5rLT50cngtPmJ0cy0+bnIpOworCQkJfSBlbHNlCisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgInVua25vd24gQlRTIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIik7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fUlNMKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19PTUwpOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlERUJVR1AoRE1JLCAiUlggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2diX2wyKG1zZyksIG1zZ2JfbDJsZW4obXNnKSkpOworCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCWlmIChoaC0+cHJvdG8gPT0gSVBBQ19QUk9UT19JUEFDQ0VTUykgeworCQlyZXQgPSBpcGFjY2Vzc19yY3Ztc2cobGluZSwgbXNnLCBiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCAwLCBJUEFDX1BST1RPX1JTTCk7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fT01MKTsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQljbG9zZShiZmQtPmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJfQorCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogQklHIEZBVCBXQVJOSU5HOiBiZmQgbWlnaHQgbm8gbG9uZ2VyIGV4aXN0IGhlcmUsIHNpbmNlIGlwYWNjZXNzX3Jjdm1zZygpCisJICogbWlnaHQgaGF2ZSBmcmVlJ2QgaXQgISEhICovCisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGhoLT5wcm90bywgMCk7CisJaWYgKCFsaW5rKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIm5vIG1hdGNoaW5nIHNpZ25hbGxpbmcgbGluayBmb3IgIgorCQkJImhoLT5wcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT50cnggPSBsaW5rLT50cng7CisKKwlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucikpKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gKFJTTF9VUCA8PCBtc2ctPnRyeC0+bnIpOworCQl9CisJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiBPTUxfVVApKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gT01MX1VQOworCQl9CisJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIElQLmFjY2VzcyBwcm90b2NvbCBwcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgcHJvdG8pCit7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCisJLyogcHJlcGVuZCB0aGUgaXAuYWNjZXNzIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqaGgpKTsKKwloaC0+bGVuID0gaHRvbnMobXNnLT5sZW4gLSBzaXplb2YoKmhoKSk7CisJaGgtPnByb3RvID0gcHJvdG87Cit9CisKK3N0YXRpYyBpbnQgdHNfd2FudF93cml0ZShzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cykKK3sKKwllMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBwcm90bzsKKwlpbnQgcmV0OworCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJbXNnID0gZTFpbnBfdHhfdHMoZTFpX3RzLCAmc2lnbl9saW5rKTsKKwlpZiAoIW1zZykgeworCQkvKiBubyBtZXNzYWdlIGFmdGVyIHR4IGRlbGF5IHRpbWVyICovCisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc2lnbl9saW5rLT50eXBlKSB7CisJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX09NTDsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX1JTTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7IC8qIGNvbWUgYmFjayBmb3IgbW9yZSBtc2cgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIobXNnLCBzaWduX2xpbmstPnRlaSk7CisKKwlERUJVR1AoRE1JLCAiVFggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDApOworCW1zZ2JfZnJlZShtc2cpOworCisJLyogc2V0IHR4IGRlbGF5IHRpbWVyIGZvciBuZXh0IGV2ZW50ICovCisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmNiID0gdGltZW91dF90czFfd3JpdGU7CisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmRhdGEgPSBlMWlfdHM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZlMWlfdHMtPnNpZ24udHhfdGltZXIsIDAsIDEwMDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJaW50IHJjID0gMDsKKworCS8qIEluIGNhc2Ugb2YgZWFybHkgUlNMIHdlIG1pZ2h0IG5vdCB5ZXQgaGF2ZSBhIGxpbmUgKi8KKworCWlmIChsaW5lKQorIAkJZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisKKwlpZiAoIWxpbmUgfHwgZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwl9IGVsc2UKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0cnVjdCBlMWlucF9kcml2ZXIgaXBhY2Nlc3NfZHJpdmVyID0geworCS5uYW1lID0gImlwLmFjY2VzcyIsCisJLndhbnRfd3JpdGUgPSB0c193YW50X3dyaXRlLAorfTsKKworLyogY2FsbGJhY2sgb2YgdGhlIE9NTCBsaXN0ZW5pbmcgZmlsZWRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByZXQ7CisJaW50IGlkeCA9IDA7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IE9NTCBsaW5rIGZyb20gJXNcbiIsCisJCWluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkgeworCQljbG9zZShyZXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKwkvL2xpbmUtPmRyaXZlcl9kYXRhID0gZTFoOworCS8qIGNyZWF0ZSB2aXJydHVhbCBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwliZmQtPmZkID0gcmV0OworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gMTsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGxpbmUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoYmZkLT5mZCk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitzdGF0aWMgaW50IHJzbF9saXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlpbnQgcmV0OworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwliZmQgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfZmQpOworCWlmICghYmZkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNvbWUgQlRTIGhhcyBjb25uZWN0ZWQgdG8gdXMsIGJ1dCB3ZSBkb24ndCBrbm93IHlldCB3aGljaCBsaW5lCisJICogKGFzIGNyZWF0ZWQgYnkgdGhlIE9NTCBsaW5rKSB0byBhc3NvY2lhdGUgaXQgd2l0aC4gIFRodXMsIHdlCisJICogYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYmZkIHVudGlsIHdlIGhhdmUgcmVjZWl2ZWQgSUQgZnJvbSBCVFMgKi8KKworCWJmZC0+ZmQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIGJmZC0+ZmQ7CisJfQorCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJhY2NlcHQoKWVkIG5ldyBSU0wgbGluayBmcm9tICVzXG4iLCBpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKwliZmQtPnByaXZfbnIgPSAyOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2Vfc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKwkKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCS8vYmZkLT5kYXRhID0gbGluZTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCQorCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXJfbGlzdGVuX2ZkIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJUUy4gIEN1cnJlbnRseSB1c2VkIGJ5IGlwYWNjZXNzLWNvbmZpZy5jICovCitpbnQgaXBhY2Nlc3NfY29ubmVjdChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IHNvY2thZGRyX2luICpzYSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1swXTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBsaW5lOworCWJmZC0+cHJpdl9uciA9IDE7CisKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNyZWF0ZSBUQ1Agc29ja2V0LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCQorCWxpbmUtPmRyaXZlciA9ICZpcGFjY2Vzc19kcml2ZXI7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpCit7CisJaW50IHJldDsKKworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCS8qIEZJWE1FOiBkbyB0aGlzIGluIHRoZSBwbHVnaW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24gKi8KKwlyZXQgPSBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoJmlwYWNjZXNzX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWUxaCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlhX2UxX2hhbmRsZSk7CisJaWYgKCFlMWgpCisJCXJldHVybiAtRU5PTUVNOworCisJZTFoLT5nc21uZXQgPSBnc21uZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9PTUwsIGxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5yc2xfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfUlNMLCByc2xfbGlzdGVuX2ZkX2NiKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkzMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpAQCAtMCwwICsxLDUzNiBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgbUlTRE51c2VyICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG1JU0ROaWYuaD4KKworLy8jZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworLy8jaW5jbHVkZSA8Y29tcGF0X2FmX2lzZG4uaD4KKyNpZm5kZWYgQUZfSVNETgorI2RlZmluZSBBRl9JU0ROIDM0CisjZGVmaW5lIFBGX0lTRE4gQUZfSVNETgorI2VuZGlmCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIFRTMV9BTExPQ19TSVpFCTMwMAorCitzdHJ1Y3QgcHJpbV9uYW1lIHsKKwl1bnNpZ25lZCBpbnQgcHJpbTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworY29uc3Qgc3RydWN0IHByaW1fbmFtZSBwcmltX25hbWVzW10gPSB7CisJeyBQSF9DT05UUk9MX0lORCwgIlBIX0NPTlRST0xfSU5EIiB9LAorCXsgUEhfREFUQV9JTkQsICJQSF9EQVRBX0lORCIgfSwKKwl7IFBIX0RBVEFfQ05GLCAiUEhfREFUQV9DTkYiIH0sCisJeyBQSF9BQ1RJVkFURV9JTkQsICJQSF9BQ1RJVkFURV9JTkQiIH0sCisJeyBETF9FU1RBQkxJU0hfSU5ELCAiRExfRVNUQUJMSVNIX0lORCIgfSwKKwl7IERMX0VTVEFCTElTSF9DTkYsICJETF9FU1RBQkxJU0hfQ05GIiB9LAorCXsgRExfUkVMRUFTRV9JTkQsICJETF9SRUxFQVNFX0lORCIgfSwKKwl7IERMX1JFTEVBU0VfQ05GLCAiRExfUkVMRUFTRV9DTkYiIH0sCisJeyBETF9EQVRBX0lORCwgIkRMX0RBVEFfSU5EIiB9LAorCXsgRExfVU5JVERBVEFfSU5ELCAiRExfVU5JVERBVEFfSU5EIiB9LAorCXsgRExfSU5GT1JNQVRJT05fSU5ELCAiRExfSU5GT1JNQVRJT05fSU5EIiB9LAorCXsgTVBIX0FDVElWQVRFX0lORCwgIk1QSF9BQ1RJVkFURV9JTkQiIH0sCisJeyBNUEhfREVBQ1RJVkFURV9JTkQsICJNUEhfREVBQ1RJVkFURV9JTkQiIH0sCit9OworCitjb25zdCBjaGFyICpnZXRfcHJpbV9uYW1lKHVuc2lnbmVkIGludCBwcmltKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJpbV9uYW1lcyk7IGkrKykgeworCQlpZiAocHJpbV9uYW1lc1tpXS5wcmltID09IHByaW0pCisJCQlyZXR1cm4gcHJpbV9uYW1lc1tpXS5uYW1lOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhUUzFfQUxMT0NfU0laRSwgIm1JU0ROIFRTMSIpOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBsMmFkZHI7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJc29ja2xlbl90IGFsZW47CisJaW50IHJldDsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnLT5kYXRhOworCisJYWxlbiA9IHNpemVvZihsMmFkZHIpOworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMzAwLCAwLAorCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmbDJhZGRyLCAmYWxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWN2ZnJvbSBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGFsZW4gIT0gc2l6ZW9mKGwyYWRkcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBlcnJvciBsZW5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJREVCVUdQKERNSSwgImFsZW4gPSVkLCBkZXYoJWQpIGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWFsZW4sIGwyYWRkci5kZXYsIGwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisKKwlERUJVR1AoRE1JLCAiPD0gbGVuID0gJWQsIHByaW0oMHgleCkgaWQoMHgleCk6ICVzXG4iLAorCQlyZXQsIGhoLT5wcmltLCBoaC0+aWQsIGdldF9wcmltX25hbWUoaGgtPnByaW0pKTsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIERMX0lORk9STUFUSU9OX0lORDoKKwkJLyogbUlTRE4gdGVsbHMgdXMgd2hpY2ggY2hhbm5lbCBudW1iZXIgaXMgYWxsb2NhdGVkIGZvciB0aGlzCisJCSAqIHR1cGxlIG9mIChTQVBJLCBURUkpLiAqLworCQlERUJVR1AoRE1JLCAiRExfSU5GT1JNQVRJT05fSU5EOiB1c2UgY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKSBmb3Igbm93XG4iLAorCQkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsoZTFpX3RzLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWlmICghbGluaykgeworCQkJREVCVUdQQyhETUksICJtSVNETiBtZXNzYWdlIGZvciB1bmtub3duIHNpZ25fbGlua1xuIik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIHNhdmUgdGhlIGNoYW5uZWwgbnVtYmVyIGluIHRoZSBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3QgKi8KKwkJbGluay0+ZHJpdmVyLm1pc2RuLmNoYW5uZWwgPSBsMmFkZHIuY2hhbm5lbDsKKwkJYnJlYWs7CisJY2FzZSBETF9FU1RBQkxJU0hfSU5EOgorCQlERUJVR1AoRE1JLCAiRExfRVNUQUJMSVNIX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJcmV0ID0gZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX1VQLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgRExfUkVMRUFTRV9JTkQ6CisJCURFQlVHUChETUksICJETF9SRUxFQVNFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJcmV0ID0gZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgRExfREFUQV9JTkQ6CisJY2FzZSBETF9VTklUREFUQV9JTkQ6CisJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTUlTRE5fSEVBREVSX0xFTjsKKwkJREVCVUdQKERNSSwgIlJYOiAlc1xuIiwgaGV4ZHVtcChtc2diX2wyKG1zZyksIHJldCAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKwkJcmV0ID0gZTFpbnBfcnhfdHMoZTFpX3RzLCBtc2csIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJCURFQlVHUChETUksICJQSF9BQ1RJVkFURV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWJyZWFrOworCWNhc2UgUEhfREVBQ1RJVkFURV9JTkQ6CisJCURFQlVHUChETUksICJQSF9ERUFDVElWQVRFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHNfd2FudF93cml0ZShzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cykKK3sKKwkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkgKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCSAqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1RSQVUpCisJCXJldHVybiAwOworCisJZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF90czFfd3JpdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IChzdHJ1Y3QgZTFpbnBfdHMgKilkYXRhOworCisJLyogdHJpZ2dlciB3cml0ZSBvZiB0czEsIGR1ZSB0byB0eCBkZWxheSB0aW1lciAqLworCXRzX3dhbnRfd3JpdGUoZTFpX3RzKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBzYTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXVfaW50OF90ICpsMl9kYXRhOworCWludCByZXQ7CisKKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwltc2cgPSBlMWlucF90eF90cyhlMWlfdHMsICZzaWduX2xpbmspOworCWlmICghbXNnKSB7CisJCS8qIG5vIG1lc3NhZ2UgYWZ0ZXIgdHggZGVsYXkgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbDJfZGF0YSA9IG1zZy0+ZGF0YTsKKworCS8qIHByZXBlbmQgdGhlIG1JU0ROaGVhZCAqLworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpoaCkpOworCWhoLT5wcmltID0gRExfREFUQV9SRVE7CisKKwlERUJVR1AoRE1JLCAiVFggVEVJKCVkKSBTQVBJKCVkKTogJXNcbiIsIHNpZ25fbGluay0+dGVpLAorCQlzaWduX2xpbmstPnNhcGksIGhleGR1bXAobDJfZGF0YSwgbXNnLT5sZW4gLSBNSVNETl9IRUFERVJfTEVOKSk7CisKKwkvKiBjb25zdHJ1Y3QgdGhlIHNvY2thZGRyICovCisJc2EuZmFtaWx5ID0gQUZfSVNETjsKKwlzYS5zYXBpID0gc2lnbl9saW5rLT5zYXBpOworCXNhLmRldiA9IHNpZ25fbGluay0+dGVpOworCXNhLmNoYW5uZWwgPSBzaWduX2xpbmstPmRyaXZlci5taXNkbi5jaGFubmVsOworCisJcmV0ID0gc2VuZHRvKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDAsCisJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJldCA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXMgc2VuZHRvIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwkvKiBzZXQgdHggZGVsYXkgdGltZXIgZm9yIG5leHQgZXZlbnQgKi8KKwllMWlfdHMtPnNpZ24udHhfdGltZXIuY2IgPSB0aW1lb3V0X3RzMV93cml0ZTsKKwllMWlfdHMtPnNpZ24udHhfdGltZXIuZGF0YSA9IGUxaV90czsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgNTAwMDApOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBCQ0hBTl9UWF9HUkFOCTE2MAorLyogd3JpdGUgdG8gYSBCIGNoYW5uZWwgVFMgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RzWF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXVfaW50OF90IHR4X2J1ZltCQ0hBTl9UWF9HUkFOICsgc2l6ZW9mKCpoaCldOworCXN0cnVjdCBzdWJjaF9tdXggKm14ID0gJmUxaV90cy0+dHJhdS5tdXg7CisJaW50IHJldDsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgdHhfYnVmOworCWhoLT5wcmltID0gUEhfREFUQV9SRVE7CisKKwlzdWJjaGFuX211eF9vdXQobXgsIHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTik7CisKKwlERUJVR1AoRE1JQiwgIkJDSEFOIFRYOiAlc1xuIiwKKwkJaGV4ZHVtcCh0eF9idWYrc2l6ZW9mKCpoaCksIEJDSEFOX1RYX0dSQU4pKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgdHhfYnVmLCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4sIDApOworCWlmIChyZXQgPCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pCisJCURFQlVHUChETUlCLCAic2VuZCByZXR1cm5zICVkIGluc3RlYWQgb2YgJWx1XG4iLCByZXQsCisJCQlzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisvKiBGSVhNRTogcmVhZCBmcm9tIGEgQiBjaGFubmVsIFRTICovCitzdGF0aWMgaW50IGhhbmRsZV90c1hfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAibUlTRE4gVFN4Iik7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJaW50IHJldDsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnLT5kYXRhOworCisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIFRTWF9BTExPQ19TSVpFLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlpZiAoaGgtPnByaW0gIT0gUEhfQ09OVFJPTF9JTkQpCisJCURFQlVHUChETUlCLCAiPD0gQkNIQU4gbGVuID0gJWQsIHByaW0oMHgleCkgaWQoMHgleCk6ICVzXG4iLAorCQkJcmV0LCBoaC0+cHJpbSwgaGgtPmlkLCBnZXRfcHJpbV9uYW1lKGhoLT5wcmltKSk7CisKKwlzd2l0Y2ggKGhoLT5wcmltKSB7CisJY2FzZSBQSF9EQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JQiwgIkJDSEFOIFJYOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnYl9sMihtc2cpLCByZXQgLSBNSVNETl9IRUFERVJfTEVOKSk7CisJCXJldCA9IGUxaW5wX3J4X3RzKGUxaV90cywgbXNnLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJY2FzZSBQSF9EQVRBX0NORjoKKwkJLyogcGh5c2ljYWwgbGF5ZXIgaW5kaWNhdGVzIHRoYXQgZGF0YSBoYXMgYmVlbiBzZW50LAorCQkgKiB3ZSB0aHVzIGNhbiBzZW5kIHNvbWUgbW9yZSBkYXRhICovCisJCXJldCA9IGhhbmRsZV90c1hfd3JpdGUoYmZkKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJLyogRklYTUU6IHdoeSBkbyB3ZSBmcmVlIHNpZ25hbGxpbmcgbXNncyBpbiB0aGUgY2FsbGVyLCBhbmQgdHJhdSBub3Q/ICovCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgbWlzZG5fZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzMV9yZWFkKGJmZCk7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQkJcmMgPSBoYW5kbGVfdHMxX3dyaXRlKGJmZCk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHNYX3JlYWQoYmZkKTsKKwkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJCSAqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZhdGVfYmNoYW4oc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCB0cywgaW50IGFjdCkKK3sKKwlzdHJ1Y3QgbUlTRE5oZWFkIGhoOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQ7CisKKwlmcHJpbnRmKHN0ZG91dCwgImFjdGl2YXRlIGJjaGFuXG4iKTsKKwlpZiAoYWN0KQorCQloaC5wcmltID0gUEhfQUNUSVZBVEVfUkVROworCWVsc2UKKwkJaGgucHJpbSA9IFBIX0RFQUNUSVZBVEVfUkVROworCisJaGguaWQgPSBNSVNETl9JRF9BTlk7CisJcmV0ID0gc2VuZHRvKGJmZC0+ZmQsICZoaCwgc2l6ZW9mKGhoKSwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJjb3VsZCBub3Qgc2VuZCBBQ1RJVkFURV9SUSAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGUxaW5wX2RyaXZlciBtaXNkbl9kcml2ZXIgPSB7CisJLm5hbWUgPSAibUlTRE51c2VyIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCitzdGF0aWMgaW50IG1pX2UxX3NldHVwKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlpbnQgdHMsIHJldDsKKworCS8qIFRTMCBpcyBDUkM0LCBkb24ndCBuZWVkIGFueSBmZCBmb3IgaXQgKi8KKwlmb3IgKHRzID0gMTsgdHMgPCBOVU1fRTFfVFM7IHRzKyspIHsKKwkJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKwkJc3RydWN0IHNvY2thZGRyX21JU0ROIGFkZHI7CisKKwkJYmZkLT5kYXRhID0gbGluZTsKKwkJYmZkLT5wcml2X25yID0gdHM7CisJCWJmZC0+Y2IgPSBtaXNkbl9mZF9jYjsKKworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfTk9ORToKKwkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfTEFQRF9OVCk7CisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJCWJmZC0+ZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0JfUkFXKTsKKwkJCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAJCSogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkgCQkqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBiZmQtPmZkOworCQl9CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLmZhbWlseSA9IEFGX0lTRE47CisJCWFkZHIuZGV2ID0gbGluZS0+bnVtOworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJCWFkZHIuY2hhbm5lbCA9IDA7CisJCQkvKiBTQVBJIG5vdCBzdXBwb3J0ZWQgeWV0IGluIGtlcm5lbCAqLworCQkJLy9hZGRyLnNhcGkgPSBlMWlucF90cy0+c2lnbi5zYXBpOworCQkJYWRkci5zYXBpID0gMDsKKwkJCWFkZHIudGVpID0gR1JPVVBfVEVJOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYWRkci5jaGFubmVsID0gdHM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChETUksICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlOiAldVxuIiwKKwkJCQllMWlfdHMtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQkJcmV0ID0gaW9jdGwoYmZkLT5mZCwgSU1DTEVBUl9MMiwgJnJlbGVhc2VfbDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNQ0xFQU5fTDIgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogb25seSBhY3RpdmF0ZSBCLUNoYW5uZWxzIG9uY2Ugd2Ugc3RhcnQgdG8KKwkJICogdXNlIHRoZW0gdG8gY29uc2VydmUgQ1BVIHBvd2VyICovCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9UUkFVKQorCQkJYWN0aXZhdGVfYmNoYW4obGluZSwgdHMsIDEpOworCisJCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkQ6ICVzXG4iLAorCQkJCXN0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWlfZTFfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJc3RydWN0IG1JU0ROX2RldmluZm8gZGV2aW5mbzsKKwlpbnQgc2ssIHJldCwgY250OworCisJaWYgKCFsaW5lLT5kcml2ZXIpIHsKKwkJLyogdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB1cGRhdGUgKi8KKwkJbGluZS0+ZHJpdmVyID0gJm1pc2RuX2RyaXZlcjsKKwl9IGVsc2UgeworCQkvKiB0aGlzIGlzIGEgc3Vic2VxdWVudCB1cGRhdGUgKi8KKwkJLyogRklYTUU6IGZpcnN0IGNsb3NlIGFsbCBzb2NrZXRzICovCisJCWZwcmludGYoc3RkZXJyLCAiaW5jcmVtZW50YWwgbGluZSB1cGRhdGVzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpbmUtPmRyaXZlciAhPSAmbWlzZG5fZHJpdmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9wZW4gdGhlIElTRE4gY2FyZCBkZXZpY2UgKi8KKwlzayA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzayA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBjb3VsZCBub3Qgb3BlbiBzb2NrZXQgJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHNrOworCX0KKworCXJldCA9IGlvY3RsKHNrLCBJTUdFVENPVU5ULCAmY250KTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3IgZ2V0dGluZyBpbnRlcmYgY291bnQ6ICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8vREVCVUdQKERNSSwiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKwlwcmludGYoIiVkIGRldmljZSVzIGZvdW5kXG4iLCBjbnQsIChjbnQ9PTEpPyIiOiJzIik7CisjaWYgMQorCWRldmluZm8uaWQgPSBsaW5lLT5udW07CisJcmV0ID0gaW9jdGwoc2ssIElNR0VUREVWSU5GTywgJmRldmluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiZXJyb3IgZ2V0dGluZyBpbmZvIGZvciBkZXZpY2UgJWQ6ICVzXG4iLAorCQkJbGluZS0+bnVtLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIGlkOiAgICAgICAgICAgICAlZFxuIiwgZGV2aW5mby5pZCk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIERwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkRwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBCcHJvdG9jb2xzOiAgICAgJTA4eFxuIiwgZGV2aW5mby5CcHJvdG9jb2xzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgcHJvdG9jb2w6ICAgICAgICVkXG4iLCBkZXZpbmZvLnByb3RvY29sKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgbnJiY2hhbjogICAgICAgICVkXG4iLCBkZXZpbmZvLm5yYmNoYW4pOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBuYW1lOiAgICAgICAgICAgJXNcbiIsIGRldmluZm8ubmFtZSk7CisjZW5kaWYKKworCWlmICghKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9OVF9FMSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhcmQgaXMgbm90IG9mIHR5cGUgRTEgKE5ULW1vZGUpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbWlfZTFfc2V0dXAobGluZSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQoreworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCWUxaW5wX2RyaXZlcl9yZWdpc3RlcigmbWlzZG5fZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmZTQ0MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jCkBAIC0wLDAgKzEsNzI5IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBjb25maWd1cmF0aW9uIHRvb2wgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAwOSBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RhdGljIGludCBuZXRfbGlzdGVuX3Rlc3RucjsKK3N0YXRpYyBpbnQgcmVzdGFydDsKK3N0YXRpYyBjaGFyICpwcmltX29tbF9pcDsKK3N0YXRpYyBjaGFyICp1bml0X2lkOworc3RhdGljIHVfaW50MTZfdCBudl9mbGFnczsKK3N0YXRpYyB1X2ludDE2X3QgbnZfbWFzazsKK3N0YXRpYyBjaGFyICpzb2Z0d2FyZSA9IE5VTEw7CitzdGF0aWMgaW50IHN3X2xvYWRfc3RhdGUgPSAwOworc3RhdGljIGludCBvbWxfc3RhdGUgPSAwOworc3RhdGljIGludCBkdW1wX2ZpbGVzID0gMDsKKworc3RydWN0IHN3X2xvYWQgeworCXVfaW50OF90IGZpbGVfaWRbMjU1XTsKKwl1X2ludDhfdCBmaWxlX2lkX2xlbjsKKworCXVfaW50OF90IGZpbGVfdmVyc2lvblsyNTVdOworCXVfaW50OF90IGZpbGVfdmVyc2lvbl9sZW47Cit9OworCitzdGF0aWMgdm9pZCAqdGFsbF9jdHhfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqc3dfbG9hZDEgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzd19sb2FkICpzd19sb2FkMiA9IE5VTEw7CisKKy8qCitzdGF0aWMgdV9pbnQ4X3QgcHJpbV9vbWxfYXR0cltdID0geyAweDk1LCAweDAwLCA3LCAweDg4LCAxOTIsIDE2OCwgMTAwLCAxMSwgMHgwMCwgMHgwMCB9Oworc3RhdGljIHVfaW50OF90IHVuaXRfaWRfYXR0cltdID0geyAweDkxLCAweDAwLCA5LCAnMicsICczJywgJzQnLCAnMicsICcvJyAsICcwJywgJy8nLCAnMCcsIDB4MDAgfTsKKyovCisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NCisgKgorICogQ3VycmVudGx5IHdlIHNlbmQgdGhlIGNvbmZpZyByZXF1ZXN0cyBidXQgZG9uJ3QgY2hlY2sgdGhlCisgKiByZXN1bHQuIFRoZSBuYW5vQlRTIHdpbGwgc2VuZCB1cyBhIE5BQ0sgd2hlbiB3ZSBkaWQgc29tZXRoaW5nIHRoZQorICogQlRTIGRpZG4ndCBsaWtlLgorICovCitzdGF0aWMgaW50IGlwYWNjX21zZ19uYWNrKHVfaW50OF90IG10KQoreworCWZwcmludGYoc3RkZXJyLCAiRmFpbHVyZSB0byBzZXQgYXR0cmlidXRlLiBUaGlzIHNlZW1zIGZhdGFsXG4iKTsKKwlleGl0KC0xKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFjY19tc2dfYWNrKHVfaW50OF90IG10LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWlmIChzd19sb2FkX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgbmV3IHNvZnR3YXJlIGlzIGFjdGl2YWVkLlxuIik7CisKKwkJaWYgKHJlc3RhcnQpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCQl9IGVsc2UgeworCQkJZXhpdCgwKTsKKwkJfQorCX0gZWxzZSBpZiAob21sX3N0YXRlID09IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJTZXQgdGhlIHByaW1hcnkgT01MIElQLlxuIik7CisJCWlmIChyZXN0YXJ0KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKKwkJfSBlbHNlIHsKKwkJCWV4aXQoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSB7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQ4X3QgYXJmY247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXBhY2NfY3VzYWdlX2VsZW0geworCXVfaW50MTZfdCBhcmZjbjoxMCwKKwkJICByeGxldjo2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgdGVzdF9yZXAodm9pZCAqX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gX21zZzsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQxNl90IHRlc3RfcmVwX2xlbiwgZmVycl9saXN0X2xlbjsKKwlzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICppZmU7CisJc3RydWN0IGlwYWNfYmNjaF9pbmZvIGJpbmZvOworCWludCBpLCByYzsKKworCURFQlVHUChETk0sICJURVNUIFJFUE9SVDogIik7CisKKwlpZiAoZm9oLT5kYXRhWzBdICE9IE5NX0FUVF9URVNUX05PIHx8CisJICAgIGZvaC0+ZGF0YVsyXSAhPSBOTV9BVFRfVEVTVF9SRVBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUdQQyhETk0sICJ0ZXN0X25vPTB4JTAyeCAiLCBmb2gtPmRhdGFbMV0pOworCS8qIGRhdGFbMl0gPT0gTk1fQVRUX1RFU1RfUkVQT1JUICovCisJLyogZGF0YVszLi40XTogdGVzdF9yZXBfbGVuICovCisJdGVzdF9yZXBfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVszXSk7CisJLyogZGF0YVs1XTogaXAuYWNjZXNzIHRlc3QgcmVzdWx0ICovCisJREVCVUdQQyhETk0sICJ0ZXN0X3Jlcz0lc1xuIiwgaXBhY2NfdGVzdHJlc19uYW1lKGZvaC0+ZGF0YVs1XSkpOworCisJLyogZGF0YVs2XTogaXAuYWNjZXNzIG5lc3RlZCBJRS4gMyA9PSBmcmVxX2Vycl9saXN0ICovCisJc3dpdGNoIChmb2gtPmRhdGFbNl0pIHsKKwljYXNlIE5NX0lQQUNfRUlFX0ZSRVFfRVJSX0xJU1Q6CisJCS8qIGRhdGFbNy4uOF06IGxlbmd0aCBvZiBmZXJyX2xpc3QgKi8KKwkJZmVycl9saXN0X2xlbiA9IG50b2hzKCoodV9pbnQxNl90ICopICZmb2gtPmRhdGFbN10pOworCisJCS8qIGRhdGFbOS4uLl06IGZyZXF1ZW5jeSBlcnJvciBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gc2l6ZW9mKCppZmUpKSB7CisJCQlpZmUgPSAoc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSAqKSAoZm9oLT5kYXRhICsgOSArIGkpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIEZyZXF1ZW5jeSBFcnJvciAlNmhkXG4iLAorCQkJaWZlLT5hcmZjbiwgbnRvaHMoaWZlLT5mcmVxX2VycikpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogY2hhbm5lbCB1c2FnZSBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gMikgeworCQkJdV9pbnQxNl90ICpjdV9wdHIgPSAodV9pbnQxNl90ICopKGZvaC0+ZGF0YSArIDkgKyBpKTsKKwkJCXVfaW50MTZfdCBjdSA9IG50b2hzKCpjdV9wdHIpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIFJ4TGV2ICUydVxuIiwKKwkJCQljdSAmIDB4M2ZmLCBjdSA+PiAxMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk9fVFlQRToKKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk86CisJCXJjID0gaXBhY19wYXJzZV9iY2NoX2luZm8oJmJpbmZvLCBmb2gtPmRhdGErNik7CisJCWlmIChyYyA8IDApIHsKKwkJCURFQlVHUChETk0sICJCQ0NIIEluZm8gcGFyc2luZyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAldSwgUnhMZXYgJTJ1LCBSeFF1YWwgJTJ1OiAlM2QtJWQsIExBQyAlZCBDSSAlZFxuIiwKKwkJCWJpbmZvLmFyZmNuLCBiaW5mby5yeF9sZXYsIGJpbmZvLnJ4X3F1YWwsCisJCQliaW5mby5jZ2kubWNjLCBiaW5mby5jZ2kubW5jLAorCQkJYmluZm8uY2dpLmxhYywgYmluZm8uY2dpLmNpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm1fc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhICppcGFjY19kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTk1fSVBBQ0NfTkFDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX25hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUpOworCWNhc2UgU19OTV9JUEFDQ19BQ0s6CisJCWlwYWNjX2RhdGEgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIGlwYWNjX21zZ19hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUsIGlwYWNjX2RhdGEtPmJ0cyk7CisJY2FzZSBTX05NX1RFU1RfUkVQOgorCQlyZXR1cm4gdGVzdF9yZXAoc2lnbmFsX2RhdGEpOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJcHJpbnRmKCJUaGUgQlRTIGhhcyBhY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIG5hY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBBQklTIE9NTCBjb2RlICovCitzdGF0aWMgaW50IHBlcmNlbnQ7CitzdGF0aWMgaW50IHBlcmNlbnRfb2xkOworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqX21zZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChob29rICE9IEdTTV9IT09LX05NX1NXTE9BRCkKKwkJcmV0dXJuIDA7CisKKwlidHMgPSAoc3RydWN0IGdzbV9idHMgKikgZGF0YTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZnByaW50ZihzdGRlcnIsICJMT0FEIEVORCBBQ0suLi4iKTsKKwkJLyogbm93IG1ha2UgaXQgdGhlIGRlZmF1bHQgKi8KKwkJc3dfbG9hZF9zdGF0ZSA9IDE7CisKKwkJbXNnID0gbXNnYl9hbGxvYygxMDI0LCAic3c6IG52YXR0ciIpOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCW1zZy0+bDNoID0gJm1zZy0+bDJoWzNdOworCisJCS8qIGFjdGl2YXRlIHNvZnR3YXJlICovCisJCWlmIChzd19sb2FkMSkgeworCQkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzd19sb2FkMS0+ZmlsZV9pZF9sZW4sIHN3X2xvYWQxLT5maWxlX2lkKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3dfbG9hZDEtPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkJCXN3X2xvYWQxLT5maWxlX3ZlcnNpb24pOworCQl9CisKKwkJaWYgKHN3X2xvYWQyKSB7CisJCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3X2xvYWQyLT5maWxlX2lkX2xlbiwgc3dfbG9hZDItPmZpbGVfaWQpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzd19sb2FkMi0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCQkJc3dfbG9hZDItPmZpbGVfdmVyc2lvbik7CisJCX0KKworCQkvKiBmaWxsIGluIHRoZSBkYXRhICovCisJCW1zZy0+bDJoWzBdID0gTk1fQVRUX0lQQUNDX0NVUl9TV19DRkc7CisJCW1zZy0+bDJoWzFdID0gbXNnYl9sM2xlbihtc2cpID4+IDg7CisJCW1zZy0+bDJoWzJdID0gbXNnYl9sM2xlbihtc2cpICYgMHhmZjsKKwkJcHJpbnRmKCJGb28gbDJoOiAlcCBsM2g6ICVwLi4uIGxlbmd0aCBsMjogJXUgIGwzOiAldVxuIiwgbXNnLT5sMmgsIG1zZy0+bDNoLCBtc2diX2wybGVuKG1zZyksIG1zZ2JfbDNsZW4obXNnKSk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCWV4aXQoMyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCWV4aXQoNCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoYnRzKTsKKwkJaWYgKHBlcmNlbnQgPiBwZXJjZW50X29sZCkKKwkJCXByaW50ZigiU29mdHdhcmUgRG93bmxvYWQgUHJvZ3Jlc3M6ICVkJSVcbiIsIHBlcmNlbnQpOworCQlwZXJjZW50X29sZCA9IHBlcmNlbnQ7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogTG9hZCBhYm9ydGVkIGJ5IHRoZSBCVFMuXG4iKTsKKwkJZXhpdCg2KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb20oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgbGVuOworCXN0YXRpYyB1X2ludDhfdCBidWZbMTAyNF07CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXByaW50ZigiT01MIGxpbmsgZXN0YWJsaXNoZWRcbiIpOworCisJaWYgKHVuaXRfaWQpIHsKKwkJbGVuID0gc3RybGVuKHVuaXRfaWQpOworCQlpZiAobGVuID4gc2l6ZW9mKGJ1ZiktMTApCisJCQlyZXR1cm47CisJCWJ1ZlswXSA9IE5NX0FUVF9JUEFDQ19VTklUX0lEOworCQlidWZbMV0gPSAobGVuKzEpID4+IDg7CisJCWJ1ZlsyXSA9IChsZW4rMSkgJiAweGZmOworCQltZW1jcHkoYnVmKzMsIHVuaXRfaWQsIGxlbik7CisJCWJ1ZlszK2xlbl0gPSAwOworCQlwcmludGYoInNldHRpbmcgVW5pdCBJRCB0byAnJXMnXG4iLCB1bml0X2lkKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIGJ1ZiwgMytsZW4rMSk7CisJfQorCWlmIChwcmltX29tbF9pcCkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQlpZiAoIWluZXRfYXRvbihwcmltX29tbF9pcCwgJmlhKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIElQIGFkZHJlc3M6ICVzXG4iLAorCQkJCXByaW1fb21sX2lwKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIDB4ODggKyBJUCArIHBvcnQgKi8KKwkJbGVuID0gMSArIHNpemVvZihpYSkgKyAyOworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSAweDg4OworCQltZW1jcHkoY3VyLCAmaWEsIHNpemVvZihpYSkpOworCQljdXIgKz0gc2l6ZW9mKGlhKTsKKwkJKmN1cisrID0gMDsKKwkJKmN1cisrID0gMDsKKwkJcHJpbnRmKCJzZXR0aW5nIHByaW1hcnkgT01MIGxpbmsgSVAgdG8gJyVzJ1xuIiwgaW5ldF9udG9hKGlhKSk7CisJCW9tbF9zdGF0ZSA9IDE7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBidWYsIDMrbGVuKTsKKwl9CisJaWYgKG52X21hc2spIHsKKwkJbGVuID0gNDsKKworCQkqY3VyKysgPSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M7CisJCSpjdXIrKyA9IChsZW4pID4+IDg7CisJCSpjdXIrKyA9IChsZW4pICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgJiAweGZmOworCQkqY3VyKysgPSBudl9tYXNrICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgPj4gODsKKwkJKmN1cisrID0gbnZfbWFzayA+PiA4OworCQlwcmludGYoInNldHRpbmcgTlYgRmxhZ3MvTWFzayB0byAweCUwNHgvMHglMDR4XG4iLAorCQkJbnZfZmxhZ3MsIG52X21hc2spOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbik7CisJfQorCisJaWYgKHJlc3RhcnQgJiYgIXByaW1fb21sX2lwICYmICFzb2Z0d2FyZSkgeworCQlwcmludGYoInJlc3RhcnRpbmcgQlRTXG4iKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KGJ0cyk7CisJfQorCit9CisKK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBFVlRfRTFfVEVJX1VQOgorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCWJvb3RzdHJhcF9vbSh0cngtPmJ0cyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCS8qIEZJWE1FICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJZnByaW50ZihzdGRlcnIsICJMb3N0IHNvbWUgRTEgVEVJIGxpbmtcbiIpOworCQkvKiBGSVhNRTogZGVhbCB3aXRoIFRFSSBvciBMMSBsaW5rIGxvc3MgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJaWYgKGV2dCA9PSBFVlRfU1RBVEVDSEdfT1BFUiAmJgorCSAgICBvYmpfY2xhc3MgPT0gTk1fT0NfUkFESU9fQ0FSUklFUiAmJgorCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSAzKSB7CisJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gb2JqOworCisJCWlmIChuZXRfbGlzdGVuX3Rlc3RucikgeworCQkJdV9pbnQ4X3QgcGh5c19jb25maWdbXSA9IHsgMHgwMiwgMHgwYSwgMHgwMCwgMHgwMSwgMHgwMiB9OworCQkJYWJpc19ubV9wZXJmb3JtX3Rlc3QodHJ4LT5idHMsIDIsIDAsIDAsIDB4ZmYsCisJCQkJCSAgICAgbmV0X2xpc3Rlbl90ZXN0bnIsIDEsCisJCQkJCSAgICAgcGh5c19jb25maWcsIHNpemVvZihwaHlzX2NvbmZpZykpOworCQl9IGVsc2UgaWYgKHNvZnR3YXJlKSB7CisJCQlpbnQgcmM7CisJCQlwcmludGYoIkF0dGVtcHRpbmcgc29mdHdhcmUgdXBsb2FkIHdpdGggJyVzJ1xuIiwgc29mdHdhcmUpOworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQodHJ4LT5idHMsIHNvZnR3YXJlLCAxOSwgMCwgc3dsb2FkX2NiZm4sIHRyeC0+YnRzKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzdGFydCBzb2Z0d2FyZSBsb2FkXG4iKTsKKwkJCQlleGl0KC0zKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzd19sb2FkICpjcmVhdGVfc3dsb2FkKHN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHN3X2xvYWQgKmxvYWQ7CisKKwlsb2FkID0gdGFsbG9jX3plcm8odGFsbF9jdHhfY29uZmlnLCBzdHJ1Y3Qgc3dfbG9hZCk7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV9pZCwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQsIDIwKTsKKwlsb2FkLT5maWxlX2lkX2xlbiA9IHN0cmxlbihoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCkgKyAxOworCisJc3RybmNweSgoY2hhciAqKWxvYWQtPmZpbGVfdmVyc2lvbiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24sIDIwKTsKKwlsb2FkLT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby52ZXJzaW9uKSArIDE7CisKKwlyZXR1cm4gbG9hZDsKK30KKworc3RhdGljIGludCBmaW5kX3N3X2xvYWRfcGFyYW1zKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCisJZW50cnkgPSB0YWxsb2NfemVybyh0YWxsX2Zpcm1fY3R4LCBzdHJ1Y3QgbGxpc3RfaGVhZCk7CisJSU5JVF9MTElTVF9IRUFEKGVudHJ5KTsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaGVhZGVyLCBlbnRyeSwgZW50cnkpIHsKKwkJaWYgKG50b2hzKGhlYWRlci0+ZmlybXdhcmVfaW5mby5tb3JlX21vcmVfbWFnaWMpID09IDB4MTAwMCkgeworCQkJc3dfbG9hZDEgPSBjcmVhdGVfc3dsb2FkKGhlYWRlcik7CisJCX0gZWxzZSBpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgyMDAxKSB7CisJCQlzd19sb2FkMiA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfQorCX0KKworCWlmICghc3dfbG9hZDEgfHwgIXN3X2xvYWQyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRGlkIG5vdCBmaW5kIGRhdGEuXG4iKTsKKwkJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJCXJldHVybiAtMTsKKyAgICAgICAgfQorCisJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZW50cnkoc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqc3ViX2VudHJ5LCBpbnQgcGFydCwgaW50IGZkKQoreworCWludCBvdXRfZmQ7CisJaW50IGNvcGllZDsKKwljaGFyIGZpbGVuYW1lWzQwOTZdOworCW9mZl90IHRhcmdldDsKKworCWlmICghZHVtcF9maWxlcykKKwkJcmV0dXJuOworCisJaWYgKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEgPT0gMCkKKwkJcmV0dXJuOworCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJwYXJ0LiVkIiwgcGFydCsrKTsKKwlvdXRfZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQsIDA2NjApOworCWlmIChvdXRfZmQgPCAwKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBkdW1wIGZpcm13YXJlIik7CisJCXJldHVybjsKKwl9CisKKwl0YXJnZXQgPSBzdWJfZW50cnktPmFic29sdXRlX29mZnNldCArIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnN0YXJ0KSArIDQ7CisJaWYgKGxzZWVrKGZkLCB0YXJnZXQsIFNFRUtfU0VUKSAhPSB0YXJnZXQpIHsKKwkJcGVycm9yKCJzZWVrIGZhaWxlZCIpOworCQljbG9zZShvdXRfZmQpOworCQlyZXR1cm47CisJfQorCisJZm9yIChjb3BpZWQgPSAwOyBjb3BpZWQgPCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpOyArK2NvcGllZCkgeworCQljaGFyIGM7CisJCWlmIChyZWFkKGZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigiY29weSBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdyaXRlKG91dF9mZCwgJmMsIHNpemVvZihjKSkgIT0gc2l6ZW9mKGMpKSB7CisJCQlwZXJyb3IoIndyaXRlIGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljbG9zZShvdXRfZmQpOworfQorCitzdGF0aWMgdm9pZCBhbmFseXplX2Zpcm13YXJlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBmZDsKKwl2b2lkICp0YWxsX2Zpcm1fY3R4ID0gMDsKKwlpbnQgcGFydCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJcHJpbnRmKCJPcGVuaW5nIHBvc3NpYmxlIGZpcm13YXJlICclcydcbiIsIGZpbGVuYW1lKTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIWZkKSB7CisJCXBlcnJvcigibmFkYSIpOworCQlyZXR1cm47CisJfQorCisJLyogdmVyaWZ5IHRoZSBmaWxlICovCisJaWYgKGZzdGF0KGZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJDYW4gbm90IHN0YXQgdGhlIGZpbGUiKTsKKwkJcmV0dXJuOworCX0KKworCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgc3RhdC5zdF9zaXplLCAwLCBlbnRyeSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlwcmludGYoIlByaW50aW5nIGhlYWRlciBpbmZvcm1hdGlvbjpcbiIpOworCQlwcmludGYoIm1vcmVfbW9yZV9tYWdpYzogMHgleFxuIiwgbnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykpOworCQlwcmludGYoImhlYWRlcl9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uaGVhZGVyX2xlbmd0aCkpOworCQlwcmludGYoImZpbGVfbGVuZ3RoOiAldVxuIiwgbnRvaGwoaGVhZGVyLT5maXJtd2FyZV9pbmZvLmZpbGVfbGVuZ3RoKSk7CisJCXByaW50Zigic3dfcGFydDogJS4yMHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KTsKKwkJcHJpbnRmKCJ0ZXh0MTogJS42NHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50ZXh0MSk7CisJCXByaW50ZigidGltZTogJS4xMnNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50aW1lKTsKKwkJcHJpbnRmKCJkYXRlOiAlLjE0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLmRhdGUpOworCQlwcmludGYoInRleHQyOiAlLjEwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQyKTsKKwkJcHJpbnRmKCJ2ZXJzaW9uOiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pOworCQlwcmludGYoInN1Yml0ZW1zLi4uXG4iKTsKKworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJfZW50cnksICZoZWFkZXItPmhlYWRlcl9saXN0LCBlbnRyeSkgeworCQkJcHJpbnRmKCJcdHNvbWV0aGluZzE6ICV1XG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zb21ldGhpbmcxKTsKKwkJCXByaW50ZigiXHR0ZXh0MTogJS42NHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnRleHQxKTsKKwkJCXByaW50ZigiXHR0aW1lOiAlLjEyc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGltZSk7CisJCQlwcmludGYoIlx0ZGF0ZTogJS4xNHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LmRhdGUpOworCQkJcHJpbnRmKCJcdHRleHQyOiAlLjEwc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDIpOworCQkJcHJpbnRmKCJcdHZlcnNpb246ICUuMjBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS52ZXJzaW9uKTsKKwkJCXByaW50ZigiXHRsZW5ndGg6ICV1XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpKTsKKwkJCXByaW50ZigiXHRhZGRyMTogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjEpKTsKKwkJCXByaW50ZigiXHRhZGRyMjogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjIpKTsKKwkJCXByaW50ZigiXHRzdGFydDogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpKTsKKwkJCXByaW50ZigiXHRhYnMuIG9mZnNldDogMHglbHhcbiIsIHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0KTsKKwkJCXByaW50ZigiXG5cbiIpOworCisJCQlkdW1wX2VudHJ5KHN1Yl9lbnRyeSwgcGFydCsrLCBmZCk7CisJCX0KKwkJcHJpbnRmKCJcblxuIik7CisJfQorCisJaWYgKGNsb3NlKGZkKSAhPSAwKSB7CisJCXBlcnJvcigiQ2xvc2UgZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoIlVzYWdlOiBpcGFjY2Vzcy1jb25maWdcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJcHJpbnRmKCIgIC11IC0tdW5pdC1pZCBVTklUX0lEXG4iKTsKKwlwcmludGYoIiAgLW8gLS1vbWwtaXAgaXBcbiIpOworCXByaW50ZigiICAtciAtLXJlc3RhcnRcbiIpOworCXByaW50ZigiICAtbiBmbGFncy9tYXNrXHRTZXQgTlZSQU0gYXR0cmlidXRlcy5cbiIpOworCXByaW50ZigiICAtbCAtLWxpc3RlbiB0ZXN0bnIgXHRQZXJmb3JtIHNwZWNpZmllZCB0ZXN0IG51bWJlclxuIik7CisJcHJpbnRmKCIgIC1oIC0taGVscCB0aGlzIHRleHRcbiIpOworCXByaW50ZigiICAtcyAtLXN0cmVhbS1pZCBJRFxuIik7CisJcHJpbnRmKCIgIC1kIC0tc29mdHdhcmUgZmlybXdhcmVcbiIpOworCXByaW50ZigiICAtZiAtLWZpcm13YXJlIGZpcm13YXJlIFByb3ZpZGUgZmlybXdhcmUgaW5mb3JtYXRpb25cbiIpOworCXByaW50ZigiICAtdyAtLXdyaXRlLWZpcm13YXJlLiBUaGlzIHdpbGwgZHVtcCB0aGUgZmlybXdhcmUgcGFydHMgdG8gdGhlIGZpbGVzeXN0ZW0uIFVzZSB3aXRoIC1mLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHJjLCBvcHRpb25faW5kZXggPSAwLCBzdHJlYW1faWQgPSAweGZmOworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlkZWJ1Z19zZXRfbG9nX2xldmVsKHN0ZGVycl90YXJnZXQsIDApOworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkROTSwwIik7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJcHJpbnRmKCJpcGFjY2Vzcy1jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwkJY2hhciAqc2xhc2g7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAidW5pdC1pZCIsIDEsIDAsICd1JyB9LAorCQkJeyAib21sLWlwIiwgMSwgMCwgJ28nIH0sCisJCQl7ICJyZXN0YXJ0IiwgMCwgMCwgJ3InIH0sCisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJsaXN0ZW4iLCAxLCAwLCAnbCcgfSwKKwkJCXsgInN0cmVhbS1pZCIsIDEsIDAsICdzJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImZpcm13YXJlIiwgMSwgMCwgJ2YnIH0sCisJCQl7ICJ3cml0ZS1maXJtd2FyZSIsIDAsIDAsICd3JyB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAidTpvOnJuOmw6aHM6ZDpmOnciLCBsb25nX29wdGlvbnMsCisJCQkJJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndSc6CisJCQl1bml0X2lkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJcHJpbV9vbWxfaXAgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZXN0YXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNsYXNoID0gc3RyY2hyKG9wdGFyZywgJy8nKTsKKwkJCWlmICghc2xhc2gpCisJCQkJZXhpdCgyKTsKKwkJCXVsID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCW52X2ZsYWdzID0gdWwgJiAweGZmZmY7CisJCQl1bCA9IHN0cnRvdWwoc2xhc2grMSwgTlVMTCwgMTYpOworCQkJbnZfbWFzayA9IHVsICYgMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbmV0X2xpc3Rlbl90ZXN0bnIgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzdHJlYW1faWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzb2Z0d2FyZSA9IHN0cmR1cChvcHRhcmcpOworCQkJaWYgKGZpbmRfc3dfbG9hZF9wYXJhbXMob3B0YXJnKSAhPSAwKQorCQkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlhbmFseXplX2Zpcm13YXJlKG9wdGFyZyk7CisJCQlleGl0KDApOworCQljYXNlICd3JzoKKwkJCWR1bXBfZmlsZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9OworCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAieW91IGhhdmUgdG8gc3BlY2lmeSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgQlRTLiBVc2UgLS1oZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlnc21uZXQgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghZ3NtbmV0KQorCQlleGl0KDEpOworCisJYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9OQU5PQlRTLCBIQVJEQ09ERURfVFNDLAorCQkJCUhBUkRDT0RFRF9CU0lDKTsKKwkvKiBpcC5hY2Nlc3Mgc3VwcG9ydHMgdXAgdG8gNCBjaGFpbmVkIFRSWCAqLworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWJ0cy0+b21sX3RlaSA9IHN0cmVhbV9pZDsKKwkKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKwlwcmludGYoIlRyeWluZyB0byBjb25uZWN0IHRvIGlwLmFjY2VzcyBCVFMgLi4uXG4iKTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihhcmd2W29wdGluZF0sICZzaW4uc2luX2FkZHIpOworCXJjID0gaWFfY29uZmlnX2Nvbm5lY3QoYnRzLCAmc2luKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRXJyb3IgY29ubmVjdGluZyB0byB0aGUgQlRTIik7CisJCWV4aXQoMSk7CisJfQorCQorCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmOGEyZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYwpAQCAtMCwwICsxLDIwOCBAQAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWwgTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdCBOYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uIDEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb24gMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnQgVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZSBWZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQIEFkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQyBBZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0IElEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK3N0YXRpYyBpbnQgdWRwX3NvY2soY29uc3QgY2hhciAqaWZuYW1lKQoreworCWludCBmZCwgcmMsIGJjID0gMTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJaWYgKGlmbmFtZSkgeworCQlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgaWZuYW1lLAorCQkJCXN0cmxlbihpZm5hbWUpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXJjID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwgJmJjLCBzaXplb2YoYmMpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworI2lmIDAKKwkvKiB3ZSBjYW5ub3QgYmluZCwgc2luY2UgdGhlIHJlc3BvbnNlIHBhY2tldHMgZG9uJ3QgY29tZSBmcm9tCisJICogdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyYyA9IGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworI2VuZGlmCQkKKwlyZXR1cm4gZmQ7CisKK2VycjoKKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyIGZpbmRfcGt0W10gPSB7IDB4MDAsIDB4MGIrOCwgSVBBQ19QUk9UT19JUEFDQ0VTUywgMHgwMCwgCisJCQkJSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0lQQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCisKK3N0YXRpYyBpbnQgYmNhc3RfZmluZChpbnQgZmQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyZXR1cm4gc2VuZHRvKGZkLCBmaW5kX3BrdCwgc2l6ZW9mKGZpbmRfcGt0KSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsIHNpemVvZihzYSkpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Jlc3BvbnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisJCQorCQlwcmludGYoIiVzPSclcycgICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yZXNwb25zZShpbnQgZmQpCit7CisJdW5zaWduZWQgY2hhciBidWZbMjU1XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJaW50IGxlbjsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWxlbiA9IHJlY3Zmcm9tKGZkLCBidWYsIHNpemVvZihidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmc2FfbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKworCS8qIDIgYnl0ZXMgbGVuZ3RoLCAxIGJ5dGUgcHJvdG9jb2wgKDB4ZmUpICovCisJaWYgKGJ1ZlsyXSAhPSAweGZlKQorCQlyZXR1cm4gMDsKKworCWlmIChidWZbNF0gIT0gSVBBQ19NU0dUX0lEX1JFU1ApCisJCXJldHVybiAwOworCisJcmV0dXJuIHBhcnNlX3Jlc3BvbnNlKGJ1Zis2LCBsZW4tNik7Cit9CisKK3N0YXRpYyBpbnQgYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlyZXR1cm4gcmVhZF9yZXNwb25zZShiZmQtPmZkKTsKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiBiY2FzdF9maW5kKGJmZC0+ZmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSBfZGF0YTsKKworCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyLCA1LCAwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBic2NfZmQgYmZkOworCWNoYXIgKmlmbmFtZTsKKwlpbnQgcmM7CisKKwlwcmludGYoImlwYWNjZXNzLWZpbmQgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRvdXQsICJ5b3UgbWlnaHQgbmVlZCB0byBzcGVjaWZ5IHRoZSBvdXRnb2luZ1xuIgorCQkJIiBuZXR3b3JrIGludGVyZmFjZSwgZS5nLiBgYCVzIGV0aDAnJ1xuIiwgYXJndlswXSk7CisJfQorCisJaWZuYW1lID0gYXJndlsxXTsKKwliZmQuY2IgPSBiZmRfY2I7CisJYmZkLndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQuZmQgPSB1ZHBfc29jayhpZm5hbWUpOworCWlmIChiZmQuZmQgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IGNyZWF0ZSBsb2NhbCBzb2NrZXQgZm9yIGJyb2FkY2FzdCB1ZHAiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlic2NfcmVnaXN0ZXJfZmQoJmJmZCk7CisKKwl0aW1lci5jYiA9IHRpbWVyX2NiOworCXRpbWVyLmRhdGEgPSAmYmZkOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lciwgNSwgMCk7CisKKwlwcmludGYoIlRyeWluZyB0byBmaW5kIGlwLmFjY2VzcyBCVFMgYnkgYnJvYWRjYXN0IFVEUC4uLlxuIik7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0MGMxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIFJvdXRpbmVzIGZvciBwYXJzaW5nIGFuIGlwYWNjZXMgU0RQIGZpcm13YXJlIGZpbGUgKi8KKworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBQQVJUX0xFTkdUSCAxMzgKKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9oZWFkZXJfZW50cnkpID09IDEzOCwgcmlnaHRfZW50cnkpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9maXJtd2FyZSkgPT0gMTU4LCBfcmlnaHRfaGVhZGVyX2xlbmd0aCk7CisKKy8qIG1vcmUgbWFnaWMsIHRoZSBzZWNvbmQgImludCIgaW4gdGhlIGhlYWRlciAqLworc3RhdGljIGNoYXIgbW9yZV9tYWdpY1tdID0geyAweDEwLCAweDAyIH07CisKK2ludCBpcGFjY2Vzc19hbmFseXplX2ZpbGUoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgc3Rfc2l6ZSwgY29uc3QgdW5zaWduZWQgaW50IGJhc2Vfb2Zmc2V0LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlICpmaXJtd2FyZV9oZWFkZXIgPSAwOworCXN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXI7CisJY2hhciBidWZbNDA5Nl07CisJaW50IHJjLCBpOworCXVfaW50MTZfdCB0YWJsZV9zaXplOworCXVfaW50MTZfdCB0YWJsZV9vZmZzZXQ7CisJb2ZmX3QgdGFibGVfc3RhcnQ7CisKKworCXJjID0gcmVhZChmZCwgYnVmLCBzaXplb2YoKmZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IHJlYWQgaGVhZGVyIHN0YXJ0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmlybXdhcmVfaGVhZGVyID0gKHN0cnVjdCBzZHBfZmlybXdhcmUgKikgJmJ1ZlswXTsKKwlpZiAoc3RybmNtcChmaXJtd2FyZV9oZWFkZXItPm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtYWdpYy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1lbWNtcChmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWMsIG1vcmVfbWFnaWMsIDIpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtb3JlIG1hZ2ljLiBHb3Q6IDB4JXggJXggJXggJXhcbiIsCisJCQlmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMF0gJiAweGZmLCBmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMV0gJiAweGZmLAorCQkJZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzJdICYgMHhmZiwgZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzNdICYgMHhmZik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXItPmZpbGVfbGVuZ3RoKSAhPSBzdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIGZpbGVzaXplIGFuZCB0aGUgaGVhZGVyIGRvIG5vdCBtYXRjaC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWRkIHRoZSBmaXJtd2FyZSAqLworCWhlYWRlciA9IHRhbGxvY196ZXJvKGxpc3QsIHN0cnVjdCBzZHBfaGVhZGVyKTsKKwloZWFkZXItPmZpcm13YXJlX2luZm8gPSAqZmlybXdhcmVfaGVhZGVyOworCUlOSVRfTExJU1RfSEVBRCgmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisJbGxpc3RfYWRkKCZoZWFkZXItPmVudHJ5LCBsaXN0KTsKKworCXRhYmxlX29mZnNldCA9IG50b2hzKGZpcm13YXJlX2hlYWRlci0+dGFibGVfb2Zmc2V0KTsKKwl0YWJsZV9zdGFydCA9IGxzZWVrKGZkLCB0YWJsZV9vZmZzZXQsIFNFRUtfQ1VSKTsKKwlpZiAodGFibGVfc3RhcnQgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc2VlayB0byB0aGUgcmVsIHBvc2l0aW9uOiAweCV4XG4iLCB0YWJsZV9vZmZzZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJlYWQoZmQsICZ0YWJsZV9zaXplLCBzaXplb2YodGFibGVfc2l6ZSkpICE9IHNpemVvZih0YWJsZV9zaXplKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSB0YWJsZSBzaXplIGNvdWxkIG5vdCBiZSByZWFkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0YWJsZV9zaXplID0gbnRvaHModGFibGVfc2l6ZSk7CisKKwlpZiAodGFibGVfc2l6ZSAlIFBBUlRfTEVOR1RIICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgcGFydCBsZW5ndGggc2VlbXMgdG8gYmUgd3Jvbmc6IDB4JXhcbiIsIHRhYmxlX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogbG9vayBpbnRvIGVhY2ggZmlybXdhcmUgbm93ICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemUgLyBQQVJUX0xFTkdUSDsgKytpKSB7CisJCXN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IGVudHJ5OworCQlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpoZWFkZXJfZW50cnk7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSB0YWJsZV9zdGFydCArIDI7CisJCW9mZnNldCArPSBpICogMTM4OworCisJCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3Qgc2VlayB0byB0aGUgb2Zmc2V0OiAldS5cbiIsIG9mZnNldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyYyA9IHJlYWQoZmQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJCWlmIChyYyAhPSBzaXplb2YoZW50cnkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgcmVhZCB0aGUgaGVhZGVyIGVudHJ5LlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQloZWFkZXJfZW50cnkgPSB0YWxsb2NfemVybyhoZWFkZXIsICBzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtKTsKKwkJaGVhZGVyX2VudHJ5LT5oZWFkZXJfZW50cnkgPSBlbnRyeTsKKwkJaGVhZGVyX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQgPSBiYXNlX29mZnNldDsKKwkJbGxpc3RfYWRkKCZoZWFkZXJfZW50cnktPmVudHJ5LCAmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisKKwkJLyogbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgU0RQIGZpbGUuLi4gKi8KKwkJb2Zmc2V0ID0gbnRvaGwoZW50cnkuc3RhcnQpICsgNCArIGJhc2Vfb2Zmc2V0OworCQlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJcGVycm9yKCJjYW4ndCBzZWVrIHRvIHNkcCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKworCQlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIG50b2hsKGVudHJ5Lmxlbmd0aCksIG9mZnNldCwgbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2UwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCkBAIC0wLDAgKzEsMTEyNyBAQAorLyogT3BlbkJTQyBBYmlzL0lQIHByb3h5IGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBvbmUgaW5zdGFuY2Ugb2YgYW4gaXAuYWNjZXNzIHByb3RvY29sIHByb3h5ICovCitzdHJ1Y3QgaXBhX3Byb3h5IHsKKwkvKiBzb2NrZXQgd2hlcmUgd2UgbGlzdGVuIGZvciBpbmNvbWluZyBPTUwgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgYnNjX2ZkIG9tbF9saXN0ZW5fZmQ7CisJLyogc29ja2V0IHdoZXJlIHdlIGxpc3RlbiBmb3IgaW5jb21pbmcgUlNMIGZyb20gQlRTICovCisJc3RydWN0IGJzY19mZCByc2xfbGlzdGVuX2ZkOworCS8qIGxpc3Qgb2YgQlRTJ3MgKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBidHNfbGlzdDsKKwkvKiB0aGUgQlNDIHJlY29ubmVjdCB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJlY29ubl90aW1lcjsKK307CisKKy8qIGdsb2JhbCBwb2ludGVyIHRvIHRoZSBwcm94eSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5ICppcHA7CisKK3N0cnVjdCBpcGFfcHJveHlfY29ubiB7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICpidHNfY29ubjsKK307CisKKyNkZWZpbmUgTUFYX1RSWCA0CisKKy8qIHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIEJUUyBpbiBvdXIgcHJveHkgKi8KK3N0cnVjdCBpcGFfYnRzX2Nvbm4geworCS8qIGxpc3Qgb2YgQlRTJ3MgKGlwYV9wcm94eS0+YnRzX2xpc3QpICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwkvKiBiYWNrIHBvaW50ZXIgdG8gdGhlIHByb3h5IHdoaWNoIHdlIGJlbG9uZyB0byAqLworCXN0cnVjdCBpcGFfcHJveHkgKmlwcDsKKwkvKiB0aGUgdW5pdCBJRCBhcyBkZXRlcm1pbmVkIGJ5IENDTSAqLworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzaXRlX2lkOworCQl1X2ludDE2X3QgYnRzX2lkOworCX0gdW5pdF9pZDsKKworCS8qIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gQlRTICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpvbWxfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKnJzbF9jb25uW01BWF9UUlhdOworCisJLyogb3V0Z29pbmcgY29ubmVjdGlvbnMgdG8gQlNDICovCisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2Nfb21sX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfcnNsX2Nvbm5bTUFYX1RSWF07CisKKwkvKiBVRFAgc29ja2V0cyBmb3IgQlRTIGFuZCBCU0MgaW5qZWN0aW9uICovCisJc3RydWN0IGJzY19mZCB1ZHBfYnRzX2ZkOworCXN0cnVjdCBic2NfZmQgdWRwX2JzY19mZDsKKworCWNoYXIgKmlkX3RhZ3NbMHhmZl07CisJdV9pbnQ4X3QgKmlkX3Jlc3A7CisJdW5zaWduZWQgaW50IGlkX3Jlc3BfbGVuOworfTsKKworZW51bSBpcHBfZmRfdHlwZSB7CisJT01MX0ZST01fQlRTID0gMSwKKwlSU0xfRlJPTV9CVFMgPSAyLAorCU9NTF9UT19CU0MgPSAzLAorCVJTTF9UT19CU0MgPSA0LAorCVVEUF9UT19CVFMgPSA1LAorCVVEUF9UT19CU0MgPSA2LAorfTsKKworLyogc29tZSBvZiB0aGUgY29kZSBhZ2FpbnN0IHdlIGxpbmsgZnJvbSBPcGVuQlNDIG5lZWRzIHRoaXMgKi8KK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RhdGljIGNoYXIgKmxpc3Rlbl9pcGFkZHI7CitzdGF0aWMgY2hhciAqYnNjX2lwYWRkcjsKKworI2RlZmluZSBQUk9YWV9BTExPQ19TSVpFCTMwMAorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcG9uZ1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfUE9ORyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX2Fja1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfQUNLIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfcmVxW10gPSB7IDAsIDE3LCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbF9OdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0X05hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb25fMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbl8yIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudF9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlX1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVBfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXRfSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworc3RhdGljIGludCBpcGFjX2lkdGFnX3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisKKwkJREVCVUdQQyhETUksICIlcz0nJXMnICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJZGVjLT5sdlt0X3RhZ10ubGVuID0gdF9sZW47CisJCWRlYy0+bHZbdF90YWddLnZhbCA9IGN1cjsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VuaXRpZChjb25zdCBjaGFyICpzdHIsIHVfaW50MTZfdCAqc2l0ZV9pZCwgdV9pbnQxNl90ICpidHNfaWQsCisJCQl1X2ludDE2X3QgKnRyeF9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKmVuZHB0cjsKKwljb25zdCBjaGFyICpucHRyOworCisJbnB0ciA9IHN0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdGVfaWQpCisJCSpzaXRlX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnRzX2lkKQorCQkqYnRzX2lkID0gdWwgJiAweGZmZmY7CisKKwlpZiAoKmVuZHB0cisrICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHJ4X2lkKQorCQkqdHJ4X2lkID0gdWwgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmZpbmRfYnRzX2J5X3VuaXRpZChzdHJ1Y3QgaXBhX3Byb3h5ICppcHAsCisJCQkJCQl1X2ludDE2X3Qgc2l0ZV9pZCwKKwkJCQkJCXVfaW50MTZfdCBidHNfaWQpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwYmMsICZpcHAtPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChpcGJjLT51bml0X2lkLnNpdGVfaWQgPT0gc2l0ZV9pZCAmJgorCQkgICAgaXBiYy0+dW5pdF9pZC5idHNfaWQgPT0gYnRzX2lkKQorCQkJcmV0dXJuIGlwYmM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpcGFfcHJveHlfY29ubiAqYWxsb2NfY29ubih2b2lkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCisJaXBjID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4pOworCWlmICghaXBjKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTExJU1RfSEVBRCgmaXBjLT50eF9xdWV1ZSk7CisKKwlyZXR1cm4gaXBjOworfQorCitzdGF0aWMgaW50IHN0b3JlX2lkdGFncyhzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdGx2cCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbGVuOworCisJZm9yIChpID0gMDsgaSA8PSAweGZmOyBpKyspIHsKKwkJaWYgKCFUTFZQX1BSRVNFTlQodGx2cCwgaSkpCisJCQljb250aW51ZTsKKworCQlsZW4gPSBUTFZQX0xFTih0bHZwLCBpKTsKKyNpZiAwCisJCWlmICghaXBiYy0+aWRfdGFnc1tpXSkKKwkJCWlwYmMtPmlkX3RhZ3NbaV0gPSB0YWxsb2Nfc2l6ZSh0YWxsX2JzY19jdHgsIGxlbik7CisJCWVsc2UKKyNlbmRpZgorCQkJaXBiYy0+aWRfdGFnc1tpXSA9IHRhbGxvY19yZWFsbG9jX3NpemUoaXBiYywKKwkJCQkJCQkgIGlwYmMtPmlkX3RhZ3NbaV0sIGxlbik7CisJCWlmICghaXBiYy0+aWRfdGFnc1tpXSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbXNldChpcGJjLT5pZF90YWdzW2ldLCAwLCBsZW4pOworCQkvL21lbWNweShpcGJjLT5pZF90YWdzW2ldLCBUTFZQX1ZBTCh0bHZwLCBpKSwgbGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqY29ubmVjdF9ic2Moc3RydWN0IHNvY2thZGRyX2luICpzYSwgaW50IHByaXZfbnIsIHZvaWQgKmRhdGEpOworCisjZGVmaW5lIGxvZ3BfaXBiY191aWQoc3MsIGx2bCwgaXBiYywgdHJ4X2lkKSBfbG9ncF9pcGJjX3VpZChzcywgbHZsLCBfX0ZJTEVfXywgX19MSU5FX18sIGlwYmMsIHRyeF9pZCkKKworc3RhdGljIHZvaWQgX2xvZ3BfaXBiY191aWQodW5zaWduZWQgaW50IHNzLCB1bnNpZ25lZCBpbnQgbHZsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCSAgIHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIHVfaW50OF90IHRyeF9pZCkKK3sKKwlpZiAoaXBiYykKKwkJZGVidWdwMihzcywgbHZsLCBmaWxlLCBsaW5lLCAwLCAiKCV1LyV1LyV1KSAiLCBpcGJjLT51bml0X2lkLnNpdGVfaWQsCisJCSAgICAgaXBiYy0+dW5pdF9pZC5idHNfaWQsIHRyeF9pZCk7CisJZWxzZQorCQlkZWJ1Z3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICJ1bmtub3duICIpOworfQorCisvKiBVRFAgc29ja2V0IGhhbmRsaW5nICovCisKK3N0YXRpYyBpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsIGludCBwcm90bywgaW50IHByaXZfbnIsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCksCisJCSAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIHByb3RvKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJYmZkLT5kYXRhID0gZGF0YTsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIHNvY2tldDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyIFVEUCBmZCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdWRwX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpvdGhlcl9jb25uID0gTlVMTDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhQUk9YWV9BTExPQ19TSVpFLCAiQWJpcy9JUCBVRFAiKTsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldDsKKworCS8qIHdpdGggVURQIHNvY2tldHMsIHdlIGNhbm5vdCByZWFkIHBhcnRpYWwgcGFja2V0cyBidXQgaGF2ZSB0byByZWFkCisJICogYWxsIG9mIGl0IGluIG9uZSBnbyAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbiwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHJldCA9PSAwKSB7CisJCURFQlVHUChESU5QLCAiVURQIHBlZXIgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCWJmZC0+ZmQgPSAtMTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocmV0IDwgc2l6ZW9mKCpoaCkpIHsKKwkJREVCVUdQKERJTlAsICJjb3VsZCBub3QgZXZlbiByZWFkIGhlYWRlciE/IVxuIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJREVCVUdQKERNSSwgIlVEUCBSWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJaWYgKGhoLT5sZW4gIT0gbXNnLT5sZW4gLSBzaXplb2YoKmhoKSkgeworCQlERUJVR1AoRElOUCwgImxlbmd0aCAoJXUvJXUpIGRpc2FncmVlcyB3aXRoIGhlYWRlcigldSlcbiIsCisJCQltc2ctPmxlbiwgbXNnLT5sZW4gLSAzLCBoaC0+bGVuKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoYmZkLT5wcml2X25yICYgMHhmZikgeworCWNhc2UgVURQX1RPX0JUUzoKKwkJLyogaW5qZWN0aW9uIHRvd2FyZHMgQlRTICovCisJCXN3aXRjaCAoaGgtPnByb3RvKSB7CisJCWNhc2UgSVBBQ19QUk9UT19SU0w6CisJCQkvKiBGSVhNRTogd2hhdCB0byBkbyBhYm91dCBUUlggPiAwICovCisJCQlvdGhlcl9jb25uID0gaXBiYy0+cnNsX2Nvbm5bMF07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChESU5QLCAiVW5rbm93biBwcm90b2NvbCAweCUwMngsIHNlbmRpbmcgdG8gIgorCQkJCSJPTUwgRkRcbiIsIGhoLT5wcm90byk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJUEFDX1BST1RPX0lQQUNDRVNTOgorCQljYXNlIElQQUNfUFJPVE9fT01MOgorCQkJb3RoZXJfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVRFBfVE9fQlNDOgorCQkvKiBpbmplY3Rpb24gdG93YXJkcyBCU0MgKi8KKwkJc3dpdGNoIChoaC0+cHJvdG8pIHsKKwkJY2FzZSBJUEFDX1BST1RPX1JTTDoKKwkJCS8qIEZJWE1FOiB3aGF0IHRvIGRvIGFib3V0IFRSWCA+IDAgKi8KKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bMF07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChESU5QLCAiVW5rbm93biBwcm90b2NvbCAweCUwMngsIHNlbmRpbmcgdG8gIgorCQkJCSJPTUwgRkRcbiIsIGhoLT5wcm90byk7CisJCWNhc2UgSVBBQ19QUk9UT19JUEFDQ0VTUzoKKwkJY2FzZSBJUEFDX1BST1RPX09NTDoKKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRElOUCwgIlVua25vd24gZmlsZWRlc2NyaXB0b3IgcHJpdl9ucj0lMDR4XG4iLCBiZmQtPnByaXZfbnIpOworCQlicmVhazsKKwl9CisKKwlpZiAob3RoZXJfY29ubikgeworCQkvKiBlbnF1ZXVlIHRoZSBtZXNzYWdlIGZvciBUWCBvbiB0aGUgcmVzcGVjdGl2ZSBGRCAqLworCQltc2diX2VucXVldWUoJm90aGVyX2Nvbm4tPnR4X3F1ZXVlLCBtc2cpOworCQlvdGhlcl9jb25uLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwl9IGVsc2UKKwkJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdWRwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwkvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IHVkcF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV91ZHBfcmVhZChiZmQpOworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV91ZHBfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IGlwYmNfYWxsb2NfY29ubmVjdChzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYywgc3RydWN0IGJzY19mZCAqYmZkLAorCQkJICAgICAgdV9pbnQxNl90IHNpdGVfaWQsIHVfaW50MTZfdCBidHNfaWQsCisJCQkgICAgICB1X2ludDE2X3QgdHJ4X2lkLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdGx2cCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwl1X2ludDE2X3QgdWRwX3BvcnQ7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBOZXcgQlRTIGNvbm5lY3Rpb246ICIsCisJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCS8qIE9NTCBuZWVkcyB0byBiZSBlc3RhYmxpc2hlZCBiZWZvcmUgUlNMICovCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBPTUxfRlJPTV9CVFMpIHsKKwkJREVCVUdQQyhESU5QLCAiTm90IGEgT01MIGNvbm5lY3Rpb24gPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogYWxsb2NhdGUgbmV3IEJUUyBjb25uZWN0aW9uIGRhdGEgc3RydWN0dXJlICovCisJaXBiYyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9idHNfY29ubik7CisJaWYgKCFpcGJjKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlERUJVR1BDKERJTlAsICJDcmVhdGVkIEJUUyBDb25uIGRhdGEgc3RydWN0dXJlXG4iKTsKKwlpcGJjLT5pcHAgPSBpcHA7CisJaXBiYy0+dW5pdF9pZC5zaXRlX2lkID0gc2l0ZV9pZDsKKwlpcGJjLT51bml0X2lkLmJ0c19pZCA9IGJ0c19pZDsKKwlpcGJjLT5vbWxfY29ubiA9IGlwYzsKKwlpcGMtPmJ0c19jb25uID0gaXBiYzsKKworCS8qIHN0b3JlIHRoZSBjb250ZW50IG9mIHRoZSBJRCBUQUdTIGZvciBsYXRlciByZWZlcmVuY2UgKi8KKwlzdG9yZV9pZHRhZ3MoaXBiYywgdGx2cCk7CisJaXBiYy0+aWRfcmVzcF9sZW4gPSBtc2ctPmxlbjsKKwlpcGJjLT5pZF9yZXNwID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBpcGJjLT5pZF9yZXNwX2xlbik7CisJbWVtY3B5KGlwYmMtPmlkX3Jlc3AsIG1zZy0+ZGF0YSwgaXBiYy0+aWRfcmVzcF9sZW4pOworCisJLyogQ3JlYXRlIE9NTCBUQ1AgY29ubmVjdGlvbiB0b3dhcmRzIEJTQyAqLworCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9PTUwpOworCWlwYmMtPmJzY19vbWxfY29ubiA9IGNvbm5lY3RfYnNjKCZzaW4sIE9NTF9UT19CU0MsIGlwYmMpOworCWlmICghaXBiYy0+YnNjX29tbF9jb25uKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX2JzY19jb25uOworCX0KKworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBPTUwgQ29ubmVjdGVkIHRvIEJTQ1xuIiwKKwkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJLyogQ3JlYXRlIFVEUCBzb2NrZXQgZm9yIEJUUyBwYWNrZXQgaW5qZWN0aW9uICovCisJdWRwX3BvcnQgPSAxMDAwMCArIChzaXRlX2lkICUgMTAwMCkqMTAwICsgKGJ0c19pZCAlIDEwMCk7CisJcmV0ID0gbWFrZV9zb2NrKCZpcGJjLT51ZHBfYnRzX2ZkLCB1ZHBfcG9ydCwgSVBQUk9UT19VRFAsCisJCQlVRFBfVE9fQlRTLCB1ZHBfZmRfY2IsIGlwYmMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91ZHBfYnRzOworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDcmVhdGVkIFVEUCBzb2NrZXQgZm9yIGluamVjdGlvbiAiCisJCSJ0b3dhcmRzIEJUUyBhdCBwb3J0ICV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCwgdWRwX3BvcnQpOworCisJLyogQ3JlYXRlIFVEUCBzb2NrZXQgZm9yIEJTQyBwYWNrZXQgaW5qZWN0aW9uICovCisJdWRwX3BvcnQgPSAyMDAwMCArIChzaXRlX2lkICUgMTAwMCkqMTAwICsgKGJ0c19pZCAlIDEwMCk7CisJcmV0ID0gbWFrZV9zb2NrKCZpcGJjLT51ZHBfYnNjX2ZkLCB1ZHBfcG9ydCwgSVBQUk9UT19VRFAsCisJCQlVRFBfVE9fQlNDLCB1ZHBfZmRfY2IsIGlwYmMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91ZHBfYnNjOworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDcmVhdGVkIFVEUCBzb2NrZXQgZm9yIGluamVjdGlvbiAiCisJCSJ0b3dhcmRzIEJTQyBhdCBwb3J0ICV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCwgdWRwX3BvcnQpOworCWxsaXN0X2FkZCgmaXBiYy0+bGlzdCwgJmlwcC0+YnRzX2xpc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl91ZHBfYnNjOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZpcGJjLT51ZHBfYnRzX2ZkKTsKK2Vycl91ZHBfYnRzOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZpcGJjLT5ic2Nfb21sX2Nvbm4tPmZkKTsKKwljbG9zZShpcGJjLT5ic2Nfb21sX2Nvbm4tPmZkLmZkKTsKKwl0YWxsb2NfZnJlZShpcGJjLT5ic2Nfb21sX2Nvbm4pOworCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CitlcnJfYnNjX2Nvbm46CisJdGFsbG9jX2ZyZWUoaXBiYy0+aWRfcmVzcCk7CisJdGFsbG9jX2ZyZWUoaXBiYyk7CisjaWYgMAorCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJdGFsbG9jX2ZyZWUoYmZkKTsKKyNlbmRpZgorZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Jjdm1zZyhzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0bHZwOworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJdV9pbnQxNl90IHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfUElORzoKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgcG9uZywgc2l6ZW9mKHBvbmcpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmV0IDwgc2l6ZW9mKHBvbmcpKSB7CisJCQlERUJVR1AoRElOUCwgInNob3J0IHdyaXRlXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX1BPTkc6CisJCURFQlVHUChETUksICJQT05HIVxuIik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX1JFU1A6CisJCURFQlVHUChETUksICJJRF9SRVNQICIpOworCQkvKiBwYXJzZSB0YWdzLCBzZWFyY2ggZm9yIFVuaXQgSUQgKi8KKwkJaXBhY19pZHRhZ19wYXJzZSgmdGx2cCwgKHVfaW50OF90ICopbXNnLT5sMmggKyAyLAorCQkJCSBtc2diX2wybGVuKG1zZyktMik7CisJCURFQlVHUChETUksICJcbiIpOworCisJCWlmICghVExWUF9QUkVTRU5UKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpKSB7CisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJObyBVbml0IElEIGluIElEIFJFU1BPTlNFICE/IVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGxvb2t1cCBCVFMsIGNyZWF0ZSBzaWduX2xpbmssIC4uLiAqLworCQlwYXJzZV91bml0aWQoKGNoYXIgKilUTFZQX1ZBTCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSwKKwkJCSAgICAgJnNpdGVfaWQsICZidHNfaWQsICZ0cnhfaWQpOworCQlpcGJjID0gZmluZF9idHNfYnlfdW5pdGlkKGlwcCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFpcGJjKSB7CisJCQkvKiBXZSBoYXZlIG5vdCBmb3VuZCBhbiBpcGJjIChwZXItYnRzIHByb3h5IGluc3RhbmNlKQorCQkJICogZm9yIHRoaXMgQlRTIHlldC4gIFRoZSBmaXJzdCBjb25uZWN0aW9uIG9mIGEgbmV3IEJUUyBtdXN0CisJCQkgKiBiZSBhIE9NTCBjb25uZWN0aW9uLiAgV2UgYWxsb2NhdGUgdGhlIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLAorCQkJICogYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgZW5kICovCisKKwkJCXJldHVybiBpcGJjX2FsbG9jX2Nvbm5lY3QoaXBjLCBiZmQsIHNpdGVfaWQsIGJ0c19pZCwKKwkJCQkJCSAgdHJ4X2lkLCAmdGx2cCwgbXNnKTsKKwkJCS8qIGlmIHRoaXMgZmFpbHMsIHRoZSBjYWxsZXIgd2lsbCBjbGVhbiB1cCBiZmQgKi8KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJCQltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCQkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLAorCQkJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCQkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBSU0xfRlJPTV9CVFMpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJTZWNvbmQgT01MIGNvbm5lY3Rpb24gZnJvbSAiCisJCQkJICAgICAic2FtZSBCVFMgPyE/XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHRyeF9pZCA+IE1BWF9UUlgpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJXZSBkb24ndCBzdXBwb3J0IG1vcmUgIgorCQkJCSAgICAgInRoYW4gJXUgVFJYXG4iLCBNQVhfVFJYKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaXBjLT5idHNfY29ubiA9IGlwYmM7CisJCQkvKiBzdG9yZSBUUlggbnVtYmVyIGluIGhpZ2hlciA4IGJpdCBvZiB0aGUgYmZkIHByaXZhdGUgbnVtYmVyICovCisJCQliZmQtPnByaXZfbnIgfD0gdHJ4X2lkIDw8IDg7CisJCQlpcGJjLT5yc2xfY29ublt0cnhfaWRdID0gaXBjOworCisJCQkvKiBDcmVhdGUgUlNMIFRDUCBjb25uZWN0aW9uIHRvd2FyZHMgQlNDICovCisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfUlNMKTsKKwkJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0KKwkJCQljb25uZWN0X2JzYygmc2luLCBSU0xfVE9fQlNDIHwgKHRyeF9pZCA8PCA4KSwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDb25uZWN0ZWQgUlNMIHRvIEJTQ1xuIiwKKwkJCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfR0VUOgorCQlERUJVR1AoRE1JLCAiSURfR0VUXG4iKTsKKwkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBPTUxfVE9fQlNDICYmCisJCSAgICAoYmZkLT5wcml2X25yICYgMHhmZikgIT0gUlNMX1RPX0JTQykgeworCQkJREVCVUdQKERJTlAsICJJRGVudGl0eSBSRVF1ZXN0IGZyb20gQlRTID8hP1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpcGJjID0gaXBjLT5idHNfY29ubjsKKwkJaWYgKCFpcGJjKSB7CisJCQlERUJVR1AoRElOUCwgIklEX0dFVCBmcm9tIEJTQyBiZWZvcmUgd2UgaGF2ZSBJRF9SRVNQIGZyb20gQlRTXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlwYmMtPmlkX3Jlc3AsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zZ2IgKmlwYWNjZXNzX3JlYWRfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhQUk9YWV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICppcGNfYnlfcHJpdl9ucihzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBwcml2X25yKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJdW5zaWduZWQgaW50IHRyeF9pZCA9IHByaXZfbnIgPj4gODsKKworCXN3aXRjaCAocHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIE9NTF9GUk9NX0JUUzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIE9NTCAqLworCQlic2NfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJYnJlYWs7CisJY2FzZSBSU0xfRlJPTV9CVFM6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBSU0wgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXTsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCWJyZWFrOworCWNhc2UgUlNMX1RPX0JTQzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIFJTTCAqLworCQlic2NfY29ubiA9IGlwYmMtPnJzbF9jb25uW3RyeF9pZF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBic2NfY29ubjsKK30KKworc3RhdGljIHZvaWQgcmVjb25uX3Rtcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcGFfcHJveHkgKmlwcCA9IGRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCBpOworCisJREVCVUdQKERJTlAsICJSdW5uaW5nIHJlY29ubmVjdCB0aW1lclxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShpcGJjLCAmaXBwLT5idHNfbGlzdCwgbGlzdCkgeworCQkvKiBpZiBPTUwgdG8gQlNDIGlzIGRlYWQsIHRyeSB0byByZXN0b3JlIGl0ICovCisJCWlmIChpcGJjLT5vbWxfY29ubiAmJiAhaXBiYy0+YnNjX29tbF9jb25uKSB7CisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfT01MKTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgVHJ5aW5nIHRvIHJlY29ubmVjdFxuIik7CisJCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBjb25uZWN0X2JzYygmc2luLCBPTUxfVE9fQlNDLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX29tbF9jb25uKQorCQkJCWdvdG8gcmVzY2hlZHVsZTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJCS8qIGlmIHdlIChzdGlsbCkgZG9uJ3QgaGF2ZSBhIE9NTCBjb25uZWN0aW9uLCBza2lwIFJTTCAqLworCQlpZiAoIWlwYmMtPm9tbF9jb25uIHx8ICFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcGJjLT5yc2xfY29ubik7IGkrKykgeworCQkJdW5zaWduZWQgaW50IHByaXZfbnI7CisJCQkvKiBkb24ndCBlc3RhYmxpc2ggUlNMIGxpbmtzIHdoaWNoIHdlIGRvbid0IGhhdmUgKi8KKwkJCWlmICghaXBiYy0+cnNsX2Nvbm5baV0pCisJCQkJY29udGludWU7CisJCQlpZiAoaXBiYy0+YnNjX3JzbF9jb25uW2ldKQorCQkJCWNvbnRpbnVlOworCQkJcHJpdl9uciA9IGlwYmMtPnJzbF9jb25uW2ldLT5mZC5wcml2X25yOworCQkJcHJpdl9uciAmPSB+MHhmZjsKKwkJCXByaXZfbnIgfD0gUlNMX1RPX0JTQzsKKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9SU0wpOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgcHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiUlNMIFRyeWluZyB0byByZWNvbm5lY3RcbiIpOworCQkJaXBiYy0+YnNjX3JzbF9jb25uW2ldID0gY29ubmVjdF9ic2MoJnNpbiwgcHJpdl9uciwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19yc2xfY29ubikKKwkJCQlnb3RvIHJlc2NoZWR1bGU7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBwcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJSU0wgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJfQorCXJldHVybjsKKworcmVzY2hlZHVsZToKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RlYWRfc29ja2V0KHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsJCS8qIGxvY2FsIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOwkJLyogcmVtb3RlIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwl1bnNpZ25lZCBpbnQgdHJ4X2lkID0gYmZkLT5wcml2X25yID4+IDg7CisJc3RydWN0IG1zZ2IgKm1zZywgKm1zZzI7CisKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIEZJWE1FOiBjbGVhciB0eF9xdWV1ZSwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzLCBldGMuICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZpcGMtPnR4X3F1ZXVlLCBsaXN0KQorCQltc2diX2ZyZWUobXNnKTsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yICYgMHhmZikgeworCWNhc2UgT01MX0ZST01fQlRTOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgT01MICovCisJCWlwYmMtPm9tbF9jb25uID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCS8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBCU0MgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmJzY19jb25uLT5mZCk7CisJCWNsb3NlKGJzY19jb25uLT5mZC5mZCk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBsaXN0KQorCQkJbXNnYl9mcmVlKG1zZyk7CisJCXRhbGxvY19mcmVlKGJzY19jb25uKTsKKwkJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKKwkJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBlbnRpcmUgaXBiYyA/ICovCisJCWJyZWFrOworCWNhc2UgUlNMX0ZST01fQlRTOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgUlNMICovCisJCWlwYmMtPnJzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdOworCQkvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgQlNDICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKCZic2NfY29ubi0+ZmQpOworCQljbG9zZShic2NfY29ubi0+ZmQuZmQpOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmJzY19jb25uLT50eF9xdWV1ZSwgbGlzdCkKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl0YWxsb2NfZnJlZShic2NfY29ubik7CisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCS8qIHN0YXJ0IHJlY29ubmVjdCB0aW1lciAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfVE9fQlNDOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgUlNMICovCisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5yc2xfY29ublt0cnhfaWRdOworCQkvKiBzdGFydCByZWNvbm5lY3QgdGltZXIgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJdGFsbG9jX2ZyZWUoaXBjKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdGNwX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDA7CisJY2hhciAqYnRzYnNjOworCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSA8PSAyKQorCQlidHNic2MgPSAiQlRTIjsKKwllbHNlCisJCWJ0c2JzYyA9ICJCU0MiOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmcmV0KTsKKwlpZiAoIW1zZykgeworCQlpZiAocmV0ID09IDApIHsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiJXMgZGlzYXBwZWFyZWQsICIKKwkJCSAgICAgImRlYWQgc29ja2V0XG4iLCBidHNic2MpOworCQkJaGFuZGxlX2RlYWRfc29ja2V0KGJmZCk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlJYPC0lczogJXNcbiIsIGJ0c2JzYywgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhpcGMsIG1zZywgYmZkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQljbG9zZShiZmQtPmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJCXRhbGxvY19mcmVlKGJmZCk7CisJCX0KKwkJLyogd2UgZG8gbm90IGZvcndhcmQgdGhlIENDTSBwcm90b2NvbCB0aHJvdWdoIHRoZQorCQkgKiBwcm94eSBidXQgcmF0aGVyIHRlcm1pbmF0ZSBpdCBvdXJzZWx2ZXMgKi8KKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFpcGJjKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwKKwkJICAgICAicmVjZWl2ZWQgJXMgcGFja2V0IGJ1dCBubyBpcGMtPmJ0c19jb25uPyE/XG4iLCBidHNic2MpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYnNjX2Nvbm4gPSBpcGNfYnlfcHJpdl9ucihpcGJjLCBiZmQtPnByaXZfbnIpOworCWlmIChic2NfY29ubikgeworCQkvKiBlbnF1ZXVlIHBhY2tldCB0b3dhcmRzIEJTQyAqLworCQltc2diX2VucXVldWUoJmJzY19jb25uLT50eF9xdWV1ZSwgbXNnKTsKKwkJLyogbWFyayByZXNwZWN0aXZlIGZpbGVkZXNjcmlwdG9yIGFzICd3ZSB3YW50IHRvIHdyaXRlJyAqLworCQlic2NfY29ubi0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfSBlbHNlIHsKKwkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX0lORk8sIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJTE9HUEMoRElOUCwgTE9HTF9JTkZPLCAiRHJvcHBpbmcgcGFja2V0IGZyb20gJXMsICIKKwkJICAgICAic2luY2UgcmVtb3RlIGNvbm5lY3Rpb24gaXMgZGVhZFxuIiwgYnRzYnNjKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogYSBUQ1Agc29ja2V0IGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBtc2diICptc2c7CisJY2hhciAqYnRzYnNjOworCWludCByZXQ7CisKKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpIDw9IDIpCisJCWJ0c2JzYyA9ICJCVFMiOworCWVsc2UKKwkJYnRzYnNjID0gIkJTQyI7CisKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwlpZiAobGxpc3RfZW1wdHkoJmlwYy0+dHhfcXVldWUpKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisJbGggPSBpcGMtPnR4X3F1ZXVlLm5leHQ7CisJbGxpc3RfZGVsKGxoKTsKKwltc2cgPSBsbGlzdF9lbnRyeShsaCwgc3RydWN0IG1zZ2IsIGxpc3QpOworCisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlRYICUwNHg6ICVzXG4iLCBiZmQtPnByaXZfbnIsCisJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwKTsKKwltc2diX2ZyZWUobXNnKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICIlcyBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsIGJ0c2JzYyk7CisJCWhhbmRsZV9kZWFkX3NvY2tldChiZmQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCXJjID0gaGFuZGxlX3RjcF9yZWFkKGJmZCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV90Y3Bfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworLyogY2FsbGJhY2sgb2YgdGhlIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlERUJVR1AoRElOUCwgImFjY2VwdCgpZWQgbmV3ICVzIGxpbmsgZnJvbSAlc1xuIiwgCisJCShsaXN0ZW5fYmZkLT5wcml2X25yICYgMHhmZikgPT0gT01MX0ZST01fQlRTID8gIk9NTCIgOiAiUlNMIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlpcGMgPSBhbGxvY19jb25uKCk7CisJaWYgKCFpcGMpIHsKKwkJY2xvc2UocmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHJldDsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gbGlzdGVuX2JmZC0+cHJpdl9ucjsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfbGlzdGVuX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwgaW50IHByaXZfbnIsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWlmICghbGlzdGVuX2lwYWRkcikKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWVsc2UKKwkJaW5ldF9hdG9uKGxpc3Rlbl9pcGFkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGxpc3RlbiBzb2NrZXQgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJTQy4gICovCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICpjb25uZWN0X2JzYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLCBpbnQgcHJpdl9uciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJaXBjID0gYWxsb2NfY29ubigpOworCWlmICghaXBjKQorCQlyZXR1cm4gTlVMTDsKKworCWlwYy0+YnRzX2Nvbm4gPSBkYXRhOworCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHByZS1maWxsIHR4X3F1ZXVlIHdpdGggaWRlbnRpdHkgcmVxdWVzdCAqLworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaXBjOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Byb3h5X3NldHVwKHZvaWQpCit7CisJaW50IHJldDsKKworCWlwcCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9wcm94eSk7CisJaWYgKCFpcHApCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfTExJU1RfSEVBRCgmaXBwLT5idHNfbGlzdCk7CisJaXBwLT5yZWNvbm5fdGltZXIuY2IgPSByZWNvbm5fdG1yX2NiOworCWlwcC0+cmVjb25uX3RpbWVyLmRhdGEgPSBpcHA7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+b21sX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwKKwkJCQlPTUxfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+cnNsX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX1JTTCwKKwkJCQlSU0xfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAic2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWxpc3Rlbl9pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMTEiOworCWJzY19pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMjM5IjsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAiaXBhY2Nlc3MtcHJveHkiKTsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRJTlA6RE1JIik7CisKKwlyYyA9IGlwYWNjZXNzX3Byb3h5X3NldHVwKCk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMgYi9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBpc2Ruc3luYy5jCisgKgorICogQXV0aG9yICAgICAgIEFuZHJlYXMgRXZlcnNiZXJnIDxqb2xseUBldmVyc2JlcmcuZXU+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSAibUlTRE5pZi5oIgorI2RlZmluZSBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQorI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKyNpbmNsdWRlICJjb21wYXRfYWZfaXNkbi5oIgorCitpbnQgY2FyZCA9IDA7CitpbnQgc29jayA9IC0xOworCitpbnQgbUlTRE5fb3Blbih2b2lkKQoreworCWludAkJCWZkLCByZXQ7CisJc3RydWN0IG1JU0ROX2RldmluZm8JZGV2aW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4JbDJhZGRyOworCisJZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gc29ja2V0ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBmZDsKKwl9CisJZGV2aW5mby5pZCA9IGNhcmQ7CisJcmV0ID0gaW9jdGwoZmQsIElNR0VUREVWSU5GTywgJmRldmluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3Qgc2VuZCBJT0NUTCBJTUdFVENPVU5UICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2xvc2UoZmQpOworCWlmICghKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9URV9TMCkpCisJICYmICEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX1RFX0UxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IFRFIG1vZGUgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlmZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfTEFQRF9URSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IG9wZW4gSVNETl9QX0xBUERfVEUgc29ja2V0ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBmZDsKKwl9CisJbDJhZGRyLmZhbWlseSA9IEFGX0lTRE47CisJbDJhZGRyLmRldiA9IGNhcmQ7CisJbDJhZGRyLmNoYW5uZWwgPSAwOworCWwyYWRkci5zYXBpID0gMDsKKwlsMmFkZHIudGVpID0gMDsKKwlyZXQgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmwyYWRkciwgc2l6ZW9mKGwyYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3QgYmluZCBzb2NrZXQgZm9yIGNhcmQgJWQgKCVzKVxuIiwgY2FyZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlzb2NrID0gZmQ7CisKKwlyZXR1cm4gc29jazsKK30KKworCit2b2lkIG1JU0ROX2hhbmRsZSh2b2lkKQoreworCWludCByZXQ7CisJZmRfc2V0IHJmZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gYWRkcjsKKwlzb2NrbGVuX3QgYWxlbjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyMDQ4XTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopYnVmZmVyOworCWludCBsMSA9IDAsIGwyID0gMCwgdGVpID0gMDsKKworCXdoaWxlKDEpIHsKK2FnYWluOgorCQlGRF9aRVJPKCZyZmQpOworCQlGRF9TRVQoc29jaywgJnJmZCk7CisJCXR2LnR2X3NlYyA9IDI7CisJCXR2LnR2X3VzZWMgPSAwOworCQlyZXQgPSBzZWxlY3Qoc29jaysxLCAmcmZkLCBOVUxMLCBOVUxMLCAmdHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsICIlcyBhYm9ydGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKEZEX0lTU0VUKHNvY2ssICZyZmQpKSB7CisJCQlhbGVuID0gc2l6ZW9mKGFkZHIpOworCQkJcmV0ID0gcmVjdmZyb20oc29jaywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFsZW4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHJlYWQgc29ja2V0IGVycm9yICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgaWYgKHJldCA8IE1JU0ROX0hFQURFUl9MRU4pIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlcyByZWFkIHNvY2tldCBzaG9yIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2goaGgtPnByaW0pIHsKKwkJCQkJY2FzZSBNUEhfQUNUSVZBVEVfSU5EOgorCQkJCQljYXNlIFBIX0FDVElWQVRFX0lORDoKKwkJCQkJCWlmICghbDEpIHsKKwkJCQkJCQlwcmludGYoIlBIX0FDVElWQVRFXG4iKTsKKwkJCQkJCQlwcmludGYoIioqKiBTeW5jIGF2YWlsYWJsZSBmcm9tIGludGVyZmFjZSA6LSlcbiIpOworCQkJCQkJCWwxID0gMTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIE1QSF9ERUFDVElWQVRFX0lORDoKKwkJCQkJY2FzZSBQSF9ERUFDVElWQVRFX0lORDoKKwkJCQkJCWlmIChsMSkgeworCQkJCQkJCXByaW50ZigiUEhfREVBQ1RJVkFURVxuIik7CisJCQkJCQkJcHJpbnRmKCIqKiogTG9zdCBzeW5jIG9uIGludGVyZmFjZSAgICAgICAgOi0oXG4iKTsKKwkJCQkJCQlsMSA9IDA7CisJCQkJCQl9CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9FU1RBQkxJU0hfSU5EOgorCQkJCQljYXNlIERMX0VTVEFCTElTSF9DTkY6CisJCQkJCQlwcmludGYoIkRMX0VTVEFCTElTSFxuIik7CisJCQkJCQlsMiA9IDE7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9SRUxFQVNFX0lORDoKKwkJCQkJY2FzZSBETF9SRUxFQVNFX0NORjoKKwkJCQkJCXByaW50ZigiRExfUkVMRUFTRVxuIik7CisJCQkJCQlsMiA9IDA7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9JTkZPUk1BVElPTl9JTkQ6CisJCQkJCQlwcmludGYoIkRMX0lORk9STUFUSU9OICh0ZWkgJWQgc2FwaSAlZClcbiIsIGFkZHIudGVpLCBhZGRyLnNhcGkpOworCQkJCQkJdGVpID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisvLwkJCQkJCXByaW50ZigicHJpbSAleFxuIiwgaGgtPnByaW0pOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHRlaSAmJiAhbDIpIHsKKwkJCWhoLT5wcmltID0gRExfRVNUQUJMSVNIX1JFUTsKKwkJCXByaW50ZigiLT4gYWN0aXZhdGluZyBsYXllciAyXG4iKTsKKwkJCXNlbmR0byhzb2NrLCBidWZmZXIsIE1JU0ROX0hFQURFUl9MRU4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIGFsZW4pOworCQl9CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisKKwlpZiAoYXJnYyA8PSAxKQorCXsKKwkJcHJpbnRmKCJVc2FnZTogJXMgPGNhcmQ+XG5cbiIsIGFyZ3ZbMF0pOworCQlwcmludGYoIk9wZW5zIGdpdmVuIGNhcmQgbnVtYmVyIGluIFRFLW1vZGUgUFRQIGFuZCB0cmllcyB0byBrZWVwIGxheWVyIDIgZXN0YWJsaXNoZWQuXG4iKTsKKwkJcHJpbnRmKCJUaGlzIGtlZXBzIGxheWVyIDEgYWN0aXZhdGVkIHRvIHJldHJpZXZlIGEgc3RlYWR5IHN5bmMgc2lnbmFsIGZyb20gbmV0d29yay5cbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJY2FyZCA9IGF0b2koYXJndlsxXSk7CisKKwlpbml0X2FmX2lzZG4oKTsKKworCWlmICgocmV0ID0gbUlTRE5fb3BlbigpIDwgMCkpCisJCXJldHVybihyZXQpOworCisJbUlTRE5faGFuZGxlKCk7CisKKwljbG9zZShzb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWVhc19yZXAuYyBiL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5Y2MxYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIE1lYXN1cmVtZW50IFJlcG9ydCBQcm9jZXNzaW5nICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisKK3N0YXRpYyBpbnQgZ2V0X2ZpZWxkKGNvbnN0IHN0cnVjdCBnc21fbWVhc19yZXAgKnJlcCwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkKQoreworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIE1FQVNfUkVQX0RMX1JYTEVWX0ZVTEw6CisJCXJldHVybiByZXAtPmRsLmZ1bGwucnhfbGV2OworCWNhc2UgTUVBU19SRVBfRExfUlhMRVZfU1VCOgorCQlyZXR1cm4gcmVwLT5kbC5zdWIucnhfbGV2OworCWNhc2UgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEw6CisJCXJldHVybiByZXAtPmRsLmZ1bGwucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX0RMX1JYUVVBTF9TVUI6CisJCXJldHVybiByZXAtPmRsLnN1Yi5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfVUxfUlhMRVZfRlVMTDoKKwkJcmV0dXJuIHJlcC0+dWwuZnVsbC5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9VTF9SWExFVl9TVUI6CisJCXJldHVybiByZXAtPnVsLnN1Yi5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9VTF9SWFFVQUxfRlVMTDoKKwkJcmV0dXJuIHJlcC0+dWwuZnVsbC5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfVUxfUlhRVUFMX1NVQjoKKwkJcmV0dXJuIHJlcC0+dWwuc3ViLnJ4X3F1YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpCit7CisJaW50IG9mZnMsIGlkeDsKKworCS8qIGZyb20gd2hpY2ggZWxlbWVudCBkbyB3ZSBuZWVkIHRvIHN0YXJ0IGlmIHdlJ3JlIGludGVyZXN0ZWQKKwkgKiBpbiBhbiBhdmVyYWdlIG9mICdudW0nIGVsZW1lbnRzICovCisJb2ZmcyA9IG1lYXNfcmVwX2lkeCAtIG51bV92YWx1ZXM7CisKKwlpZiAob2ZmcyA8IDApCisJCWlkeCA9IGFycmF5X3NpemUgKyBvZmZzOworCWVsc2UKKwkJaWR4ID0gb2ZmczsKKworCXJldHVybiBpZHg7Cit9CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgYXZnID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJCWxjaGFuLT5tZWFzX3JlcF9pZHgsIG51bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaW50IGogPSAoaWR4K2kpICUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCisJCWF2ZyArPSBnZXRfZmllbGQoJmxjaGFuLT5tZWFzX3JlcFtqXSwgZmllbGQpOworCX0KKworCXJldHVybiBhdmcgLyBudW07Cit9CisKKy8qIENoZWNrIGlmIE4gb3V0IG9mIE0gbGFzdCB2YWx1ZXMgZm9yIEZJRUxEIGFyZSA+PSBiZCAqLworaW50IG1lYXNfcmVwX25fb3V0X29mX21fYmUoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQllbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLAorCQkJdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtLCBpbnQgYmUpCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgY291bnQgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkJbGNoYW4tPm1lYXNfcmVwX2lkeCwgbSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCWludCBqID0gKGlkeCArIGkpICUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCQlpbnQgdmFsID0gZ2V0X2ZpZWxkKCZsY2hhbi0+bWVhc19yZXBbal0sIGZpZWxkKTsKKworCQlpZiAodmFsID49IGJlKQorCQkJY291bnQrKzsKKworCQlpZiAoY291bnQgPj0gbikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC5jZmcgYi9vcGVuYnNjL3NyYy9tZ2NwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhmNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC5jZmcKQEAgLTAsMCArMSwxOSBAQAorIQorISBNR0NQIGNvbmZpZ3VyYXRpb24gaGFuZCBlZGl0ZWQKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK21nY3AKKyEgIGxvY2FsIGlwIDIxMy4xNjcuMTM0LjE0CisgIGJ0cyBpcCAxNzIuMTYuMjUyLjQzCisgIGJpbmQgaXAgMjEzLjE2Ny4xMzQuMTQxCisgIGJpbmQgcG9ydCAyNDI3CisgIGJpbmQgZWFybHkgMQorICBydHAgYmFzZSA0MDAwCisgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciA5OAorICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lIEFNUi84MDAwCisgIG51bWJlciBlbmRwb2ludHMgMzEKKyAgbG9vcCAxCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVhMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYwpAQCAtMCwwICsxLDIzNyBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBtYWluIG1ldGhvZCB0byBkcml2ZSBpdCBhcyBhIHN0YW5kYWxvbmUgcHJvY2VzcyAgICAgICovCisKKy8qCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKworLyogdGhpcyBpcyBoZXJlIGZvciB0aGUgdnR5Li4uIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCit2b2lkIHN1YnNjcl9wdXQoKSB7IGFib3J0KCk7IH0KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCitzdGF0aWMgc3RydWN0IGJzY19mZCBiZmQ7CitzdGF0aWMgaW50IGZpcnN0X3JlcXVlc3QgPSAxOworc3RhdGljIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uID0gIk9wZW5CU0MgTUdDUCAiIFBBQ0tBR0VfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0gCisJIkNvcHlyaWdodCAoQykgMjAwOS0yMDEwIEhvbGdlciBGcmV5dGhlciBhbmQgT24tV2F2ZXNcbiIKKwkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZywgSGFyYWxkIFdlbHRlXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCitzdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSAibWdjcC5jZmciOworCisvKiB1c2VkIGJ5IG1zZ2IgYW5kIG1nY3AgKi8KK3ZvaWQgKnRhbGxfYnNjX2N0eCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiU29tZSB1c2VmdWwgaGVscC4uLlxuIik7CisJcHJpbnRmKCIgLWggLS1oZWxwIGlzIHByaW50aW5nIHRoaXMgdGV4dC5cbiIpOworCXByaW50ZigiIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF92ZXJzaW9uKCkKK3sKKwlwcmludGYoIiVzXG5cbiIsIG9wZW5ic2NfdmVyc2lvbik7CisJcHJpbnRmKG9wZW5ic2NfY29weXJpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXdoaWxlICgxKSB7CisJCWludCBvcHRpb25faW5kZXggPSAwLCBjOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsiaGVscCIsIDAsIDAsICdoJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsidmVyc2lvbiIsIDAsIDAsICdWJ30sCisJCQl7MCwgMCwgMCwgMH0sCisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoYzpWIiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX2JzY19jdHgsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlwcmludF92ZXJzaW9uKCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQl9OworCX0KK30KKworc3RhdGljIGludCByZWFkX2NhbGxfYWdlbnQoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKGFkZHIpOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IG1zZ2IgKnJlc3A7CisKKwltc2cgPSAoc3RydWN0IG1zZ2IgKikgZmQtPmRhdGE7CisKKwkvKiByZWFkIG9uZSBsZXNzIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBcMCAqLworCWludCByYyA9IHJlY3Zmcm9tKGJmZC5mZCwgbXNnLT5kYXRhLCBtc2ctPmRhdGFfbGVuIC0gMSwgMCwKKwkJKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJnNsZW4pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byByZWFkIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHNsZW4gPiBzaXplb2YoYWRkcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJHYXRld2F5IHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBvdXRlcnNwYWNlOiAlZCAlZFxuIiwKKwkJCXNsZW4sIHNpemVvZihhZGRyKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmlyc3RfcmVxdWVzdCkgeworCQlmaXJzdF9yZXF1ZXN0ID0gMDsKKwkJcmVzcCA9IG1nY3BfY3JlYXRlX3JzaXAoKTsKKworCQlpZiAocmVzcCkgeworCQkJc2VuZHRvKGJmZC5mZCwgcmVzcC0+bDJoLCBtc2diX2wybGVuKHJlc3ApLCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCQltc2diX2ZyZWUocmVzcCk7CisJCX0KKwkJcmV0dXJuIDA7CisgICAgICAgIH0KKworCS8qIGhhbmRsZSBtZXNzYWdlIG5vdyAqLworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCByYyk7CisJcmVzcCA9IG1nY3BfaGFuZGxlX21lc3NhZ2UoY2ZnLCBtc2cpOworCW1zZ2JfcmVzZXQobXNnKTsKKworCWlmIChyZXNwKSB7CisJCXNlbmR0byhiZmQuZmQsIHJlc3AtPmwyaCwgbXNnYl9sMmxlbihyZXNwKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJbXNnYl9mcmVlKHJlc3ApOworCX0KKwlyZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrIGR1bW15X25ldHdvcms7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IG9uID0gMSwgcmM7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAibWdjcC1jYWxsYWdlbnQiKTsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJY2ZnID0gbWdjcF9jb25maWdfYWxsb2MoKTsKKwlpZiAoIWNmZykKKwkJcmV0dXJuIC0xOworCisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisKKwl0ZWxuZXRfaW5pdCgmZHVtbXlfbmV0d29yaywgNDI0Myk7CisgICAgICAgIHJjID0gbWdjcF9wYXJzZV9jb25maWcoY29uZmlnX2ZpbGUsIGNmZyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisKKyAgICAgICAgLyogd2UgbmVlZCB0byBiaW5kIGEgc29ja2V0ICovCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisJCWJmZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCWJmZC5jYiA9IHJlYWRfY2FsbF9hZ2VudDsKKwkJYmZkLmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCQlpZiAoYmZkLmZkIDwgMCkgeworCQkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byBsaXN0ZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNldHNvY2tvcHQoYmZkLmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoY2ZnLT5zb3VyY2VfcG9ydCk7CisJCWluZXRfYXRvbihjZmctPnNvdXJjZV9hZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwkJaWYgKGJpbmQoYmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQkJcGVycm9yKCJHYXRld2F5IGZhaWxlZCB0byBiaW5kIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQliZmQuZGF0YSA9IG1zZ2JfYWxsb2MoNDA5NiwgIm1nY3AtbXNnIik7CisJCWlmICghYmZkLmRhdGEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiR2F0ZXdheSBtZW1vcnkgZXJyb3IuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJaWYgKGJzY19yZWdpc3Rlcl9mZCgmYmZkKSAhPSAwKSB7CisJCQlERUJVR1AoRE1HQ1AsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIGZkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCURFQlVHUChETUdDUCwgIkNvbmZpZ3VyZWQgZm9yIE1HQ1AuXG4iKTsKKwl9CisKKwkvKiBpbml0aWFsaXNhdGlvbiAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJLyogbWFpbiBsb29wICovCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KKworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbmV0d29yay5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzZjYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYwpAQCAtMCwwICsxLDI1NSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCisvKiBhY2NvcmRpbmcgdG8gcnRwX3Byb3h5LmMgUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCURFU1RfTkVUV09SSyA9IDAsCisJREVTVF9CVFMgPSAxLAorfTsKKworZW51bSB7CisJUFJPVE9fUlRQLAorCVBST1RPX1JUQ1AsCit9OworCisKK3N0YXRpYyBpbnQgdWRwX3NlbmQoaW50IGZkLCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwgaW50IHBvcnQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gb3V0OworCW91dC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlvdXQuc2luX3BvcnQgPSBwb3J0OworCW1lbWNweSgmb3V0LnNpbl9hZGRyLCBhZGRyLCBzaXplb2YoKmFkZHIpKTsKKworCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopJm91dCwgc2l6ZW9mKG91dCkpOworfQorCitzdGF0aWMgdm9pZCBwYXRjaF9wYXlsb2FkKGludCBwYXlsb2FkLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBydHBfaGRyICpydHBfaGRyOworCisJaWYgKGxlbiA8IHNpemVvZigqcnRwX2hkcikpCisJCXJldHVybjsKKworCXJ0cF9oZHIgPSAoc3RydWN0IHJ0cF9oZHIgKikgZGF0YTsKKwlydHBfaGRyLT5wYXlsb2FkX3R5cGUgPSBwYXlsb2FkOworfQorCisvKgorICogVGhlcmUgaXMgZGF0YSBjb21pbmcuIFdlIHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIGl0CisgKiBjYW1lIGZyb20gdGhlIEJUUyBvciB0aGUgTWVkaWFHYXRld2F5IG9mIHRoZSBNU0MuIE9uIHRvcAorICogb2YgdGhhdCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgd2FzIFJUUCBvciBSVENQLgorICoKKyAqIEN1cnJlbnRseSB3ZSBkbyBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgQlNDIHNvIHdlIGhhdmUKKyAqIG5vIGlkZWEgd2hlcmUgdGhlIEJUUyBpcyBsaXN0ZW5pbmcgZm9yIFJUUCBhbmQgbmVlZCB0bworICogZG8gdGhlIGNsYXNzaWMgcm91dGluZyB0cmljay4gV2FpdCBmb3IgdGhlIGZpcnN0IHBhY2tldAorICogZnJvbSB0aGUgQlRTIGFuZCB0aGVuIGdvIGFoZWFkLgorICovCitzdGF0aWMgaW50IHJ0cF9kYXRhX2NiKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKwlpbnQgcmMsIGRlc3QsIHByb3RvOworCisJZW5kcCA9IChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKSBmZC0+ZGF0YTsKKwljZmcgPSBlbmRwLT5jZmc7CisKKwlyYyA9IHJlY3Zmcm9tKGZkLT5mZCwgJmJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJnNsZW4pOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWNlaXZlIG1lc3NhZ2Ugb246IDB4JXhcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZG8gbm90IGZvcndhcmQgYXludGhpbmcuLi4gbWF5YmUgdGhlcmUgaXMgYSBwYWNrZXQgZnJvbSB0aGUgYnRzICovCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiVW5rbm93biBtZXNzYWdlIG9uIGVuZHBvaW50OiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoZXJlIHRvIGZvcndhcmQgaXQgdG8uIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgd2UKKwkgKiBoYXZlIHJlY2VpdmVkIHRoZSBDb25uZWN0aW9uIE1vZGlmeSBhbmQga25vdyB3aG8gaXMgYSBsZWdpdGltYXRlCisJICogcGFydG5lci4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHdlIGNvdWxkIGF0dGVtcHQgdG8gZm9yd2FyZCBldmVuCisJICogYWZ0ZXIgdGhlIENyZWF0ZSBDb25uZWN0aW9uIGJ1dCB3ZSB3aWxsIG5vdCBhcyB3ZSBhcmUgbm90IHJlYWxseQorCSAqIGFibGUgdG8gdGVsbCBpZiB0aGlzIGlzIGxlZ2l0aW1hdGUuCisJICovCisJI3dhcm5pbmcgIlNsaWdodCBzcGVjIHZpb2xhdGlvbi4gV2l0aCBjb25uZWN0aW9uIG1vZGUgcmVjdm9ubHkgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZm9yd2FyZC4iCisJZGVzdCA9IG1lbWNtcCgmYWRkci5zaW5fYWRkciwgJmVuZHAtPnJlbW90ZSwgc2l6ZW9mKGFkZHIuc2luX2FkZHIpKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIChlbmRwLT5uZXRfcnRwID09IGFkZHIuc2luX3BvcnQgfHwgZW5kcC0+bmV0X3J0Y3AgPT0gYWRkci5zaW5fcG9ydCkKKwkJCT8gREVTVF9CVFMgOiBERVNUX05FVFdPUks7CisJcHJvdG8gPSBmZCA9PSAmZW5kcC0+bG9jYWxfcnRwID8gUFJPVE9fUlRQIDogUFJPVE9fUlRDUDsKKworCS8qIFdlIGhhdmUgbm8gaWRlYSB3aG8gY2FsbGVkIHVzLCBtYXliZSBpdCBpcyB0aGUgQlRTLiAqLworCWlmIChkZXN0ID09IERFU1RfTkVUV09SSyAmJiAoZW5kcC0+YnRzX3J0cCA9PSAwIHx8IGNmZy0+Zm9yd2FyZF9pcCkpIHsKKwkJLyogaXQgd2FzIHRoZSBCVFMuLi4gKi8KKwkJaWYgKCFjZmctPmJ0c19pcCB8fCBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZjZmctPmJ0c19pbiwgc2l6ZW9mKGNmZy0+YnRzX2luKSkgPT0gMCkgeworCQkJaWYgKGZkID09ICZlbmRwLT5sb2NhbF9ydHApIHsKKwkJCQllbmRwLT5idHNfcnRwID0gYWRkci5zaW5fcG9ydDsKKwkJCX0gZWxzZSB7CisJCQkJZW5kcC0+YnRzX3J0Y3AgPSBhZGRyLnNpbl9wb3J0OworCQkJfQorCisJCQllbmRwLT5idHMgPSBhZGRyLnNpbl9hZGRyOworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3VuZCBCVFMgZm9yIGVuZHBvaW50OiAweCV4IG9uIHBvcnQ6ICVkLyVkXG4iLAorCQkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSk7CisJCX0KKwl9CisKKwkvKiBkaXNwYXRjaCAqLworCWlmIChjZmctPmF1ZGlvX2xvb3ApCisJCWRlc3QgPSAhZGVzdDsKKworCWlmIChkZXN0ID09IERFU1RfTkVUV09SSykgeworCQlwYXRjaF9wYXlsb2FkKGVuZHAtPm5ldF9wYXlsb2FkX3R5cGUsIGJ1ZiwgcmMpOworCQlyZXR1cm4gdWRwX3NlbmQoZmQtPmZkLCAmZW5kcC0+cmVtb3RlLAorCQkJICAgICBwcm90byA9PSBQUk9UT19SVFAgPyBlbmRwLT5uZXRfcnRwIDogZW5kcC0+bmV0X3J0Y3AsCisJCQkgICAgIGJ1ZiwgcmMpOworCX0gZWxzZSB7CisJCXBhdGNoX3BheWxvYWQoZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwgYnVmLCByYyk7CisJCXJldHVybiB1ZHBfc2VuZChmZC0+ZmQsICZlbmRwLT5idHMsCisJCQkgICAgIHByb3RvID09IFBST1RPX1JUUCA/IGVuZHAtPmJ0c19ydHAgOiBlbmRwLT5idHNfcnRjcCwKKwkJCSAgICAgYnVmLCByYyk7CisJfQorfQorCitzdGF0aWMgaW50IGNyZWF0ZV9iaW5kKGNvbnN0IGNoYXIgKnNvdXJjZV9hZGRyLCBzdHJ1Y3QgYnNjX2ZkICpmZCwgaW50IHBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IG9uID0gMTsKKworCWZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQtPmZkIDwgMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBVRFAgcG9ydC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2V0c29ja29wdChmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaW5ldF9hdG9uKHNvdXJjZV9hZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwlpZiAoYmluZChmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kX3J0cChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCkKK3sKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyA9IGVuZHAtPmNmZzsKKworCWlmIChjcmVhdGVfYmluZChjZmctPnNvdXJjZV9hZGRyLCAmZW5kcC0+bG9jYWxfcnRwLCBlbmRwLT5ydHBfcG9ydCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSVFAgcG9ydDogJXM6JWQgb24gMHgleFxuIiwKKwkJICAgICAgIGNmZy0+c291cmNlX2FkZHIsIGVuZHAtPnJ0cF9wb3J0LCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAwOworCX0KKworCWlmIChjcmVhdGVfYmluZChjZmctPnNvdXJjZV9hZGRyLCAmZW5kcC0+bG9jYWxfcnRjcCwgZW5kcC0+cnRwX3BvcnQgKyAxKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFJUQ1AgcG9ydDogJXM6JWQgb24gMHgleFxuIiwKKwkJICAgICAgIGNmZy0+c291cmNlX2FkZHIsIGVuZHAtPnJ0cF9wb3J0ICsgMSwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMTsKKwl9CisKKwllbmRwLT5sb2NhbF9ydHAuY2IgPSBydHBfZGF0YV9jYjsKKwllbmRwLT5sb2NhbF9ydHAuZGF0YSA9IGVuZHA7CisJZW5kcC0+bG9jYWxfcnRwLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBSVFAgcG9ydCAlZCBvbiAweCV4XG4iLAorCQkJZW5kcC0+cnRwX3BvcnQsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDI7CisJfQorCisJZW5kcC0+bG9jYWxfcnRjcC5jYiA9IHJ0cF9kYXRhX2NiOworCWVuZHAtPmxvY2FsX3J0Y3AuZGF0YSA9IGVuZHA7CisJZW5kcC0+bG9jYWxfcnRjcC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJaWYgKGJzY19yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRjcCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQ1AgcG9ydCAlZCBvbiAweCV4XG4iLAorCQkJZW5kcC0+cnRwX3BvcnQgKyAxLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAzOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwMzoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKTsKK2NsZWFudXAyOgorCWNsb3NlKGVuZHAtPmxvY2FsX3J0Y3AuZmQpOworCWVuZHAtPmxvY2FsX3J0Y3AuZmQgPSAtMTsKK2NsZWFudXAxOgorCWNsb3NlKGVuZHAtPmxvY2FsX3J0cC5mZCk7CisJZW5kcC0+bG9jYWxfcnRwLmZkID0gLTE7CitjbGVhbnVwMDoKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBtZ2NwX2JpbmRfcnRwX3BvcnQoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsIGludCBydHBfcG9ydCkKK3sKKwllbmRwLT5ydHBfcG9ydCA9IHJ0cF9wb3J0OworCXJldHVybiBiaW5kX3J0cChlbmRwKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlZjU0NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCitlbnVtIG1nY3BfY29ubmVjdGlvbl9tb2RlIHsKKwlNR0NQX0NPTk5fTk9ORSA9IDAsCisJTUdDUF9DT05OX1JFQ1ZfT05MWSA9IDEsCisJTUdDUF9DT05OX1NFTkRfT05MWSA9IDIsCisJTUdDUF9DT05OX1JFQ1ZfU0VORCA9IE1HQ1BfQ09OTl9SRUNWX09OTFkgfCBNR0NQX0NPTk5fU0VORF9PTkxZLAorfTsKKworLyoqCisgKiBNYWNybyBmb3IgdG9rZW5pemluZyBNR0NQIG1lc3NhZ2VzIGFuZCBTRFAgaW4gb25lIGdvLgorICoKKyAqLworI2RlZmluZSBNU0dfVE9LRU5JWkVfU1RBUlQgXAorCWxpbmVfc3RhcnQgPSAwOwkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sM2xlbihtc2cpOyArK2kpIHsJCQlcCisJCS8qIHdlIGhhdmUgYSBsaW5lIGVuZCAqLwkJCVwKKwkJaWYgKG1zZy0+bDNoW2ldID09ICdcbicpIHsJCQlcCisJCQkvKiBza2lwIHRoZSBmaXJzdCBsaW5lICovCQlcCisJCQlpZiAobGluZV9zdGFydCA9PSAwKSB7CQkJXAorCQkJCWxpbmVfc3RhcnQgPSBpICsgMTsJCVwKKwkJCQljb250aW51ZTsJCQlcCisJCQl9CQkJCQlcCisJCQkJCQkJCVwKKwkJCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBwcm9wZXIgcGFyYW0gKi8JXAorCQkJaWYgKGkgLSBsaW5lX3N0YXJ0ID09IDEgJiYgbXNnLT5sM2hbbGluZV9zdGFydF0gPT0gJ1xyJykgeyBcCisJCQl9IGVsc2UgaWYgKGkgLSBsaW5lX3N0YXJ0ID4gMgkJXAorCQkJICAgICYmIGlzbG93ZXIobXNnLT5sM2hbbGluZV9zdGFydF0pCVwKKwkJCSAgICAmJiBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMV0gPT0gJz0nKSB7IFwKKwkJCX0gZWxzZSBpZiAoaSAtIGxpbmVfc3RhcnQgPCAzCQlcCisJCQkgICAgfHwgbXNnLT5sM2hbbGluZV9zdGFydCArIDFdICE9ICc6JwlcCisJCQkgICAgfHwgbXNnLT5sM2hbbGluZV9zdGFydCArIDJdICE9ICcgJykJXAorCQkJCWdvdG8gZXJyb3I7CQkJXAorCQkJCQkJCQlcCisJCQltc2ctPmwzaFtpXSA9ICdcMCc7CQkJXAorCQkJaWYgKG1zZy0+bDNoW2ktMV0gPT0gJ1xyJykJCVwKKwkJCQltc2ctPmwzaFtpLTFdID0gJ1wwJzsKKworI2RlZmluZSBNU0dfVE9LRU5JWkVfRU5EIFwKKwkJCWxpbmVfc3RhcnQgPSBpICsgMTsgXAorCQl9CQkJICAgIFwKKwl9CisKKworc3RydWN0IG1nY3BfbXNnX3B0ciB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgbWdjcF9yZXF1ZXN0IHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBtc2diICooKmhhbmRsZV9yZXF1ZXN0KSAoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworCWNoYXIgKmRlYnVnX25hbWU7Cit9OworCisjZGVmaW5lIE1HQ1BfUkVRVUVTVChOQU1FLCBSRVEsIERFQlVHX05BTUUpIFwKKwl7IC5uYW1lID0gTkFNRSwgLmhhbmRsZV9yZXF1ZXN0ID0gUkVRLCAuZGVidWdfbmFtZSA9IERFQlVHX05BTUUgfSwKKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfYXVkaXRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfY3JlYXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9kZWxldGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX21vZGlmeV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworCitzdGF0aWMgaW50IGdlbmVyYXRlX2NhbGxfaWQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGk7CisKKwkvKiB1c2UgdGhlIGNhbGwgaWQgKi8KKwkrK2NmZy0+bGFzdF9jYWxsX2lkOworCisJLyogaGFuZGxlIHdyYXAgYXJvdW5kICovCisJaWYgKGNmZy0+bGFzdF9jYWxsX2lkID09IENJX1VOVVNFRCkKKwkJKytjZmctPmxhc3RfY2FsbF9pZDsKKworCS8qIGNhbGxzdGFjayBjYW4gb25seSBiZSBvZiBzaXplIG51bWJlcl9vZl9lbmRwb2ludHMgKi8KKwkvKiB2ZXJpZnkgdGhhdCB0aGUgY2FsbCBpZCBpcyBmcmVlLCBlLmcuIGluIGNhc2Ugb2Ygb3ZlcnJ1biAqLworCWZvciAoaSA9IDE7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkKKwkJaWYgKGNmZy0+ZW5kcG9pbnRzW2ldLmNpID09IGNmZy0+bGFzdF9jYWxsX2lkKQorCQkJcmV0dXJuIGdlbmVyYXRlX2NhbGxfaWQoY2ZnKTsKKworCXJldHVybiBjZmctPmxhc3RfY2FsbF9pZDsKK30KKworLyogRklYSU1FL1RPRE86IG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgcGVuZGluZyB0cmFuc2FjdGlvbnMgYW5kIGNoZWNrIHRoYXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2VuZXJhdGVfdHJhbnNhY3Rpb25faWQoKQoreworCXJldHVybiBhYnMocmFuZCgpKTsKK30KKworLyoKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBoYW5kbGluZyB2YXJpb3VzCisgKiBtZXNzYWdlcy4gSW4gdGhlIGZ1dHVyZSB0aGlzIG1pZ2h0IGJlIGJpbmFyeSBzb3J0ZWQKKyAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1nY3BfcmVxdWVzdCBtZ2NwX3JlcXVlc3RzIFtdID0geworCU1HQ1BfUkVRVUVTVCgiQVVFUCIsIGhhbmRsZV9hdWRpdF9lbmRwb2ludCwgIkF1ZGl0RW5kcG9pbnQiKQorCU1HQ1BfUkVRVUVTVCgiQ1JDWCIsIGhhbmRsZV9jcmVhdGVfY29uLCAiQ3JlYXRlQ29ubmVjdGlvbiIpCisJTUdDUF9SRVFVRVNUKCJETENYIiwgaGFuZGxlX2RlbGV0ZV9jb24sICJEZWxldGVDb25uZWN0aW9uIikKKwlNR0NQX1JFUVVFU1QoIk1EQ1giLCBoYW5kbGVfbW9kaWZ5X2NvbiwgIk1vZGlmaXlDb25uZWN0aW9uIikKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqbWdjcF9tc2diX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKDQwOTYsIDEyOCwgIk1HQ1AgbXNnIik7CisJaWYgKCFtc2cpCisJICAgIExPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gbXNnYiBmb3IgTUdDUCBkYXRhLlxuIik7CisKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zLAorCQkJCSAgICBjb25zdCBjaGFyICpkYXRhKQoreworCWludCBsZW47CisJc3RydWN0IG1zZ2IgKnJlczsKKworCXJlcyA9IG1nY3BfbXNnYl9hbGxvYygpOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYXRhKSB7CisJCWxlbiA9IHNucHJpbnRmKChjaGFyICopIHJlcy0+ZGF0YSwgMjA0OCwgIiVkICVzXG4lcyIsIGNvZGUsIHRyYW5zLCBkYXRhKTsKKwl9IGVsc2UgeworCQlsZW4gPSBzbnByaW50ZigoY2hhciAqKSByZXMtPmRhdGEsIDIwNDgsICIlZCAlc1xuIiwgY29kZSwgdHJhbnMpOworCX0KKworCXJlcy0+bDJoID0gbXNnYl9wdXQocmVzLCBsZW4pOworCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJTZW5kaW5nIHJlc3BvbnNlOiBjb2RlOiAlZCBmb3IgJyVzJ1xuIiwgY29kZSwgcmVzLT5sMmgpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqY3JlYXRlX3Jlc3BvbnNlKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zKQoreworCXJldHVybiBtZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoY29kZSwgbXNnLCB0cmFucywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnNfaWQpCit7CisJY29uc3QgY2hhciAqYWRkciA9IGVuZHAtPmNmZy0+bG9jYWxfaXA7CisJY2hhciBzZHBfcmVjb3JkWzQwOTZdOworCisJaWYgKCFhZGRyKQorCQlhZGRyID0gZW5kcC0+Y2ZnLT5zb3VyY2VfYWRkcjsKKworCXNucHJpbnRmKHNkcF9yZWNvcmQsIHNpemVvZihzZHBfcmVjb3JkKSAtIDEsCisJCQkiSTogJWRcblxuIgorCQkJInY9MFxyXG4iCisJCQkiYz1JTiBJUDQgJXNcclxuIgorCQkJIm09YXVkaW8gJWQgUlRQL0FWUCAlZFxyXG4iCisJCQkiYT1ydHBtYXA6JWQgJXNcclxuIiwKKwkJCWVuZHAtPmNpLCBhZGRyLCBlbmRwLT5ydHBfcG9ydCwKKwkJCWVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsIGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsCisJCSAgICAgICAgZW5kcC0+Y2ZnLT5hdWRpb19uYW1lKTsKKwlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKDIwMCwgbXNnLCB0cmFuc19pZCwgc2RwX3JlY29yZCk7Cit9CisKKy8qIHNlbmQgYSBzdGF0aWMgcmVjb3JkICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisJaW50IGxlbjsKKworCW1zZyA9IG1nY3BfbXNnYl9hbGxvYygpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNucHJpbnRmKChjaGFyICopIG1zZy0+ZGF0YSwgMjA0OCwKKwkJCSJSU0lQICV1ICpAbWd3IE1HQ1AgMS4wXG4iCisJCQkiUk06IHJlc3RhcnRcbiIsIGdlbmVyYXRlX3RyYW5zYWN0aW9uX2lkKCkpOworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW4pOworCXJldHVybiBtc2c7Cit9CisKKy8qCisgKiBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZXM6CisgKiAgIC0gdGhpcyBjYW4gYmUgYSBjb21tYW5kIChmb3VyIGxldHRlcnMsIHNwYWNlLCB0cmFuc2FjdGlvbiBpZCkKKyAqICAgLSBvciBhIHJlc3BvbnNlICh0aHJlZSBudW1iZXJzLCBzcGFjZSwgdHJhbnNhY3Rpb24gaWQpCisgKi8KK3N0cnVjdCBtc2diICptZ2NwX2hhbmRsZV9tZXNzYWdlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworICAgICAgICBpbnQgY29kZTsKKwlzdHJ1Y3QgbXNnYiAqcmVzcCA9IE5VTEw7CisKKwlpZiAobXNnLT5sZW4gPCA0KSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJtZ3MgdG9vIHNob3J0OiAlZFxuIiwgbXNnLT5sZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgICAgLyogYXR0ZW1wdCB0byB0cmVhdCBpdCBhcyBhIHJlc3BvbnNlICovCisgICAgICAgIGlmIChzc2NhbmYoKGNvbnN0IGNoYXIgKikmbXNnLT5kYXRhWzBdLCAiJTNkICUqcyIsICZjb2RlKSA9PSAxKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJSZXNwb25zZTogQ29kZTogJWRcbiIsIGNvZGUpOworCX0gZWxzZSB7CisJCWludCBpLCBoYW5kbGVkID0gMDsKKwkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbNF07CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1nY3BfcmVxdWVzdHMpOyArK2kpCisJCQlpZiAoc3RybmNtcChtZ2NwX3JlcXVlc3RzW2ldLm5hbWUsIChjb25zdCBjaGFyICopICZtc2ctPmRhdGFbMF0sIDQpID09IDApIHsKKwkJCQloYW5kbGVkID0gMTsKKwkJCQlyZXNwID0gbWdjcF9yZXF1ZXN0c1tpXS5oYW5kbGVfcmVxdWVzdChjZmcsIG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICghaGFuZGxlZCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNU0cgd2l0aCB0eXBlOiAnJS40cycgbm90IGhhbmRsZWRcbiIsICZtc2ctPmRhdGFbMF0pOworCQl9CisJfQorCisJcmV0dXJuIHJlc3A7Cit9CisKKy8qIHN0cmluZyB0b2tlbml6ZXIgZm9yIHRoZSBwb29yICovCitzdGF0aWMgaW50IGZpbmRfbXNnX3BvaW50ZXJzKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0cnMsIGludCBwdHJzX2xlbmd0aCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCisJaW50IHdoaXRlc3BhY2UgPSAxOworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wzbGVuKG1zZykgJiYgcHRyc19sZW5ndGggPiAwOyArK2kpIHsKKwkJLyogaWYgd2UgaGF2ZSBhIHNwYWNlIHdlIGZvdW5kIGFuIGVuZCAqLworCQlpZiAobXNnLT5sM2hbaV0JPT0gJyAnIHx8IG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykgeworCQkJaWYgKCF3aGl0ZXNwYWNlKSB7CisJCQkJKytmb3VuZDsKKwkJCQl3aGl0ZXNwYWNlID0gMTsKKwkJCQlwdHJzLT5sZW5ndGggPSBpIC0gcHRycy0+c3RhcnQgLSAxOworCQkJCSsrcHRyczsKKwkJCQktLXB0cnNfbGVuZ3RoOworCQkJfSBlbHNlIHsKKwkJCSAgICAvKiBza2lwIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZSAqLworCQkJfQorCisJCQkvKiBsaW5lIGVuZC4uLiBzdG9wICovCisJCQlpZiAobXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykgeworCQkJLyogbGluZSBlbmQsIGJlIGRvbmUgKi8KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHdoaXRlc3BhY2UpIHsKKwkJCXdoaXRlc3BhY2UgPSAwOworCQkJcHRycy0+c3RhcnQgPSBpOworCQl9CisJfQorCisJaWYgKHB0cnNfbGVuZ3RoID09IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZmluZF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgY29uc3QgY2hhciAqbWdjcCkKK3sKKwljaGFyICplbmRwdHIgPSBOVUxMOworCXVuc2lnbmVkIGludCBndyA9IElOVF9NQVg7CisKKwlndyA9IHN0cnRvdWwobWdjcCwgJmVuZHB0ciwgMTYpOworCWlmIChndyA9PSAwIHx8IGd3ID49IGNmZy0+bnVtYmVyX2VuZHBvaW50cyB8fCBzdHJjbXAoZW5kcHRyLCAiQG1ndyIpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk5vdCBhYmxlIHRvIGZpbmQgZW5kcG9pbnQ6ICclcydcbiIsIG1nY3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJmNmZy0+ZW5kcG9pbnRzW2d3XTsKK30KKworc3RhdGljIGludCBhbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRyLCBpbnQgc2l6ZSwKKwkJCSAgY29uc3QgY2hhciAqKnRyYW5zYWN0aW9uX2lkLCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKmVuZHApCit7CisJaW50IGZvdW5kOworCisJKnRyYW5zYWN0aW9uX2lkID0gIjAwMDAwMCI7CisKKwlpZiAoc2l6ZSA8IDMpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gcHRyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvdW5kID0gZmluZF9tc2dfcG9pbnRlcnMobXNnLCBwdHIsIHNpemUpOworCisJaWYgKGZvdW5kIDw9IDMpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkdhdGV3YXk6IE5vdCBlbm91Z2ggcGFyYW1zLiBGb3VuZDogJWRcbiIsIGZvdW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogcmVwbGFjZSB0aGUgc3BhY2Ugd2l0aCBcMC4gdGhlIG1haW4gbWV0aG9kIGd1cmFudGVzcyB0aGF0CisJICogd2Ugc3RpbGwgaGF2ZSArIDEgZm9yIG51bGwgdGVybWluYXRpb24KKwkgKi8KKwltc2ctPmwzaFtwdHJbM10uc3RhcnQgKyBwdHJbM10ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clsyXS5zdGFydCArIHB0clsyXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzFdLnN0YXJ0ICsgcHRyWzFdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMF0uc3RhcnQgKyBwdHJbMF0ubGVuZ3RoICsgMV0gPSAnXDAnOworCisJaWYgKHN0cm5jbXAoIjEuMCIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clszXS5zdGFydF0sIDMpICE9IDAKKwkgICAgfHwgc3RybmNtcCgiTUdDUCIsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsyXS5zdGFydF0sIDQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIldyb25nIE1HQ1AgdmVyc2lvbi4gTm90IGhhbmRsaW5nOiAnJXMnICclcydcbiIsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbM10uc3RhcnRdLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzJdLnN0YXJ0XSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdHJhbnNhY3Rpb25faWQgPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMF0uc3RhcnRdOworCSplbmRwID0gZmluZF9lbmRwb2ludChjZmcsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsxXS5zdGFydF0pOworCXJldHVybiAqZW5kcCA9PSBOVUxMOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jYWxsX2lkKGNvbnN0IHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkJICBjb25zdCBjaGFyICpjYWxsaWQpCit7CisJaWYgKHN0cmNtcChlbmRwLT5jYWxsaWQsIGNhbGxpZCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiQ2FsbElEcyBkb2VzIG5vdCBtYXRjaCBvbiAweCV4LiAnJXMnICE9ICclcydcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNhbGxpZCwgY2FsbGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaShjb25zdCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJICAgICBjb25zdCBjaGFyICpjaSkKK3sKKwlpZiAoYXRvaShjaSkgIT0gZW5kcC0+Y2kpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkNvbm5lY3Rpb25JZGVudGlmaWVycyBkbyBub3QgbWF0Y2ggb24gMHgleC4gJWQgIT0gJXNcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNpLCBjaSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfYXVkaXRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCByZXNwb25zZTsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKworCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkgICAgcmVzcG9uc2UgPSA1MDA7CisJZWxzZQorCSAgICByZXNwb25zZSA9IDIwMDsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UocmVzcG9uc2UsICJBVUVQIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2Nvbm5fbW9kZShjb25zdCBjaGFyKiBtc2csIGludCAqY29ubl9tb2RlKQoreworCWludCByZXQgPSAwOworCWlmIChzdHJjbXAobXNnLCAicmVjdm9ubHkiKSA9PSAwKQorCQkqY29ubl9tb2RlID0gTUdDUF9DT05OX1JFQ1ZfT05MWTsKKwllbHNlIGlmIChzdHJjbXAobXNnLCAic2VuZHJlY3YiKSA9PSAwKQorCQkqY29ubl9tb2RlID0gTUdDUF9DT05OX1JFQ1ZfU0VORDsKKwllbHNlIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIlVua25vd24gY29ubmVjdGlvbiBtb2RlOiAnJXMnXG4iLCBtc2cpOworCQlyZXQgPSAtMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9jcmVhdGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKwlpbnQgcG9ydDsKKworCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpICE9IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgYWxyZWFkeSB1c2VkLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJfQorCisJLyogcGFyc2UgQ2FsbElEIEM6IGFuZCBMb2NhbFBhcmFtZXRlcnMgTDogKi8KKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnTCc6CisJCWVuZHAtPmxvY2FsX29wdGlvbnMgPSB0YWxsb2Nfc3RyZHVwKGNmZy0+ZW5kcG9pbnRzLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKTsKKwkJYnJlYWs7CisJY2FzZSAnQyc6CisJCWVuZHAtPmNhbGxpZCA9IHRhbGxvY19zdHJkdXAoY2ZnLT5lbmRwb2ludHMsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pOworCQlicmVhazsKKwljYXNlICdNJzoKKwkJaWYgKHBhcnNlX2Nvbm5fbW9kZSgoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10sCisJCQkgICAgJmVuZHAtPmNvbm5fbW9kZSkgIT0gMCkgeworCQkgICAgZXJyb3JfY29kZSA9IDUxNzsKKwkJICAgIGdvdG8gZXJyb3IyOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIGluaXRpYWxpemUgKi8KKwllbmRwLT5uZXRfcnRwID0gZW5kcC0+bmV0X3J0Y3AgPSBlbmRwLT5idHNfcnRwID0gZW5kcC0+YnRzX3J0Y3AgPSAwOworCisJLyogc2V0IHRvIHplcm8gdW50aWwgd2UgZ2V0IHRoZSBpbmZvICovCisJbWVtc2V0KCZlbmRwLT5yZW1vdGUsIDAsIHNpemVvZihlbmRwLT5yZW1vdGUpKTsKKworCS8qIGJpbmQgdG8gdGhlIHBvcnQgbm93ICovCisJcG9ydCA9IHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGNmZy0+cnRwX2Jhc2VfcG9ydCk7CisJaWYgKGNmZy0+ZWFybHlfYmluZCkKKwkJZW5kcC0+cnRwX3BvcnQgPSBwb3J0OworCWVsc2UgaWYgKG1nY3BfYmluZF9ydHBfcG9ydChlbmRwLCBwb3J0KSAhPSAwKQorCQlnb3RvIGVycm9yMjsKKworCS8qIGFzc2lnbiBhIGxvY2FsIGNhbGwgaWRlbnRpZmllciBvciBmYWlsICovCisJZW5kcC0+Y2kgPSBnZW5lcmF0ZV9jYWxsX2lkKGNmZyk7CisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkKKwkJZ290byBlcnJvcjI7CisKKwllbmRwLT5idHNfcGF5bG9hZF90eXBlID0gY2ZnLT5hdWRpb19wYXlsb2FkOworCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9DUkNYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNSQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ3JlYXRpbmcgZW5kcG9pbnQgb246IDB4JXggQ0k6ICV1IHBvcnQ6ICV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNpLCBlbmRwLT5ydHBfcG9ydCk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0NSQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoZW5kcCwgIkNSQ1giLCB0cmFuc19pZCk7CitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJDUkNYIiwgdHJhbnNfaWQpOworCitlcnJvcjI6CisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJSZXNvdXJjZSBlcnJvciBvbiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkNSQ1giLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX21vZGlmeV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCisJZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgbm90IGhvbGRpbmcgYSBjb25uZWN0aW9uLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCX0KKworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdDJzogeworCQlpZiAodmVyaWZ5X2NhbGxfaWQoZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdJJzogeworCQlpZiAodmVyaWZ5X2NpKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnTCc6CisJCS8qIHNraXAgKi8KKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCWlmIChwYXJzZV9jb25uX21vZGUoKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdLAorCQkJICAgICZlbmRwLT5jb25uX21vZGUpICE9IDApIHsKKwkJICAgIGVycm9yX2NvZGUgPSA1MTc7CisJCSAgICBnb3RvIGVycm9yMzsKKwkJfQorCQlicmVhazsKKwljYXNlICdcMCc6CisJCS8qIFNEUCBmaWxlIGJlZ2lucyAqLworCQlicmVhazsKKwljYXNlICdhJzoKKwljYXNlICdvJzoKKwljYXNlICdzJzoKKwljYXNlICd0JzoKKwljYXNlICd2JzoKKwkJLyogc2tpcCB0aGVzZSBTRFAgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlICdtJzogeworCQlpbnQgcG9ydDsKKwkJaW50IHBheWxvYWQ7CisJCWNvbnN0IGNoYXIgKnBhcmFtID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydF07CisKKwkJaWYgKHNzY2FuZihwYXJhbSwgIm09YXVkaW8gJWQgUlRQL0FWUCAlZCIsICZwb3J0LCAmcGF5bG9hZCkgPT0gMikgeworCQkJZW5kcC0+bmV0X3J0cCA9IGh0b25zKHBvcnQpOworCQkJZW5kcC0+bmV0X3J0Y3AgPSBodG9ucyhwb3J0ICsgMSk7CisJCQllbmRwLT5uZXRfcGF5bG9hZF90eXBlID0gcGF5bG9hZDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSAnYyc6IHsKKwkJY2hhciBpcHY0WzE2XTsKKwkJY29uc3QgY2hhciAqcGFyYW0gPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0XTsKKworCQlpZiAoc3NjYW5mKHBhcmFtLCAiYz1JTiBJUDQgJTE1cyIsIGlwdjQpID09IDEpIHsKKwkJCWluZXRfYXRvbihpcHY0LCAmZW5kcC0+cmVtb3RlKTsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9NRENYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1EQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIk1EQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBtb2RpZnkgKi8KKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1vZGlmaWVkIGVuZHBvaW50IG9uOiAweCV4IFNlcnZlcjogJXM6JXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgaW5ldF9udG9hKGVuZHAtPnJlbW90ZSksIG50b2hzKGVuZHAtPm5ldF9ydHApKTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfTURDWCwgZW5kcC0+cnRwX3BvcnQpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoZW5kcCwgIk1EQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGksIG1zZy0+bDNoW2xpbmVfc3RhcnRdKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCitlcnJvcjM6CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfZGVsZXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBub3QgdXNlZC4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnQyc6IHsKKwkJaWYgKHZlcmlmeV9jYWxsX2lkKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnSSc6IHsKKwkJaWYgKHZlcmlmeV9jaShlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJETENYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJETENYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogZnJlZSB0aGUgY29ubmVjdGlvbiAqLworCW1nY3BfZnJlZV9lbmRwKGVuZHApOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9ETENYLCBlbmRwLT5ydHBfcG9ydCk7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDI1MCwgIkRMQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMzoKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworfQorCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisKKwljZmcgPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgbWdjcF9jb25maWcpOworCWlmICghY2ZnKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gYWxsb2NhdGUgY29uZmlnLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNmZy0+c291cmNlX3BvcnQgPSAyNDI3OworCWNmZy0+c291cmNlX2FkZHIgPSB0YWxsb2Nfc3RyZHVwKGNmZywgIjAuMC4wLjAiKTsKKwljZmctPmF1ZGlvX25hbWUgPSB0YWxsb2Nfc3RyZHVwKGNmZywgIkdTTS1FRlIvODAwMCIpOworCWNmZy0+YXVkaW9fcGF5bG9hZCA9IDk3OworCWNmZy0+cnRwX2Jhc2VfcG9ydCA9IFJUUF9QT1JUX0RFRkFVTFQ7CisKKwlyZXR1cm4gY2ZnOworfQorCitpbnQgbWdjcF9lbmRwb2ludHNfYWxsb2NhdGUoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGk7CisKKwkvKiBJbml0aWFsaXplIGFsbCBlbmRwb2ludHMgKi8KKwljZmctPmVuZHBvaW50cyA9IF90YWxsb2NfemVyb19hcnJheShjZmcsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWdjcF9lbmRwb2ludCksCisJCQkJICAgICAgIGNmZy0+bnVtYmVyX2VuZHBvaW50cywgImVuZHBvaW50cyIpOworCWlmICghY2ZnLT5lbmRwb2ludHMpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQljZmctPmVuZHBvaW50c1tpXS5sb2NhbF9ydHAuZmQgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubG9jYWxfcnRjcC5mZCA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5jaSA9IENJX1VOVVNFRDsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uY2ZnID0gY2ZnOworCQljZmctPmVuZHBvaW50c1tpXS5uZXRfcGF5bG9hZF90eXBlID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmJ0c19wYXlsb2FkX3R5cGUgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCkKK3sKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkRlbGV0aW5nIGVuZHBvaW50IG9uOiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCWVuZHAtPmNpPSBDSV9VTlVTRUQ7CisKKwlpZiAoZW5kcC0+Y2FsbGlkKSB7CisJCXRhbGxvY19mcmVlKGVuZHAtPmNhbGxpZCk7CisJCWVuZHAtPmNhbGxpZCA9IE5VTEw7CisJfQorCisJaWYgKGVuZHAtPmxvY2FsX29wdGlvbnMpIHsKKwkJdGFsbG9jX2ZyZWUoZW5kcC0+bG9jYWxfb3B0aW9ucyk7CisJCWVuZHAtPmNhbGxpZCA9IE5VTEw7CisJfQorCisJaWYgKCFlbmRwLT5jZmctPmVhcmx5X2JpbmQpIHsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCk7CisJCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydGNwKTsKKwl9CisKKwllbmRwLT5uZXRfcnRwID0gZW5kcC0+bmV0X3J0Y3AgPSBlbmRwLT5idHNfcnRwID0gZW5kcC0+YnRzX3J0Y3AgPSAwOworCWVuZHAtPm5ldF9wYXlsb2FkX3R5cGUgPSBlbmRwLT5idHNfcGF5bG9hZF90eXBlID0gLTE7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzYjNjZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RhdGljIHN0cnVjdCBtZ2NwX2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCisvKgorICogdnR5IGNvZGUgZm9yIG1nY3AgYmVsb3cKKyAqLworc3RydWN0IGNtZF9ub2RlIG1nY3Bfbm9kZSA9IHsKKwlNR0NQX05PREUsCisJIiVzKG1nY3ApIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX21nY3Aoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibWdjcCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+bG9jYWxfaXApCisJCXZ0eV9vdXQodnR5LCAiIGxvY2FsIGlwICVzJXMiLCBnX2NmZy0+bG9jYWxfaXAsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmJ0c19pcCkKKwkJdnR5X291dCh2dHksICIgIGJ0cyBpcCAlcyVzIiwgZ19jZmctPmJ0c19pcCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIGlwICVzJXMiLCBnX2NmZy0+c291cmNlX2FkZHIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBwb3J0ICV1JXMiLCBnX2NmZy0+c291cmNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBlYXJseSAldSVzIiwgISFnX2NmZy0+ZWFybHlfYmluZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBydHAgYmFzZSAldSVzIiwgZ19jZmctPnJ0cF9iYXNlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyICV1JXMiLCBnX2NmZy0+YXVkaW9fcGF5bG9hZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lICVzJXMiLCBnX2NmZy0+YXVkaW9fbmFtZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBsb29wICV1JXMiLCAhIWdfY2ZnLT5hdWRpb19sb29wLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGVuZHBvaW50cyAldSVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmZvcndhcmRfaXApCisJCXZ0eV9vdXQodnR5LCAiIGZvcndhcmQgYXVkaW8gaXAgJXMlcyIsIGdfY2ZnLT5mb3J3YXJkX2lwLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX3BvcnQgIT0gMCkKKwkJdnR5X291dCh2dHksICIgZm9yd2FyZCBhdWRpbyBwb3J0ICVkJXMiLCBnX2NmZy0+Zm9yd2FyZF9wb3J0LCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfbWNncCwgc2hvd19tZ2NwX2NtZCwgInNob3cgbWdjcCIsCisgICAgICBTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTUdDUCBNZWRpYSBHYXRld2F5IikKK3sKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiTUdDUCBpcyB1cCBhbmQgcnVubmluZyB3aXRoICV1IGVuZHBvaW50czolcyIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzIC0gMSwgVlRZX05FV0xJTkUpOworCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCXZ0eV9vdXQodnR5LCAiIEVuZHBvaW50IDB4JS4yeDogQ0k6ICVkIG5ldDogJXUvJXUgYnRzOiAldS8ldSVzIiwKKwkJCWksIGVuZHAtPmNpLAorCQkJbnRvaHMoZW5kcC0+bmV0X3J0cCksIG50b2hzKGVuZHAtPm5ldF9ydGNwKSwKKwkJCW50b2hzKGVuZHAtPmJ0c19ydHApLCBudG9ocyhlbmRwLT5idHNfcnRjcCksIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwLAorICAgICAgY2ZnX21nY3BfY21kLAorICAgICAgIm1nY3AiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgTUdDUCIpCit7CisJdnR5LT5ub2RlID0gTUdDUF9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbG9jYWxfaXAsCisgICAgICBjZmdfbWdjcF9sb2NhbF9pcF9jbWQsCisgICAgICAibG9jYWwgaXAgSVAiLAorICAgICAgIlNldCB0aGUgSVAgdG8gYmUgdXNlZCBpbiBTRFAgcmVjb3JkcyIpCit7CisJaWYgKGdfY2ZnLT5sb2NhbF9pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmxvY2FsX2lwKTsKKwlnX2NmZy0+bG9jYWxfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2J0c19pcCwKKyAgICAgIGNmZ19tZ2NwX2J0c19pcF9jbWQsCisgICAgICAiYnRzIGlwIElQIiwKKyAgICAgICJTZXQgdGhlIElQIG9mIHRoZSBCVFMgZm9yIFJUUCBmb3J3YXJkaW5nIikKK3sKKwlpZiAoZ19jZmctPmJ0c19pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmJ0c19pcCk7CisJZ19jZmctPmJ0c19pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCWluZXRfYXRvbihnX2NmZy0+YnRzX2lwLCAmZ19jZmctPmJ0c19pbik7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX2lwLAorICAgICAgY2ZnX21nY3BfYmluZF9pcF9jbWQsCisgICAgICAiYmluZCBpcCBJUCIsCisgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIGxvY2FsIGFkZHIiKQoreworCWlmIChnX2NmZy0+c291cmNlX2FkZHIpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5zb3VyY2VfYWRkcik7CisJZ19jZmctPnNvdXJjZV9hZGRyID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX3BvcnQsCisgICAgICBjZmdfbWdjcF9iaW5kX3BvcnRfY21kLAorICAgICAgImJpbmQgcG9ydCA8MC02NTUzND4iLAorICAgICAgIkJpbmQgdGhlIE1HQ1AgdG8gdGhpcyBwb3J0IikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBvcnQgPiA2NTUzNCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIGJpbmQgcG9ydCAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+c291cmNlX3BvcnQgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9lYXJseSwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfZWFybHlfY21kLAorICAgICAgImJpbmQgZWFybHkgKDB8MSkiLAorICAgICAgIkJpbmQgYWxsIFJUUCBwb3J0cyBlYXJseSIpCit7CisJdW5zaWduZWQgaW50IGJpbmQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChiaW5kICE9IDAgJiYgYmluZCAhPSAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgcGFyYW0gbXVzdCBiZSAwIG9yIDEuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+ZWFybHlfYmluZCA9IGJpbmQgPT0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3J0cF9iYXNlX3BvcnQsCisgICAgICBjZmdfbWdjcF9ydHBfYmFzZV9wb3J0X2NtZCwKKyAgICAgICJydHAgYmFzZSA8MC02NTUzND4iLAorICAgICAgIkJhc2UgcG9ydCB0byB1c2UiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocG9ydCA+IDY1NTM0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgYmFzZSBwb3J0ICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5ydHBfYmFzZV9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlciwKKyAgICAgIGNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlcl9jbWQsCisgICAgICAic2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyIDwxLTI1NT4iLAorICAgICAgIlNldCB0aGUgYXVkaW8gY29kZWMgdG8gdXNlIikKK3sKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBheWxvYWQgPiAyNTUpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBwYXlsb2FkIG51bWJlciAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+YXVkaW9fcGF5bG9hZCA9IHBheWxvYWQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQsCisgICAgICAic2RwIGF1ZGlvIHBheWxvYWQgbmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIGF1ZGlvIG5hbWUgdG8gdXNlIikKK3sKKwlpZiAoZ19jZmctPmF1ZGlvX25hbWUpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5hdWRpb19uYW1lKTsKKwlnX2NmZy0+YXVkaW9fbmFtZSA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbG9vcCwKKyAgICAgIGNmZ19tZ2NwX2xvb3BfY21kLAorICAgICAgImxvb3AgKDB8MSkiLAorICAgICAgIkxvb3AgdGhlIGF1ZGlvIikKK3sKKwlnX2NmZy0+YXVkaW9fbG9vcCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9udW1iZXJfZW5kcCwKKyAgICAgIGNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCwKKyAgICAgICJudW1iZXIgZW5kcG9pbnRzIDwwLTY1NTM0PiIsCisgICAgICAiVGhlIG51bWJlciBvZiBlbmRwb2ludHMgdG8gYWxsb2NhdGUuIFRoaXMgaXMgbm90IGR5bmFtaWMuIikKK3sKKwkvKiArIDEgYXMgd2Ugc3RhcnQgY291bnRpbmcgYXQgb25lICovCisJZ19jZmctPm51bWJlcl9lbmRwb2ludHMgPSBhdG9pKGFyZ3ZbMF0pICsgMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfaXAsCisgICAgICBjZmdfbWdjcF9mb3J3YXJkX2lwX2NtZCwKKyAgICAgICJmb3J3YXJkIGF1ZGlvIGlwIElQIiwKKyAgICAgICJGb3J3YXJkIHBhY2tldHMgZnJvbSBhbmQgdG8gdGhlIElQLiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQoreworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmZvcndhcmRfaXApOworCWdfY2ZnLT5mb3J3YXJkX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9mb3J3YXJkX3BvcnQsCisgICAgICBjZmdfbWdjcF9mb3J3YXJkX3BvcnRfY21kLAorICAgICAgImZvcndhcmQgYXVkaW8gcG9ydCA8MS0xNTAwMD4iLAorICAgICAgIkZvcndhcmQgcGFja2V0cyBmcm9tIGFuZCB0byB0aGUgcG9ydC4gVGhpcyBkaXNhYmxlcyBtb3N0IG9mIHRoZSBNR0NQIGZlYXR1cmUuIikKK3sKKwlnX2NmZy0+Zm9yd2FyZF9wb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBtZ2NwX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbWdjcF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX21nY3BfY21kKTsKKwlpbnN0YWxsX25vZGUoJm1nY3Bfbm9kZSwgY29uZmlnX3dyaXRlX21nY3ApOworCWluc3RhbGxfZGVmYXVsdChNR0NQX05PREUpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb2NhbF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9idHNfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9lYXJseV9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9ydHBfYmFzZV9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2xvb3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbnVtYmVyX2VuZHBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9mb3J3YXJkX3BvcnRfY21kKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaSwgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisKKwlpZiAoIWdfY2ZnLT5idHNfaXApCisJCWZwcmludGYoc3RkZXJyLCAiTm8gQlRTIGlwIGFkZHJlc3Mgc3BlY2lmaWVkLiBUaGlzIHdpbGwgYWxsb3cgZXZlcnlvbmUgdG8gY29ubmVjdC5cbiIpOworCisJaWYgKG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKGdfY2ZnKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGVuZHBvaW50czogJWQuIFF1aXR0aW5nLlxuIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBUaGlzIGFwcGxpY2F0aW9uIHN1cHBvcnRzIHR3byBtb2Rlcy4KKyAgICAgICAgICogICAgMS4pIGEgdHJ1ZSBNR0NQIGdhdGV3YXkgd2l0aCBzdXBwb3J0IGZvciBBVUVQLCBDUkNYLCBNRENYLCBETENYCisgICAgICAgICAqICAgIDIuKSBwbGFpbiBmb3J3YXJkaW5nIG9mIFJUUCBwYWNrZXRzIG9uIHRoZSBlbmRwb2ludHMuCisJICogYm90aCBtb2RlcyBhcmUgbXV0dWFsIGV4Y2x1c2l2ZQorCSAqLworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkgeworCQlpbnQgcG9ydCA9IGdfY2ZnLT5ydHBfYmFzZV9wb3J0OworCQlpZiAoZ19jZmctPmZvcndhcmRfcG9ydCAhPSAwKQorCQkJcG9ydCA9IGdfY2ZnLT5mb3J3YXJkX3BvcnQ7CisKKwkJaWYgKCFnX2NmZy0+ZWFybHlfYmluZCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3J3YXJkaW5nIHJlcXVpcmVzIGVhcmx5IGJpbmQuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qCisJCSAqIFN0b3JlIHRoZSBmb3J3YXJkIElQIGFuZCBhc3NpZ24gYSBjaS4gRm9yIGVhcmx5IGJpbmQKKwkJICogdGhlIHNvY2tldHMgd2lsbCBiZSBjcmVhdGVkIGFmdGVyIHRoaXMuCisJCSAqLworCQlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJCWluZXRfYXRvbihnX2NmZy0+Zm9yd2FyZF9pcCwgJmVuZHAtPnJlbW90ZSk7CisJCQllbmRwLT5jaSA9IENJX1VOVVNFRCArIDIzOworCQkJZW5kcC0+bmV0X3J0cCA9IGh0b25zKHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIHBvcnQpKTsKKwkJCWVuZHAtPm5ldF9ydGNwID0gaHRvbnMocnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgcG9ydCkgKyAxKTsKKwkJfQorCisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ29uZmlndXJlZCBmb3IgQXVkaW8gRm9yd2FyZGluZy5cbiIpOworCX0KKworCS8qIGVhcmx5IGJpbmQgKi8KKwlpZiAoZ19jZmctPmVhcmx5X2JpbmQpIHsKKwkJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCQlpbnQgcnRwX3BvcnQ7CisKKwkJCXJ0cF9wb3J0ID0gcnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgZ19jZmctPnJ0cF9iYXNlX3BvcnQpOworCQkJaWYgKG1nY3BfYmluZF9ydHBfcG9ydChlbmRwLCBydHBfcG9ydCkgIT0gMCkgeworCQkJCUxPR1AoRE1HQ1AsIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gYmluZDogJWRcbiIsIHJ0cF9wb3J0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gISFnX2NmZy0+Zm9yd2FyZF9pcDsKK30KKworc3RydWN0IGdzbV9uZXR3b3JrOworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmR1bW15KQoreworCWNtZF9pbml0KDEpOworCXZ0eV9pbml0KCk7CisKKyAgICAgICAgbWdjcF92dHlfaW5pdCgpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tbmNjLmMgYi9vcGVuYnNjL3NyYy9tbmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkNTlhYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21uY2MuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgQW5kcmVhcyBFdmVyc2JlcmcgPEFuZHJlYXMuRXZlcnNiZXJnQHZlcnNhdGVsLmRlPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKwordm9pZCAqdGFsbF9jYWxsX2N0eDsKKworc3RhdGljIHN0cnVjdCBtbmNjX25hbWVzIHsKKwljaGFyICpuYW1lOworCWludCB2YWx1ZTsKK30gbW5jY19uYW1lc1tdID0geworCXsiTU5DQ19TRVRVUF9SRVEiLAkweDAxMDF9LAorCXsiTU5DQ19TRVRVUF9JTkQiLAkweDAxMDJ9LAorCXsiTU5DQ19TRVRVUF9SU1AiLAkweDAxMDN9LAorCXsiTU5DQ19TRVRVUF9DTkYiLAkweDAxMDR9LAorCXsiTU5DQ19TRVRVUF9DT01QTF9SRVEiLDB4MDEwNX0sCisJeyJNTkNDX1NFVFVQX0NPTVBMX0lORCIsMHgwMTA2fSwKKwl7Ik1OQ0NfQ0FMTF9DT05GX0lORCIsCTB4MDEwN30sCisJeyJNTkNDX0NBTExfUFJPQ19SRVEiLAkweDAxMDh9LAorCXsiTU5DQ19QUk9HUkVTU19SRVEiLAkweDAxMDl9LAorCXsiTU5DQ19BTEVSVF9SRVEiLAkweDAxMGF9LAorCXsiTU5DQ19BTEVSVF9JTkQiLAkweDAxMGJ9LAorCXsiTU5DQ19OT1RJRllfUkVRIiwJMHgwMTBjfSwKKwl7Ik1OQ0NfTk9USUZZX0lORCIsCTB4MDEwZH0sCisJeyJNTkNDX0RJU0NfUkVRIiwJMHgwMTBlfSwKKwl7Ik1OQ0NfRElTQ19JTkQiLAkweDAxMGZ9LAorCXsiTU5DQ19SRUxfUkVRIiwJMHgwMTEwfSwKKwl7Ik1OQ0NfUkVMX0lORCIsCTB4MDExMX0sCisJeyJNTkNDX1JFTF9DTkYiLAkweDAxMTJ9LAorCXsiTU5DQ19GQUNJTElUWV9SRVEiLAkweDAxMTN9LAorCXsiTU5DQ19GQUNJTElUWV9JTkQiLAkweDAxMTR9LAorCXsiTU5DQ19TVEFSVF9EVE1GX0lORCIsCTB4MDExNX0sCisJeyJNTkNDX1NUQVJUX0RUTUZfUlNQIiwJMHgwMTE2fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9SRUoiLAkweDAxMTd9LAorCXsiTU5DQ19TVE9QX0RUTUZfSU5EIiwJMHgwMTE4fSwKKwl7Ik1OQ0NfU1RPUF9EVE1GX1JTUCIsCTB4MDExOX0sCisJeyJNTkNDX01PRElGWV9SRVEiLAkweDAxMWF9LAorCXsiTU5DQ19NT0RJRllfSU5EIiwJMHgwMTFifSwKKwl7Ik1OQ0NfTU9ESUZZX1JTUCIsCTB4MDExY30sCisJeyJNTkNDX01PRElGWV9DTkYiLAkweDAxMWR9LAorCXsiTU5DQ19NT0RJRllfUkVKIiwJMHgwMTFlfSwKKwl7Ik1OQ0NfSE9MRF9JTkQiLAkweDAxMWZ9LAorCXsiTU5DQ19IT0xEX0NORiIsCTB4MDEyMH0sCisJeyJNTkNDX0hPTERfUkVKIiwJMHgwMTIxfSwKKwl7Ik1OQ0NfUkVUUklFVkVfSU5EIiwJMHgwMTIyfSwKKwl7Ik1OQ0NfUkVUUklFVkVfQ05GIiwJMHgwMTIzfSwKKwl7Ik1OQ0NfUkVUUklFVkVfUkVKIiwJMHgwMTI0fSwKKwl7Ik1OQ0NfVVNFUklORk9fUkVRIiwJMHgwMTI1fSwKKwl7Ik1OQ0NfVVNFUklORk9fSU5EIiwJMHgwMTI2fSwKKwl7Ik1OQ0NfUkVKX1JFUSIsCTB4MDEyN30sCisJeyJNTkNDX1JFSl9JTkQiLAkweDAxMjh9LAorCisJeyJNTkNDX0JSSURHRSIsCQkweDAyMDB9LAorCXsiTU5DQ19GUkFNRV9SRUNWIiwJMHgwMjAxfSwKKwl7Ik1OQ0NfRlJBTUVfRFJPUCIsCTB4MDIwMn0sCisJeyJNTkNDX0xDSEFOX01PRElGWSIsCTB4MDIwM30sCisKKwl7IkdTTV9UQ0hfRlJBTUUiLAkweDAzMDB9LAorCisJe05VTEwsIDB9IH07CisKK3N0YXRpYyBMTElTVF9IRUFEKGNhbGxfbGlzdCk7CisKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDAwMDAwMDAxOworCitjaGFyICpnZXRfbW5jY19uYW1lKGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG1uY2NfbmFtZXNbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChtbmNjX25hbWVzW2ldLnZhbHVlID09IHZhbHVlKQorCQkJcmV0dXJuIG1uY2NfbmFtZXNbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gIk1OQ0NfVW5rbm93biI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY2FsbChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwpCit7CisJbGxpc3RfZGVsKCZjYWxsLT5lbnRyeSk7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENhbGwgcmVtb3ZlZC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXRhbGxvY19mcmVlKGNhbGwpOworfQorCisKK3N0cnVjdCBnc21fY2FsbCAqZ2V0X2NhbGxfcmVmKHVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fY2FsbCAqY2FsbHQ7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsdCwgJmNhbGxfbGlzdCwgZW50cnkpIHsKKwkJaWYgKGNhbGx0LT5jYWxscmVmID09IGNhbGxyZWYpCisJCQlyZXR1cm4gY2FsbHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIG1uY2Nfc2V0X2NhdXNlKHN0cnVjdCBnc21fbW5jYyAqZGF0YSwgaW50IGxvYywgaW50IHZhbCkKK3sKKwlkYXRhLT5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCWRhdGEtPmNhdXNlLmxvY2F0aW9uID0gbG9jOworCWRhdGEtPmNhdXNlLnZhbHVlID0gdmFsOworfQorCisvKiBvbiBpbmNvbWluZyBjYWxsLCBsb29rIHVwIGRhdGFiYXNlIGFuZCBzZW5kIHNldHVwIHRvIHJlbW90ZSBzdWJzY3IuICovCitzdGF0aWMgaW50IG1uY2Nfc2V0dXBfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKnNldHVwKQoreworCXN0cnVjdCBnc21fbW5jYyBtbmNjOworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKworCS8qIGFscmVhZHkgaGF2ZSByZW1vdGUgY2FsbCAqLworCWlmIChjYWxsLT5yZW1vdGVfcmVmKQorCQlyZXR1cm4gMDsKKwkKKwkvKiB0cmFuc2ZlciBtb2RlIDEgd291bGQgYmUgcGFja2V0IG1vZGUsIHdoaWNoIHdhcyBuZXZlciBzcGVjaWZpZWQgKi8KKwlpZiAoc2V0dXAtPmJlYXJlcl9jYXAubW9kZSAhPSAwKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIFdlIGRvbid0IHN1cHBvcnQgIgorCQkJInBhY2tldCBtb2RlXG4iLCBjYWxsLT5jYWxscmVmKTsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisKKwkvKiB3ZSBjdXJyZW50bHkgb25seSBkbyBzcGVlY2ggKi8KKwlpZiAoc2V0dXAtPmJlYXJlcl9jYXAudHJhbnNmZXIgIT0gR1NNX01OQ0NfQkNBUF9TUEVFQ0gpIHsKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgV2Ugb25seSBzdXBwb3J0ICIKKwkJCSJ2b2ljZSBjYWxsc1xuIiwgY2FsbC0+Y2FsbHJlZik7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCisJLyogY3JlYXRlIHJlbW90ZSBjYWxsICovCisJaWYgKCEocmVtb3RlID0gdGFsbG9jKHRhbGxfY2FsbF9jdHgsIHN0cnVjdCBnc21fY2FsbCkpKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisJbGxpc3RfYWRkX3RhaWwoJnJlbW90ZS0+ZW50cnksICZjYWxsX2xpc3QpOworCXJlbW90ZS0+bmV0ID0gY2FsbC0+bmV0OworCXJlbW90ZS0+Y2FsbHJlZiA9IG5ld19jYWxscmVmKys7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENyZWF0aW5nIG5ldyByZW1vdGUgaW5zdGFuY2UgJXguXG4iLAorCQljYWxsLT5jYWxscmVmLCByZW1vdGUtPmNhbGxyZWYpOworCisJLyogbGluayByZW1vdGUgY2FsbCAqLworCWNhbGwtPnJlbW90ZV9yZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJcmVtb3RlLT5yZW1vdGVfcmVmID0gY2FsbC0+Y2FsbHJlZjsKKworCS8qIG1vZGlmeSBtb2RlICovCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwltbmNjLmxjaGFuX21vZGUgPSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBNb2RpZnkgY2hhbm5lbCBtb2RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19MQ0hBTl9NT0RJRlksICZtbmNjKTsKKworCS8qIHNlbmQgY2FsbCBwcm9jZWVkaW5nICovCisJbWVtc2V0KCZtbmNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW5jYy5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQWNjZXB0aW5nIGNhbGwuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0NBTExfUFJPQ19SRVEsICZtbmNjKTsKKworCS8qIHNlbmQgc2V0dXAgdG8gcmVtb3RlICovCisvLwlzZXR1cC0+ZmllbGRzIHw9IE1OQ0NfRl9TSUdOQUw7CisvLwlzZXR1cC0+c2lnbmFsID0gR1NNNDhfU0lHTkFMX0RJQUxUT05FOworCXNldHVwLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIFNFVFVQIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfU0VUVVBfUkVRLCBzZXR1cCk7CisKK291dF9yZWplY3Q6CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19SRUpfUkVRLCAmbW5jYyk7CisJZnJlZV9jYWxsKGNhbGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1uY2NfYWxlcnRfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKmFsZXJ0KQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCBhbGVydGluZyB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwlhbGVydC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBBTEVSVCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX0FMRVJUX1JFUSwgYWxlcnQpOworfQorCitzdGF0aWMgaW50IG1uY2Nfbm90aWZ5X2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgIHN0cnVjdCBnc21fbW5jYyAqbm90aWZ5KQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCBub3RpZnkgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJbm90aWZ5LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIE5PVElGIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfTk9USUZZX1JFUSwgbm90aWZ5KTsKK30KKworc3RhdGljIGludCBtbmNjX3NldHVwX2NuZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICpjb25uZWN0KQoreworCXN0cnVjdCBnc21fbW5jYyBjb25uZWN0X2FjaywgZnJhbWVfcmVjdjsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGNhbGwtPm5ldDsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKwl1X2ludDMyX3QgcmVmc1syXTsKKworCS8qIGFja25vd2xlZGdlIGNvbm5lY3QgKi8KKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEFja25vd2xlZGdlIFNFVFVQLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19TRVRVUF9DT01QTF9SRVEsICZjb25uZWN0X2Fjayk7CisKKwkvKiBzZW5kIGNvbm5lY3QgbWVzc2FnZSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwljb25uZWN0LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBTZW5kaW5nIENPTk5FQ1QgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1NFVFVQX1JTUCwgY29ubmVjdCk7CisKKwkvKiBicmlkZ2UgdGNoICovCisJcmVmc1swXSA9IGNhbGwtPmNhbGxyZWY7CisJcmVmc1sxXSA9IGNhbGwtPnJlbW90ZV9yZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEJyaWRnaW5nIHdpdGggcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisKKwkvKiBpbiBkaXJlY3QgbW9kZSwgd2UgYWx3YXlzIGhhdmUgdG8gYnJpZGdlIHRoZSBjaGFubmVscyAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19CUklER0UsIHJlZnMpOworCisJLyogcHJveHkgbW9kZSAqLworCWlmICghbmV0LT5oYW5kb3Zlci5hY3RpdmUpIHsKKwkJLyogaW4gdGhlIG5vLWhhbmRvdmVyIGNhc2UsIHdlIGNhbiBicmlkZ2UsIGkuZS4gdXNlCisJCSAqIHRoZSBvbGQgUlRQIHByb3h5IGNvZGUgKi8KKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQlJJREdFLCByZWZzKTsKKwl9IGVsc2UgeworCQkvKiBpbiBjYXNlIG9mIGhhbmRvdmVyLCB3ZSBuZWVkIHRvIHJlLXdyaXRlIHRoZSBSVFAKKwkJICogU1NSQywgc2VxdWVuY2UgYW5kIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIHRodXMKKwkJICogbmVlZCB0byBlbmFibGUgUlRQIHJlY2VpdmUgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCQltZW1zZXQoJmZyYW1lX3JlY3YsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJZnJhbWVfcmVjdi5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwkJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19GUkFNRV9SRUNWLCAmZnJhbWVfcmVjdik7CisJCWZyYW1lX3JlY3YuY2FsbHJlZiA9IGNhbGwtPnJlbW90ZV9yZWY7CisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0ZSQU1FX1JFQ1YsICZmcmFtZV9yZWN2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbW5jY19kaXNjX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSBzdHJ1Y3QgZ3NtX21uY2MgKmRpc2MpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIHJlbGVhc2UgKi8KKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVsZWFzaW5nIGNhbGwgd2l0aCBjYXVzZSAlZFxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgZGlzYy0+Y2F1c2UudmFsdWUpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfUkVMX1JFUSwgZGlzYyk7CisKKwkvKiBzZW5kIGRpc2MgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkgeworCQlyZXR1cm4gMDsKKwl9CisJZGlzYy0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRGlzY29ubmVjdGluZyByZW1vdGUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJcmVtb3RlLT5jYWxscmVmLCBkaXNjLT5jYXVzZS52YWx1ZSk7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19ESVNDX1JFUSwgZGlzYyk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWxfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKnJlbCkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgcmVsZWFzZSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKSB7CisJCWZyZWVfY2FsbChjYWxsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlbC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVsZWFzaW5nIHJlbW90ZSB3aXRoIGNhdXNlICVkXG4iLAorCQljYWxsLT5jYWxscmVmLCByZWwtPmNhdXNlLnZhbHVlKTsKKwltbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfUkVMX1JFUSwgcmVsKTsKKworCWZyZWVfY2FsbChjYWxsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1uY2NfcmVsX2NuZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICpyZWwpCit7CisJZnJlZV9jYWxsKGNhbGwpOworCXJldHVybiAwOworfQorCisvKiByZWNlaXZpbmcgYSBUQ0gvRiBmcmFtZSBmcm9tIHRoZSBCU0MgY29kZSAqLworc3RhdGljIGludCBtbmNjX3Jjdl90Y2hmKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZGZyKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnJlbW90ZV90cmFuczsKKworCXJlbW90ZV90cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihjYWxsLT5uZXQsIGNhbGwtPnJlbW90ZV9yZWYpOworCisJLyogdGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiAqLworCWlmICghcmVtb3RlX3RyYW5zIHx8ICFyZW1vdGVfdHJhbnMtPmxjaGFuKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfRVJST1IsICJObyB0cmFuc2FjdGlvbiBvciB0cmFuc2FjdGlvbiB3aXRob3V0IGxjaGFuPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUlRQIHNvY2tldCBvZiByZW1vdGUgZW5kIGhhcyBtZWFud2hpbGUgZGllZCAqLworCWlmICghcmVtb3RlX3RyYW5zLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBydHBfc2VuZF9mcmFtZShyZW1vdGVfdHJhbnMtPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsIGRmcik7Cit9CisKKworaW50IG1uY2NfcmVjdihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkYXRhID0gYXJnOworCWludCBjYWxscmVmOworCXN0cnVjdCBnc21fY2FsbCAqY2FsbCA9IE5VTEwsICpjYWxsdDsKKwlpbnQgcmMgPSAwOworCisJLyogU3BlY2lhbCBtZXNzYWdlcyAqLworCXN3aXRjaChtc2dfdHlwZSkgeworCX0KKwkKKwkvKiBmaW5kIGNhbGxyZWYgKi8KKwljYWxscmVmID0gZGF0YS0+Y2FsbHJlZjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsdCwgJmNhbGxfbGlzdCwgZW50cnkpIHsKKwkJaWYgKGNhbGx0LT5jYWxscmVmID09IGNhbGxyZWYpIHsKKwkJCWNhbGwgPSBjYWxsdDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogY3JlYXRlIGNhbGxyZWYsIGlmIHNldHVwIGlzIHJlY2VpdmVkICovCisJaWYgKCFjYWxsKSB7CisJCWlmIChtc2dfdHlwZSAhPSBNTkNDX1NFVFVQX0lORCkKKwkJCXJldHVybiAwOyAvKiBkcm9wICovCisJCS8qIGNyZWF0ZSBjYWxsICovCisJCWlmICghKGNhbGwgPSB0YWxsb2NfemVybyh0YWxsX2NhbGxfY3R4LCBzdHJ1Y3QgZ3NtX2NhbGwpKSkgeworCQkJc3RydWN0IGdzbV9tbmNjIHJlbDsKKwkJCQorCQkJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwkJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCQltbmNjX3NlbmQobmV0LCBNTkNDX1JFTF9SRVEsICZyZWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGxpc3RfYWRkX3RhaWwoJmNhbGwtPmVudHJ5LCAmY2FsbF9saXN0KTsKKwkJY2FsbC0+bmV0ID0gbmV0OworCQljYWxsLT5jYWxscmVmID0gY2FsbHJlZjsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENhbGwgY3JlYXRlZC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCX0KKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVjZWl2ZWQgbWVzc2FnZSAlc1xuIiwgY2FsbC0+Y2FsbHJlZiwKKwkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX1NFVFVQX0lORDoKKwkJcmMgPSBtbmNjX3NldHVwX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NFVFVQX0NORjoKKwkJcmMgPSBtbmNjX3NldHVwX2NuZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NFVFVQX0NPTVBMX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0NBTExfQ09ORl9JTkQ6CisJCS8qIHdlIG5vdyBuZWVkIHRvIE1PRElGWSB0aGUgY2hhbm5lbCAqLworCQlkYXRhLT5sY2hhbl9tb2RlID0gR1NNNDhfQ01PREVfU1BFRUNIX0VGUjsKKwkJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19MQ0hBTl9NT0RJRlksIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfQUxFUlRfSU5EOgorCQlyYyA9IG1uY2NfYWxlcnRfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfTk9USUZZX0lORDoKKwkJcmMgPSBtbmNjX25vdGlmeV9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19ESVNDX0lORDoKKwkJcmMgPSBtbmNjX2Rpc2NfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVMX0lORDoKKwljYXNlIE1OQ0NfUkVKX0lORDoKKwkJcmMgPSBtbmNjX3JlbF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRUxfQ05GOgorCQlyYyA9IG1uY2NfcmVsX2NuZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0ZBQ0lMSVRZX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NUQVJUX0RUTUZfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfU1RPUF9EVE1GX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX01PRElGWV9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIE1PRElGWSB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfTU9ESUZZX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfQ05GOgorCQlicmVhazsKKwljYXNlIE1OQ0NfSE9MRF9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIEhPTEQgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX0hPTERfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFVFJJRVZFX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgUkVUUklFVkUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX1JFVFJJRVZFX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCXJjID0gbW5jY19yY3ZfdGNoZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgTWVzc2FnZSB1bmhhbmRsZWRcbiIsIGNhbGxyZWYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ODA0ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMQpAQCAtMCwwICsxLDU0IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIKQEAgLTAsMCArMSw4MiBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlODAwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMgpAQCAtMCwwICsxLDE0OCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDMKKyBidHMgMQorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDIKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMgorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyNAorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2VhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCkBAIC0wLDAgKzEsNDAgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDEgMAorICBiYW5kIEdTTTE4MDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIHRyeCAwCisgICBhcmZjbiA1MTQKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9wYWdpbmcuYyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzc1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKgorICogUmVsZXZhbnQgc3BlY3M6CisgKiAgICAgMTIuMjE6CisgKiAgICAgICAtIDkuNC4xMiBmb3IgQ0NDSCBMb2NhbCBUaHJlc2hvbGQKKyAqCisgKiAgICAgMDUuNTg6CisgKiAgICAgICAtIDguNS4yIENDQ0ggTG9hZCBpbmRpY2F0aW9uCisgKiAgICAgICAtIDkuMy4xNSBQYWdpbmcgTG9hZAorICoKKyAqIEFwcHJvYWNoOgorICogICAgICAgLSBTZW5kIHBhZ2luZyBjb21tYW5kIHRvIHN1YnNjcmliZXIKKyAqICAgICAgIC0gT24gQ2hhbm5lbCBSZXF1ZXN0IHdlIHdpbGwgcmVtZW1iZXIgdGhlIHJlYXNvbgorICogICAgICAgLSBBZnRlciB0aGUgQUNLIHdlIHdpbGwgcmVxdWVzdCB0aGUgaWRlbnRpdHkKKyAqCSAtIFRoZW4gd2Ugd2lsbCBzZW5kIGFzc2lnbiB0aGUgZ3NtX3N1YnNjcmliZXIgYW5kCisgKgkgLSBhbmQgY2FsbCBhIGNhbGxiYWNrCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3ZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjdWxhdGVfZ3JvdXAoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaW50IGNjY2hfY29uZjsKKwlpbnQgYnNfY2NfY2hhbnM7CisJaW50IGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJCisJY2NjaF9jb25mID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZjsKKwlic19jY19jaGFucyA9IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoY2NjaF9jb25mKTsKKwkvKiBjb2RlIHdvcmQgKyAyLCBhcyAyIGNoYW5uZWxzIGVxdWFscyAweDAgKi8KKwlibG9ja3MgPSByc2xfbnVtYmVyX29mX3BhZ2luZ19zdWJjaGFubmVscyhidHMpOworCWdyb3VwID0gZ2V0X3BhZ2luZ19ncm91cChzdHJfdG9faW1zaShzdWJzY3ItPmltc2kpLAorCQkJCQlic19jY19jaGFucywgYmxvY2tzKTsKKwlyZXR1cm4gZ3JvdXA7Cit9CisKKy8qCisgKiBLaWxsIG9uZSBwYWdpbmcgcmVxdWVzdCB1cGRhdGUgdGhlIGludGVybmFsIGxpc3QuLi4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cywKKwkJCQlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICp0b19iZV9kZWxldGVkKQoreworCS8qIFVwZGF0ZSB0aGUgbGFzdF9yZXF1ZXN0IGlmIHRoYXQgaXMgbmVjZXNzYXJ5ICovCisJaWYgKHRvX2JlX2RlbGV0ZWQgPT0gcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KSB7CisJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdC0+ZW50cnkubmV4dDsKKwkJaWYgKCZ0b19iZV9kZWxldGVkLT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKKwkJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9IE5VTEw7CisJfQorCisJYnNjX2RlbF90aW1lcigmdG9fYmVfZGVsZXRlZC0+VDMxMTMpOworCWxsaXN0X2RlbCgmdG9fYmVfZGVsZXRlZC0+ZW50cnkpOworCXN1YnNjcl9wdXQodG9fYmVfZGVsZXRlZC0+c3Vic2NyKTsKKwl0YWxsb2NfZnJlZSh0b19iZV9kZWxldGVkKTsKK30KKworc3RhdGljIHZvaWQgcGFnZV9tcyhzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1bnNpZ25lZCBpbnQgcGFnZV9ncm91cDsKKworCURFQlVHUChEUEFHLCAiR29pbmcgdG8gc2VuZCBwYWdpbmcgY29tbWFuZHM6IGltc2k6ICclcycgdG1zaTogJzB4JXgnXG4iLAorCQlyZXF1ZXN0LT5zdWJzY3ItPmltc2ksIHJlcXVlc3QtPnN1YnNjci0+dG1zaSk7CisKKwlpZiAocmVxdWVzdC0+c3Vic2NyLT50bXNpID09IEdTTV9SRVNFUlZFRF9UTVNJKQorCQltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCByZXF1ZXN0LT5zdWJzY3ItPmltc2kpOworCWVsc2UKKwkJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKKworCXBhZ2VfZ3JvdXAgPSBjYWxjdWxhdGVfZ3JvdXAocmVxdWVzdC0+YnRzLCByZXF1ZXN0LT5zdWJzY3IpOworCXJzbF9wYWdpbmdfY21kKHJlcXVlc3QtPmJ0cywgcGFnZV9ncm91cCwgbWlfbGVuLCBtaSwKKwkJCXJlcXVlc3QtPmNoYW5fdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19tb3ZlX3RvX25leHQoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzKQoreworCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeS5uZXh0OworCWlmICgmcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKK30KKworLyoKKyAqIFRoaXMgaXMga2lja2VkIGJ5IHRoZSBwZXJpb2RpYyBQQUdJTkcgTE9BRCBJbmRpY2F0b3IKKyAqIGNvbWluZyBmcm9tIGFiaXNfcnNsLmMKKyAqCisgKiBXZSBhdHRlbXB0IHRvIGl0ZXJhdGUgb25jZSBvdmVyIHRoZSBsaXN0IG9mIGl0ZW1zIGJ1dAorICogb25seSB1cHRvIGF2YWlsYWJsZV9zbG90cy4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX2hhbmRsZV9wZW5kaW5nX3JlcXVlc3RzKHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cykKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICppbml0aWFsX3JlcXVlc3QgPSBOVUxMOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmN1cnJlbnRfcmVxdWVzdCA9IE5VTEw7CisKKwkvKgorCSAqIERldGVybWluZSBpZiB0aGUgcGVuZGluZ19yZXF1ZXN0cyBsaXN0IGlzIGVtcHR5IGFuZAorCSAqIHJldHVybiB0aGVuLgorCSAqLworCWlmIChsbGlzdF9lbXB0eSgmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykpIHsKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKKwkJLyogc2luY2UgdGhlIGxpc3QgaXMgZW1wdHksIG5vIG5lZWQgdG8gcmVzY2hlZHVsZSB0aGUgdGltZXIgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICghcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KQorCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQ7CisKKwlhc3NlcnQocGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KTsKKwlpbml0aWFsX3JlcXVlc3QgPSBwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3Q7CisJY3VycmVudF9yZXF1ZXN0ID0gaW5pdGlhbF9yZXF1ZXN0OworCisJZG8geworCQkvKiBoYW5kbGUgdGhlIHBhZ2luZyByZXF1ZXN0IG5vdyAqLworCQlwYWdlX21zKGN1cnJlbnRfcmVxdWVzdCk7CisJCXBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cy0tOworCisJCS8qCisJCSAqIG1vdmUgdG8gdGhlIG5leHQgaXRlbS4gV2UgbWlnaHQgd3JhcCBhcm91bmQKKwkJICogdGhpcyBtZWFucyBsYXN0X3JlcXVlc3Qgd2lsbCBiZSBOVUxMIGFuZCB3ZSBqdXN0CisJCSAqIGNhbGwgcGFnaW5nX3BhZ2VfdG9fbmV4dCBhZ2Fpbi4gSXQgaXQgZ3VyYW50ZWVkCisJCSAqIHRoYXQgdGhlIGxpc3QgaXMgbm90IGVtcHR5LgorCQkgKi8KKwkJcGFnaW5nX21vdmVfdG9fbmV4dChwYWdpbmdfYnRzKTsKKwkJaWYgKCFwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpCisJCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cy5uZXh0OworCQljdXJyZW50X3JlcXVlc3QgPSBwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3Q7CisJfSB3aGlsZSAocGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID4gMAorCQkgICAgJiYgIGluaXRpYWxfcmVxdWVzdCAhPSBjdXJyZW50X3JlcXVlc3QpOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZwYWdpbmdfYnRzLT53b3JrX3RpbWVyLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX3dvcmtlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cyA9IGRhdGE7CisKKwlwYWdpbmdfaGFuZGxlX3BlbmRpbmdfcmVxdWVzdHMocGFnaW5nX2J0cyk7Cit9CisKK3ZvaWQgcGFnaW5nX2luaXQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlidHMtPnBhZ2luZy5idHMgPSBidHM7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnBhZ2luZy5wZW5kaW5nX3JlcXVlc3RzKTsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmNiID0gcGFnaW5nX3dvcmtlcjsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmRhdGEgPSAmYnRzLT5wYWdpbmc7CisKKwkvKiBMYXJnZSBudW1iZXIsIHVudGlsIHdlIGdldCBhIHByb3BlciBtZXNzYWdlICovCisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gMTAwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19wZW5kaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHMsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZidHMtPnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KSB7CisJCWlmIChzdWJzY3IgPT0gcmVxLT5zdWJzY3IpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19UMzExM19leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilkYXRhOworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgc2lnX2RhdGE7CisJdm9pZCAqY2Jmbl9wYXJhbTsKKwlnc21fY2JmbiAqY2JmbjsKKworCURFQlVHUChEUEFHLCAiVDMxMTMgZXhwaXJlZCBmb3IgcmVxdWVzdCAlcCAoJXMpXG4iLAorCQlyZXEsIHJlcS0+c3Vic2NyLT5pbXNpKTsKKwkKKwlzaWdfZGF0YS5zdWJzY3IgPSByZXEtPnN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSByZXEtPmJ0czsKKwlzaWdfZGF0YS5sY2hhbgk9IE5VTEw7CisKKwkvKiBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgY2FsbGluZyBjYmZuLCB0byBwcmV2ZW50IGRvdWJsZSBmcmVlICovCisJY2Jmbl9wYXJhbSA9IHJlcS0+Y2Jmbl9wYXJhbTsKKwljYmZuID0gcmVxLT5jYmZuOworCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmcmVxLT5idHMtPnBhZ2luZywgcmVxKTsKKworCWNvdW50ZXJfaW5jKHJlcS0+YnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuZXhwaXJlZCk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19FWFBJUkVELCAmc2lnX2RhdGEpOworCWlmIChjYmZuKQorCQljYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19FWFBJUkVELCBOVUxMLCBOVUxMLAorCQkJICBjYmZuX3BhcmFtKTsKK30KKworc3RhdGljIGludCBfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzX2VudHJ5ID0gJmJ0cy0+cGFnaW5nOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcTsKKworCWlmIChwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KGJ0c19lbnRyeSwgc3Vic2NyKSkgeworCQlERUJVR1AoRFBBRywgIlBhZ2luZyByZXF1ZXN0IGFscmVhZHkgcGVuZGluZ1xuIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCURFQlVHUChEUEFHLCAiU3RhcnQgcGFnaW5nIG9mIHN1YnNjcmliZXIgJWxsdSBvbiBidHMgJWQuXG4iLAorCQlzdWJzY3ItPmlkLCBidHMtPm5yKTsKKwlyZXEgPSB0YWxsb2NfemVybyh0YWxsX3BhZ2luZ19jdHgsIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QpOworCXJlcS0+c3Vic2NyID0gc3Vic2NyX2dldChzdWJzY3IpOworCXJlcS0+YnRzID0gYnRzOworCXJlcS0+Y2hhbl90eXBlID0gdHlwZTsKKwlyZXEtPmNiZm4gPSBjYmZuOworCXJlcS0+Y2Jmbl9wYXJhbSA9IGRhdGE7CisJcmVxLT5UMzExMy5jYiA9IHBhZ2luZ19UMzExM19leHBpcmVkOworCXJlcS0+VDMxMTMuZGF0YSA9IHJlcTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJlcS0+VDMxMTMsIGJ0cy0+bmV0d29yay0+VDMxMTMsIDApOworCWxsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzKTsKKworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmJ0c19lbnRyeS0+d29ya190aW1lcikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmYnRzX2VudHJ5LT53b3JrX3RpbWVyLCAxLCAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCWludCBudW1fcGFnZXMgPSAwOworCisJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCk7CisKKwkvKiBzdGFydCBwYWdpbmcgc3Vic2NyaWJlciBvbiBhbGwgQlRTIHdpdGhpbiBMb2NhdGlvbiBBcmVhICovCisJZG8geworCQlpbnQgcmM7CisKKwkJYnRzID0gZ3NtX2J0c19ieV9sYWMobmV0d29yaywgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogc2tpcCBhbGwgY3VycmVudGx5IGluYWN0aXZlIFRSWCAqLworCQlpZiAoIXRyeF9pc191c2FibGUoYnRzLT5jMCkpCisJCQljb250aW51ZTsKKworCQludW1fcGFnZXMrKzsKKworCQkvKiBUcmlnZ2VyIHBhZ2luZywgcGFzcyBhbnkgZXJyb3IgdG8gY2FsbGVyICovCisJCXJjID0gX3BhZ2luZ19yZXF1ZXN0KGJ0cywgc3Vic2NyLCB0eXBlLCBjYmZuLCBkYXRhKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCWlmIChudW1fcGFnZXMgPT0gMCkKKwkJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmRldGFjaGVkKTsKKworCXJldHVybiBudW1fcGFnZXM7Cit9CisKKworLyogd2UgY29uc2Npb3VzbHkgaWdub3JlIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IGhlcmUgKi8KK3N0YXRpYyB2b2lkIF9wYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0c19lbnRyeSA9ICZidHMtPnBhZ2luZzsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXEsICpyZXEyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHJlcTIsICZidHNfZW50cnktPnBlbmRpbmdfcmVxdWVzdHMsCisJCQkJIGVudHJ5KSB7CisJCWlmIChyZXEtPnN1YnNjciA9PSBzdWJzY3IpIHsKKwkJCWlmIChsY2hhbiAmJiByZXEtPmNiZm4pIHsKKwkJCQlERUJVR1AoRFBBRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCwgY2FsbGluZyBjYmZuLlxuIiwgYnRzLT5ucik7CisJCQkJcmVxLT5jYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19TVUNDRUVERUQsCisJCQkJCSAgTlVMTCwgbGNoYW4sIHJlcS0+Y2Jmbl9wYXJhbSk7CisJCQl9IGVsc2UKKwkJCQlERUJVR1AoRFBBRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCBzaWxlbnRseS5cbiIsIGJ0cy0+bnIpOworCQkJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZidHMtPnBhZ2luZywgcmVxKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBTdG9wIHBhZ2luZyBvbiBhbGwgb3RoZXIgYnRzJyAqLwordm9pZCBwYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpfYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKworCWlmIChfYnRzKQorCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChfYnRzLCBzdWJzY3IsIGxjaGFuKTsKKworCWRvIHsKKwkJLyoKKwkJICogRklYTUU6IERvbid0IHVzZSB0aGUgbGFjIG9mIHRoZSBzdWJzY3JpYmVyLi4uCisJCSAqIGFzIGl0IG1pZ2h0IGhhdmUgbWFnaWNhbGx5IGNoYW5nZWQgdGhlIGxhYy4uIHVzZSB0aGUKKwkJICogbG9jYXRpb24gYXJlYSBvZiB0aGUgX2J0cyBhcyByZWNvbmZpZ3VyYXRpb24gb2YgdGhlCisJCSAqIG5ldHdvcmsgaXMgcHJvYmFibHkgaGFwcGVuaW5nIGxlc3Mgb2Z0ZW4uCisJCSAqLworCQlidHMgPSBnc21fYnRzX2J5X2xhYyhzdWJzY3ItPm5ldCwgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogU3RvcCBwYWdpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoYnRzICE9IF9idHMpCisJCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChidHMsIHN1YnNjciwgTlVMTCk7CisJfSB3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90IGZyZWVfc2xvdHMpCit7CisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gZnJlZV9zbG90czsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTk2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCkBAIC0wLDAgKzEsMzk2IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UsCisgKiByZXN0IG9jdGV0IGhhbmRsaW5nIGFjY29yZGluZyB0bworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisKKy8qIGdlbmVyYXRlIFNJMSByZXN0IG9jdGV0cyAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMSh1X2ludDhfdCAqZGF0YSwgdV9pbnQ4X3QgKm5jaF9wb3MpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMTsKKworCWlmIChuY2hfcG9zKSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsICpuY2hfcG9zLCA1KTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgNyk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCisvKiBBcHBlbmQgc2VsZWN0aW9uIHBhcmFtZXRlcnMgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgKnNwKQoreworCWlmIChzcC0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBzcC0+Y2JxKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+Y2VsbF9yZXNlbF9vZmYsIDYpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT50ZW1wX29mZnMsIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT5wZW5hbHR5X3RpbWUsIDUpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKy8qIEFwcGVuZCBwb3dlciBvZmZzZXQgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfcG93ZXJfb2Zmc2V0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgKnBvKQoreworCWlmIChwby0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgcG8tPnBvd2VyX29mZnNldCwgMik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworLyogQXBwZW5kIEdQUlMgaW5kaWNhdG9yIHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfaW5kKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgKmdpKQoreworCWlmIChnaS0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgZ2ktPnJhX2NvbG91ciwgMyk7CisJCS8qIDAgPT0gU0kxMyBpbiBCQ0NIIE5vcm0sIDEgPT0gU0kxMyBzZW50IG9uIEJDQ0ggRXh0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCBnaS0+c2kxM19wb3NpdGlvbik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworCisvKiBHZW5lcmF0ZSBTSTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zNCAvIFRhYmxlIDEwLjQuNzIpICovCitpbnQgcmVzdF9vY3RldHNfc2kzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2kzKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDQ7CisKKwkvKiBPcHRpb25hbCBTZWxlY3Rpb24gUGFyYW1ldGVycyAqLworCWFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKCZidiwgJnNpMy0+c2VsZWN0aW9uX3BhcmFtcyk7CisKKwkvKiBPcHRpb25hbCBQb3dlciBPZmZzZXQgKi8KKwlhcHBlbmRfcG93ZXJfb2Zmc2V0KCZidiwgJnNpMy0+cG93ZXJfb2Zmc2V0KTsKKworCS8qIERvIHdlIGhhdmUgYSBTSTJ0ZXIgb24gdGhlIEJDQ0g/ICovCisJaWYgKHNpMy0+c2kydGVyX2luZGljYXRvcikKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBFYXJseSBDbGFzc21hcmsgU2VuZGluZyBDb250cm9sICovCisJaWYgKHNpMy0+ZWFybHlfY21fY3RybCkKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgU0kgVHlwZSA5IG9uIHRoZSBCQ0NIPyAqLworCWlmIChzaTMtPnNjaGVkdWxpbmcucHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTMtPnNjaGVkdWxpbmcud2hlcmUsIDMpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogR1BSUyBJbmRpY2F0b3IgKi8KKwlhcHBlbmRfZ3Byc19pbmQoJmJ2LCAmc2kzLT5ncHJzX2luZCk7CisKKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIChidi5kYXRhX2xlbio4KS0xKTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX2xzYV9wYXJhbXMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBnc200OF9sc2FfcGFyYW1zICpsc2FfcGFyYW1zKQoreworCS8qIEZJWE1FICovCit9CisKKy8qIEdlbmVyYXRlIFNJNCBSZXN0IE9jdGV0cyAoQ2hhcHRlciAxMC41LjIuMzUpICovCitpbnQgcmVzdF9vY3RldHNfc2k0KHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2k0KQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDEwOyAvKiBGSVhNRTogdXAgdG8gPyAqLworCisJLyogU0k0IFJlc3QgT2N0ZXRzIE8gKi8KKwlhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcygmYnYsICZzaTQtPnNlbGVjdGlvbl9wYXJhbXMpOworCWFwcGVuZF9wb3dlcl9vZmZzZXQoJmJ2LCAmc2k0LT5wb3dlcl9vZmZzZXQpOworCWFwcGVuZF9ncHJzX2luZCgmYnYsICZzaTQtPmdwcnNfaW5kKTsKKworCWlmICgwIC8qIEZJWE1FICovKSB7CisJCS8qIEggYW5kIFNJNCBSZXN0IE9jdGV0cyBTICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisKKwkJLyogTFNBIFBhcmFtZXRlcnMgKi8KKwkJaWYgKHNpNC0+bHNhX3BhcmFtcy5wcmVzZW50KSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJYXBwZW5kX2xzYV9wYXJhbXMoJmJ2LCAmc2k0LT5sc2FfcGFyYW1zKTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIENlbGwgSWRlbnRpdHkgKi8KKwkJaWYgKDEpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTQtPmNlbGxfaWQsIDE2KTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIExTQSBJRCBJbmZvcm1hdGlvbiAqLworCQlpZiAoMCkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwl9IGVsc2UgeworCQkvKiBMIGFuZCBicmVhayBpbmRpY2F0b3IgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBzaTQtPmJyZWFrX2luZCA/IEggOiBMKTsKKwl9CisKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKKy8qIEdQUlMgTW9iaWxlIEFsbG9jYXRpb24gYXMgcGVyIFRTIDA0LjYwIENoYXB0ZXIgMTIuMTBhOgorICAgPCBHUFJTIE1vYmlsZSBBbGxvY2F0aW9uIElFID4gOjo9CisgICAgIDwgSFNOIDogYml0ICg2KSA+CisgICAgIHsgMCB8IDEgPCBSRkwgbnVtYmVyIGxpc3QgOiA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiA+IH0KKyAgICAgeyAwIDwgTUFfTEVOR1RIIDogYml0ICg2KSA+CisgICAgICAgICA8IE1BX0JJVE1BUDogYml0ICh2YWwoTUFfTEVOR1RIKSArIDEpID4KKyAgICAgfCAxIHsgMCB8IDEgPEFSRkNOIGluZGV4IGxpc3QgOiA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gPiB9IH0gOworCisgICAgIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IDo6ID0KKyAgICAgICA8IFJGTF9OVU1CRVIgOiBiaXQgKDQpID4KKyAgICAgICB7IDAgfCAxIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IH0gOworICAgICA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gOjo9CisgICAgICAgPCBBUkZDTl9JTkRFWCA6IGJpdCg2KSA+CisgICAgICAgeyAwIHwgMSA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gfSA7CisgKi8KK3N0YXRpYyBpbnQgYXBwZW5kX2dwcnNfbW9iaWxlX2FsbG9jKHN0cnVjdCBiaXR2ZWMgKmJ2KQoreworCS8qIEhvcHBpbmcgU2VxdWVuY2UgTnVtYmVyICovCisJYml0dmVjX3NldF91aW50KGJ2LCAwLCA2KTsKKworCWlmICgwKSB7CisJCS8qIFdlIHdhbnQgdG8gdXNlIGEgUkZMIG51bWJlciBsaXN0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJLyogRklYTUU6IFJGTCBudW1iZXIgbGlzdCAqLworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlpZiAoMCkgeworCQkvKiBXZSB3YW50IHRvIHVzZSBhIE1BX0JJVE1BUCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJCS8qIEZJWE1FOiBNQV9MRU5HVEgsIE1BX0JJVE1BUCwgLi4uICovCisJfSBlbHNlIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQlpZiAoMCkgeworCQkJLyogV2Ugd2FudCB0byBwcm92aWRlIGFuIEFSRkNOIGluZGV4IGxpc3QgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfdDMxOTIodW5zaWduZWQgaW50IHQzMTkyKQoreworCWlmICh0MzE5MiA9PSAwKQorCQlyZXR1cm4gMzsKKwllbHNlIGlmICh0MzE5MiA8PSA4MCkKKwkJcmV0dXJuIDQ7CisJZWxzZSBpZiAodDMxOTIgPD0gMTIwKQorCQlyZXR1cm4gNTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNjApCisJCXJldHVybiA2OworCWVsc2UgaWYgKHQzMTkyIDw9IDIwMCkKKwkJcmV0dXJuIDc7CisJZWxzZSBpZiAodDMxOTIgPD0gNTAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh0MzE5MiA8PSAxMDAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNTAwKQorCQlyZXR1cm4gMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVuY29kZV9kcnhfdGltZXIodW5zaWduZWQgaW50IGRyeCkKK3sKKwlpZiAoZHJ4ID09IDApCisJCXJldHVybiAwOworCWVsc2UgaWYgKGRyeCA9PSAxKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChkcnggPT0gMikKKwkJcmV0dXJuIDI7CisJZWxzZSBpZiAoZHJ4IDw9IDQpCisJCXJldHVybiAzOworCWVsc2UgaWYgKGRyeCA8PSA4KQorCQlyZXR1cm4gNDsKKwllbHNlIGlmIChkcnggPD0gMTYpCisJCXJldHVybiA1OworCWVsc2UgaWYgKGRyeCA8PSAzMikKKwkJcmV0dXJuIDY7CisJZWxzZSBpZiAoZHJ4IDw9IDY0KQorCQlyZXR1cm4gNzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKiBHUFJTIENlbGwgT3B0aW9ucyBhcyBwZXIgVFMgMDQuNjAgQ2hhcHRlciAxMi4yNAorCTwgR1BSUyBDZWxsIE9wdGlvbnMgSUUgPiA6Oj0KKwkJPCBOTU8gOiBiaXQoMikgPgorCQk8IFQzMTY4IDogYml0KDMpID4KKwkJPCBUMzE5MiA6IGJpdCgzKSA+CisJCTwgRFJYX1RJTUVSX01BWDogYml0KDMpID4KKwkJPCBBQ0NFU1NfQlVSU1RfVFlQRTogYml0ID4KKwkJPCBDT05UUk9MX0FDS19UWVBFIDogYml0ID4KKwkJPCBCU19DVl9NQVg6IGJpdCg0KSA+CisJCXsgMCB8IDEgPCBQQU5fREVDIDogYml0KDMpID4KKwkJCTwgUEFOX0lOQyA6IGJpdCgzKSA+CisJCQk8IFBBTl9NQVggOiBiaXQoMykgPgorCQl7IDAgfCAxIDwgRXh0ZW5zaW9uIExlbmd0aCA6IGJpdCg2KSA+CisJCQk8IGJpdCAodmFsKEV4dGVuc2lvbiBMZW5ndGgpICsgMQorCQkJJiB7IDwgRXh0ZW5zaW9uIEluZm9ybWF0aW9uID4gISB7IGJpdCAqKiA9IDxubyBzdHJpbmc+IH0gfSA7CisJPCBFeHRlbnNpb24gSW5mb3JtYXRpb24gPiA6Oj0KKwkJeyAwIHwgMSA8IEVHUFJTX1BBQ0tFVF9DSEFOTkVMX1JFUVVFU1QgOiBiaXQgPgorCQkJPCBCRVBfUEVSSU9EIDogYml0KDQpID4gfQorCQk8IFBGQ19GRUFUVVJFX01PREUgOiBiaXQgPgorCQk8IERUTV9TVVBQT1JUIDogYml0ID4KKwkJPEJTU19QQUdJTkdfQ09PUkRJTkFUSU9OOiBiaXQgPgorCQk8c3BhcmUgYml0ID4gKiogOworICovCitzdGF0aWMgaW50IGFwcGVuZF9ncHJzX2NlbGxfb3B0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBncHJzX2NlbGxfb3B0aW9ucyAqZ2NvKQoreworCWludCB0MzE5MiwgZHJ4X3RpbWVyX21heDsKKworCXQzMTkyID0gZW5jb2RlX3QzMTkyKGdjby0+dDMxOTIpOworCWlmICh0MzE5MiA8IDApCisJCXJldHVybiB0MzE5MjsKKworCWRyeF90aW1lcl9tYXggPSBlbmNvZGVfZHJ4X3RpbWVyKGdjby0+ZHJ4X3RpbWVyX21heCk7CisJaWYgKGRyeF90aW1lcl9tYXggPCAwKQorCQlyZXR1cm4gZHJ4X3RpbWVyX21heDsKKworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ubW8sIDIpOworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT50MzE2OCAvIDUwMCwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCB0MzE5MiwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCBkcnhfdGltZXJfbWF4LCAzKTsKKwkvKiBBQ0NFU1NfQlVSU1RfVFlQRTogSGFyZC1jb2RlIDhiaXQgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJLyogQ09OVFJPTF9BQ0tfVFlQRTogSGFyZC1jb2RlIHRvIFJMQy9NQUMgY29udHJvbCBibG9jayAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+YnNfY3ZfbWF4LCA0KTsKKworCS8qIGhhcmQtY29kZSBubyBQQU5fe0RFQyxJTkMsTUFYfSAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCS8qIG5vIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAoRURHRSkgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgKnBjcCkKK3sKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+YWxwaGEsIDQpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT50X2F2Z193LCA1KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+dF9hdmdfdCwgNSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnBjX21lYXNfY2hhbiwgMSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPm5fYXZnX2ksIDQpOworfQorCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMjA7CisKKwlpZiAoMCkgeworCQkvKiBObyByZXN0IG9jdGV0cyAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCX0gZWxzZSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPmJjY2hfY2hhbmdlX21hcmssIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5zaV9jaGFuZ2VfZmllbGQsIDQpOworCQlpZiAoMSkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5iY2NoX2NoYW5nZV9tYXJrLCAyKTsKKwkJCWFwcGVuZF9ncHJzX21vYmlsZV9hbGxvYygmYnYpOworCQl9CisJCWlmICghc2kxMy0+cGJjY2hfcHJlc2VudCkgeworCQkJLyogUEJDQ0ggbm90IHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLnJhYywgOCk7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIHNpMTMtPm5vX3BiY2NoLnNwZ2NfY2NjaF9zdXApOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gucHJpb19hY2NfdGhyLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLm5ldF9jdHJsX29yZCwgMik7CisJCQlhcHBlbmRfZ3Byc19jZWxsX29wdCgmYnYsICZzaTEzLT5jZWxsX29wdHMpOworCQkJYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycygmYnYsICZzaTEzLT5wd3JfY3RybF9wYXJzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFBCQ0NIIHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnBzaTFfcmVwX3BlciwgNCk7CisJCQkvKiBQQkNDSCBEZXNjcmlwaXRvbiAqLworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gucGIsIDQpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gudHNjLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnRuLCAzKTsKKwkJCXN3aXRjaCAoc2kxMy0+cGJjY2guY2Fycmllcl90eXBlKSB7CisJCQljYXNlIFBCQ0NIX0JDQ0g6CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSBQQkNDSF9BUkZDTjoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2guYXJmY24sIDEwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEJDQ0hfTUFJTzoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLm1haW8sIDYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JybHAuYyBiL29wZW5ic2Mvc3JjL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA0NDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnJscC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBSYWRpbyBSZXNvdXJjZSBMQ1MgKExvY2F0aW9uKSBQcm90b2NvbCwgR01TIFRTIDA0LjMxICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBuc0Jhc2VkLAorICoJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHMsIFJlc3BvbnNlVGltZT0yLCBvbmVTZXQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBtc19iYXNlZF9wb3NfcmVxW10gPSB7IDB4NDAsIDB4MDEsIDB4NzgsIDB4YTggfTsKKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBtc0Jhc2VkUHJlZiwKKwlBY2N1cmFjeT02MCwgTWV0aG9kPWdwc09yRU9URCwgUmVzcG9uc2VUaW1lPTUsIG11bHRpcGxlU2V0cyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IG1zX3ByZWZfcG9zX3JlcVtdICA9IHsgMHg0MCwgMHgwMiwgMHg3OSwgMHg1MCB9OworCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG1zQXNzaXN0ZWRQcmVmLAorCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzT3JFT1RELCBSZXNwb25zZVRpbWU9NSwgbXVsdGlwbGVTZXRzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYXNzX3ByZWZfcG9zX3JlcVtdID0geyAweDQwLCAweDAzLCAweDc5LCAweDUwIH07CisKK3N0YXRpYyBpbnQgc2VuZF9ycmxwX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJY29uc3QgdV9pbnQ4X3QgKnJlcTsKKworCXN3aXRjaCAobmV0LT5ycmxwLm1vZGUpIHsKKwljYXNlIFJSTFBfTU9ERV9NU19CQVNFRDoKKwkJcmVxID0gbXNfYmFzZWRfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTVNfUFJFRjoKKwkJcmVxID0gbXNfcHJlZl9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9BU1NfUFJFRjoKKwkJcmVxID0gYXNzX3ByZWZfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhsY2hhbiwgMHgwMCwKKwkJCQkgICAgICBzaXplb2YobXNfYmFzZWRfcG9zX3JlcSksIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc3Vic2NyX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TVUJTQ1JfQVRUQUNIRUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuICovCisJCXN1YnNjciA9IHNpZ25hbF9kYXRhOworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFsY2hhbikKKwkJCWJyZWFrOworCQlzZW5kX3JybHBfcmVxKGxjaGFuKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgKnBzaWdfZGF0YSA9IHNpZ25hbF9kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfUEFHSU5HX1NVQ0NFRURFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gKi8KKwkJc2VuZF9ycmxwX3JlcShwc2lnX2RhdGEtPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBTX1BBR0lOR19FWFBJUkVEOgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb25fZHNvX2xvYWRfcnJscCh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfUEFHSU5HLCBwYWdpbmdfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JzMjMyLmMgYi9vcGVuYnNjL3NyYy9yczIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWY1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yczIzMi5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBPcGVuQlNDIEJTLTExIFQtTGluayBpbnRlcmZhY2UgdXNpbmcgUE9TSVggc2VyaWFsIHBvcnQgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yczIzMi5oPgorCisvKiBhZGFwdGlvbiBsYXllciBmcm9tIEdTTSAwOC41OSArIDEyLjIxIHRvIFJTMjMyICovCisKK3N0cnVjdCBzZXJpYWxfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworCisJc3RydWN0IG1zZ2IgKnJ4X21zZzsKKwl1bnNpZ25lZCBpbnQgcnhtc2dfYnl0ZXNfbWlzc2luZzsKKworCXVuc2lnbmVkIGludCBkZWxheV9tczsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworLyogRklYTUU6IHRoaXMgbmVlZHMgdG8gZ28gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSBfc2VyX2hhbmRsZSwgKnNlcl9oYW5kbGUgPSAmX3Nlcl9oYW5kbGU7CisKKyNkZWZpbmUgTEFQRF9IRFJfTEVOCTEwCisKK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpOworCisvKiBjYWxsYmFjayBmcm9tIGFiaXNfbm0gKi8KK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gc2VyX2hhbmRsZTsKKwl1X2ludDhfdCAqbGFwZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwkvKiBwcmVwZW5kIExBUEQgaGVhZGVyICovCisJbGFwZCA9IG1zZ2JfcHVzaChtc2csIExBUERfSERSX0xFTik7CisKKwlsZW4gPSBtc2ctPmxlbiAtIDI7CisKKwlsYXBkWzBdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJbGFwZFsxXSA9IGxlbiAmIDB4ZmY7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGlnbiBhdCBsYXBkWzJdICovCisJbGFwZFsyXSA9IDB4MDA7CisJbGFwZFszXSA9IDB4MDc7CisJbGFwZFs0XSA9IDB4MDE7CisJbGFwZFs1XSA9IDB4M2U7CisJbGFwZFs2XSA9IDB4MDA7CisJbGFwZFs3XSA9IDB4MDA7CisJbGFwZFs4XSA9IG1zZy0+bGVuIC0gMTA7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGluZyBhdCBsYXBkWzEwXSAqLworCWxhcGRbOV0gPSBsYXBkWzhdIF4gMHgzODsKKworCW1zZ2JfZW5xdWV1ZSgmc2gtPnR4X3F1ZXVlLCBtc2cpOworCXNoLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCS8qIHdlIHRyeSB0byBpbW1lZGlhdGVseSBzZW5kICovCisJaGFuZGxlX3Nlcl93cml0ZSgmc2gtPmZkKTsKKworCXJldHVybiAwOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayBpbiBjYXNlIHdlIGNhbiB3cml0ZSB0byB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdyaXR0ZW47CisKKwltc2cgPSBtc2diX2RlcXVldWUoJnNoLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKworCURFQlVHUChETUksICJSUzIzMiBUWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJLyogc2VuZCBvdmVyIHNlcmlhbCBsaW5lICovCisJd3JpdHRlbiA9IHdyaXRlKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJcGVycm9yKCJzaG9ydCB3cml0ZToiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKwl1c2xlZXAoc2gtPmRlbGF5X21zKjEwMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VSSUFMX0FMTE9DX1NJWkUJMzAwCisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrIGluIGNhc2Ugd2UgY2FuIHJlYWQgZnJvbSB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBiZmQtPmRhdGE7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFzaC0+cnhfbXNnKSB7CisJCXNoLT5yeF9tc2cgPSBtc2diX2FsbG9jKFNFUklBTF9BTExPQ19TSVpFLCAiUlMyMzIgUngiKTsKKwkJc2gtPnJ4X21zZy0+bDJoID0gTlVMTDsKKwkJc2gtPnJ4X21zZy0+dHJ4ID0gc2gtPmJ0cy0+YzA7CisJfQorCW1zZyA9IHNoLT5yeF9tc2c7CisKKwkvKiBmaXJzdCByZWFkIHR3byBieWVzIHRvIG9idGFpbiBsZW5ndGggKi8KKwlpZiAobXNnLT5sZW4gPCAyKSB7CisJCXJjID0gcmVhZChzaC0+ZmQuZmQsIG1zZy0+dGFpbCwgMiAtIG1zZy0+bGVuKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCisJCWlmIChtc2ctPmxlbiA+PSAyKSB7CisJCQkvKiBwYXJzZSBMQVBEIHBheWxvYWQgbGVuZ3RoICovCisJCQlpZiAobXNnLT5kYXRhWzBdICE9IDApCisJCQkJZnByaW50ZihzdGRlcnIsICJTdXNwaWNpb3VzIGhlYWRlciBieXRlIDA6IDB4JTAyeFxuIiwKKwkJCQkJbXNnLT5kYXRhWzBdKTsKKworCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPSBtc2ctPmRhdGFbMF0gPDwgODsKKwkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nICs9IG1zZy0+ZGF0YVsxXTsKKworCQkJaWYgKHNoLT5yeG1zZ19ieXRlc19taXNzaW5nIDwgTEFQRF9IRFJfTEVOIC0yKQorCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsZW5ndGggaW4gaGRyOiAldVxuIiwKKwkJCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcpOworCQl9CisJfSBlbHNlIHsgCisJCS8qIHRyeSB0byByZWFkIGFzIG1hbnkgb2YgdGhlIG1pc3NpbmcgYnl0ZXMgYXMgYXJlIGF2YWlsYWJsZSAqLworCQlyYyA9IHJlYWQoc2gtPmZkLmZkLCBtc2ctPnRhaWwsIHNoLT5yeG1zZ19ieXRlc19taXNzaW5nKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyAtPSByYzsKKworCQlpZiAoc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPT0gMCkgeworCQkJLyogd2UgaGF2ZSBvbmUgY29tcGxldGUgbWVzc2FnZSBub3cgKi8KKwkJCXNoLT5yeF9tc2cgPSBOVUxMOworCisJCQlpZiAobXNnLT5sZW4gPiBMQVBEX0hEUl9MRU4pCisJCQkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBMQVBEX0hEUl9MRU47CisKKwkJCURFQlVHUChETUksICJSUzIzMiBSWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQkJcmMgPSBoYW5kbGVfc2VyaWFsX21zZyhtc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayAqLworc3RhdGljIGludCBzZXJpYWxfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfc2VyX3JlYWQoYmZkKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV9zZXJfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJzMjMyX3NldHVwKGNvbnN0IGNoYXIgKnNlcmlhbF9wb3J0LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMsCisJCXN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjLCBzZXJpYWxfZmQ7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCisJc2VyaWFsX2ZkID0gb3BlbihzZXJpYWxfcG9ydCwgT19SRFdSKTsKKwlpZiAoc2VyaWFsX2ZkIDwgMCkgeworCQlwZXJyb3IoImNhbm5vdCBvcGVuIHNlcmlhbCBwb3J0OiIpOworCQlyZXR1cm4gc2VyaWFsX2ZkOworCX0KKworCS8qIHNldCBiYXVkcmF0ZSAqLworCXJjID0gdGNnZXRhdHRyKHNlcmlhbF9mZCwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjZ2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisJY2ZzZXRpc3BlZWQoJnRpbywgQjE5MjAwKTsKKwljZnNldG9zcGVlZCgmdGlvLCBCMTkyMDApOworCXRpby5jX2NmbGFnIHw9ICAoQ1JFQUQgfCBDTE9DQUwgfCBDUzgpOworCXRpby5jX2NmbGFnICY9IH4oUEFSRU5CIHwgQ1NUT1BCIHwgQ1NJWkUgfCBDUlRTQ1RTKTsKKwl0aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IElTSUcpOworCXRpby5jX2lmbGFnIHw9ICAoSU5QQ0sgfCBJU1RSSVApOworCXRpby5jX2lmbGFnICY9IH4oSVNUUklQIHwgSVhPTiB8IElYT0ZGIHwgSUdOQlJLIHwgSU5MQ1IgfCBJQ1JOTCB8IElHTkNSKTsKKwl0aW8uY19vZmxhZyAmPSB+KE9QT1NUKTsKKwlyYyA9IHRjc2V0YXR0cihzZXJpYWxfZmQsIFRDU0FEUkFJTiwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjc2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisKKwlJTklUX0xMSVNUX0hFQUQoJnNlcl9oYW5kbGUtPnR4X3F1ZXVlKTsKKwlzZXJfaGFuZGxlLT5mZC5mZCA9IHNlcmlhbF9mZDsKKwlzZXJfaGFuZGxlLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJc2VyX2hhbmRsZS0+ZmQuY2IgPSBzZXJpYWxfZmRfY2I7CisJc2VyX2hhbmRsZS0+ZmQuZGF0YSA9IHNlcl9oYW5kbGU7CisJc2VyX2hhbmRsZS0+ZGVsYXlfbXMgPSBkZWxheV9tczsKKwlzZXJfaGFuZGxlLT5idHMgPSBidHM7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnNlcl9oYW5kbGUtPmZkKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEOiAlc1xuIiwKKwkJCXN0cmVycm9yKHJjKSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZTJmZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jCkBAIC0wLDAgKzEsNzI0IEBACisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAvKiBnZXR0aW1lb2ZkYXkoKSAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgIC8qIGdldC4uKCkgKi8KKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAvKiBjbG9jaygpICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gLyogdW5hbWUoKSAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RhdGljIExMSVNUX0hFQUQocnRwX3NvY2tldHMpOworCisvKiBzaG91bGQgd2UgbWFuZ2xlIHRoZSBDTkFNRSBpbnNpZGUgU0RFUyBvZiBSVENQIHBhY2tldHM/IFdlIGRpc2FibGUKKyAqIHRoaXMgYnkgZGVmYXVsdCwgYXMgaXQgc2VlbXMgdG8gYmUgbm90IG5lZWRlZCAqLworc3RhdGljIGludCBtYW5nbGVfcnRjcF9jbmFtZSA9IDA7CisKK2VudW0gcnRwX2JmZF9wcml2IHsKKwlSVFBfUFJJVl9OT05FLAorCVJUUF9QUklWX1JUUCwKKwlSVFBfUFJJVl9SVENQCit9OworCisjZGVmaW5lIFJUUF9BTExPQ19TSVpFCTE1MDAKKworLyogYWNjb3JkaW5nIHRvIFJGQyAxODg5ICovCitzdHJ1Y3QgcnRjcF9oZHIgeworCXVfaW50OF90IGJ5dGUwOworCXVfaW50OF90IHR5cGU7CisJdV9pbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUlRDUF9UWVBFX1NERVMJMjAyCisJCisjZGVmaW5lIFJUQ1BfSUVfQ05BTUUJMQorCisvKiBhY2NvcmRpbmcgdG8gUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnRwX3hfaGRyIHsKKwl1X2ludDE2X3QgYnlfcHJvZmlsZTsKKwl1X2ludDE2X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBSVFBfVkVSU0lPTgkyCisKKyNkZWZpbmUgUlRQX1BUX0dTTV9GVUxMCTMKKyNkZWZpbmUgUlRQX1BUX0dTTV9FRlIJOTcKKworLyogZGVjb2RlIGFuIHJ0cCBmcmFtZSBhbmQgY3JlYXRlIGEgbmV3IGJ1ZmZlciB3aXRoIHBheWxvYWQgKi8KK3N0YXRpYyBpbnQgcnRwX2RlY29kZShzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDMyX3QgY2FsbHJlZiwgc3RydWN0IG1zZ2IgKipkYXRhKQoreworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cGggPSAoc3RydWN0IHJ0cF9oZHIgKiltc2ctPmRhdGE7CisJc3RydWN0IHJ0cF94X2hkciAqcnRweGg7CisJdV9pbnQ4X3QgKnBheWxvYWQ7CisJaW50IHBheWxvYWRfbGVuOworCWludCBtc2dfdHlwZTsKKwlpbnQgeF9sZW47CisKKwlpZiAobXNnLT5sZW4gPCAxMikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IChsZW4gPSAlZClcbiIsCisJCQltc2ctPmxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+dmVyc2lvbiAhPSBSVFBfVkVSU0lPTikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCXJ0cGgtPnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGF5bG9hZCA9IG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyAocnRwaC0+Y3NyY19jb3VudCA8PCAyKTsKKwlwYXlsb2FkX2xlbiA9IG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSAtIChydHBoLT5jc3JjX2NvdW50IDw8IDIpOworCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCAobGVuID0gJWQsICIKKwkJCSJjc3JjIGNvdW50ID0gJWQpXG4iLCBtc2ctPmxlbiwgcnRwaC0+Y3NyY19jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+ZXh0ZW5zaW9uKSB7CisJCWlmIChwYXlsb2FkX2xlbiA8IHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKSkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCBmb3IgIgorCQkJCSJleHRlbnNpb24gaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJ0cHhoID0gKHN0cnVjdCBydHBfeF9oZHIgKilwYXlsb2FkOworCQl4X2xlbiA9IG50b2hzKHJ0cHhoLT5sZW5ndGgpICogNCArIHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKTsKKwkJcGF5bG9hZCArPSB4X2xlbjsKKwkJcGF5bG9hZF9sZW4gLT0geF9sZW47CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQsICIKKwkJCQkiZXh0ZW5zaW9uIGhlYWRlciBleGNlZWRzIGZyYW1lIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAocnRwaC0+cGFkZGluZykgeworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IGZvciAiCisJCQkJInBhZGRpbmcgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBheWxvYWRfbGVuIC09IHBheWxvYWRbcGF5bG9hZF9sZW4gLSAxXTsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHdpdGggcGFkZGluZyAiCisJCQkJImdyZWF0ZXIgdGhhbiBwYXlsb2FkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3dpdGNoIChydHBoLT5wYXlsb2FkX3R5cGUpIHsKKwljYXNlIFJUUF9QVF9HU01fRlVMTDoKKwkJbXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRTsKKwkJaWYgKHBheWxvYWRfbGVuICE9IDMzKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnVsbCByYXRlIGZyYW1lIHdpdGggIgorCQkJCSJwYXlsb2FkIGxlbmd0aCAhPSAzMiAobGVuID0gJWQpXG4iLAorCQkJCXBheWxvYWRfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgUlRQX1BUX0dTTV9FRlI6CisJCW1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUVfRUZSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgd2l0aCB1bmtub3duIHBheWxvYWQgIgorCQkJInR5cGUgJWRcbiIsIHJ0cGgtPnBheWxvYWRfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5ld19tc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4sCisJCQkJIkdTTS1EQVRBIik7CisJaWYgKCFuZXdfbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKikobmV3X21zZy0+ZGF0YSk7CisJZnJhbWUtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZnJhbWUtPmNhbGxyZWYgPSBjYWxscmVmOworCW1lbWNweShmcmFtZS0+ZGF0YSwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCW1zZ2JfcHV0KG5ld19tc2csIHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4pOworCisJKmRhdGEgPSBuZXdfbXNnOworCXJldHVybiAwOworfQorCisvKiAidG8gLSBmcm9tIiAqLworc3RhdGljIHZvaWQgdHZfZGlmZmVyZW5jZShzdHJ1Y3QgdGltZXZhbCAqZGlmZiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmZyb20sCisJCQkgIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3RvKQoreworCXN0cnVjdCB0aW1ldmFsIF90byA9ICpfX3RvLCAqdG8gPSAmX3RvOworCisJaWYgKHRvLT50dl91c2VjIDwgZnJvbS0+dHZfdXNlYykgeworCQl0by0+dHZfc2VjIC09IDE7CisJCXRvLT50dl91c2VjICs9IDEwMDAwMDA7CisJfQorCisJZGlmZi0+dHZfdXNlYyA9IHRvLT50dl91c2VjIC0gZnJvbS0+dHZfdXNlYzsKKwlkaWZmLT50dl9zZWMgPSB0by0+dHZfc2VjIC0gZnJvbS0+dHZfc2VjOworfQorCisvKiBlbmNvZGUgYW5kIHNlbmQgYSBydHAgZnJhbWUgKi8KK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0cDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBydHBfaGRyICpydHBoOworCWludCBwYXlsb2FkX3R5cGU7CisJaW50IHBheWxvYWRfbGVuOworCWludCBkdXJhdGlvbjsgLyogaW4gc2FtcGxlcyAqLworCisJaWYgKHJzLT50eF9hY3Rpb24gIT0gUlRQX1NFTkRfRE9XTlNUUkVBTSkgeworCQkvKiBpbml0aWFsaXplIHNlcXVlbmNlcyAqLworCQlycy0+dHhfYWN0aW9uID0gUlRQX1NFTkRfRE9XTlNUUkVBTTsKKwkJcnMtPnRyYW5zbWl0LnNzcmMgPSByYW5kKCk7CisJCXJzLT50cmFuc21pdC5zZXF1ZW5jZSA9IHJhbmRvbSgpOworCQlycy0+dHJhbnNtaXQudGltZXN0YW1wID0gcmFuZG9tKCk7CisJfQorCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQlwYXlsb2FkX3R5cGUgPSBSVFBfUFRfR1NNX0ZVTEw7CisJCXBheWxvYWRfbGVuID0gMzM7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJcGF5bG9hZF90eXBlID0gUlRQX1BUX0dTTV9FRlI7CisJCXBheWxvYWRfbGVuID0gMzE7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2LCB0dl9kaWZmOworCQlsb25nIGludCB1c2VjX2RpZmYsIGZyYW1lX2RpZmY7CisKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCXR2X2RpZmZlcmVuY2UoJnR2X2RpZmYsICZycy0+dHJhbnNtaXQubGFzdF90diwgJnR2KTsKKwkJcnMtPnRyYW5zbWl0Lmxhc3RfdHYgPSB0djsKKworCQl1c2VjX2RpZmYgPSB0dl9kaWZmLnR2X3NlYyAqIDEwMDAwMDAgKyB0dl9kaWZmLnR2X3VzZWM7CisJCWZyYW1lX2RpZmYgPSAodXNlY19kaWZmIC8gMjAwMDApOworCisJCWlmIChhYnMoZnJhbWVfZGlmZikgPiAxKSB7CisJCQlsb25nIGludCBmcmFtZV9kaWZmX2V4Y2VzcyA9IGZyYW1lX2RpZmYgLSAxOworCisJCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLAorCQkJCSJDb3JyZWN0aW5nIGZyYW1lIGRpZmZlcmVuY2Ugb2YgJWxkIGZyYW1lc1xuIiwgZnJhbWVfZGlmZl9leGNlc3MpOworCQkJcnMtPnRyYW5zbWl0LnNlcXVlbmNlICs9IGZyYW1lX2RpZmZfZXhjZXNzOworCQkJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCArPSBmcmFtZV9kaWZmX2V4Y2VzcyAqIGR1cmF0aW9uOworCQl9CisJfQorCisJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4sICJSVFAtR1NNLUZVTEwiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnRwaCA9IChzdHJ1Y3QgcnRwX2hkciAqKW1zZy0+ZGF0YTsKKwlydHBoLT52ZXJzaW9uID0gUlRQX1ZFUlNJT047CisJcnRwaC0+cGFkZGluZyA9IDA7CisJcnRwaC0+ZXh0ZW5zaW9uID0gMDsKKwlydHBoLT5jc3JjX2NvdW50ID0gMDsKKwlydHBoLT5tYXJrZXIgPSAwOworCXJ0cGgtPnBheWxvYWRfdHlwZSA9IHBheWxvYWRfdHlwZTsKKwlydHBoLT5zZXF1ZW5jZSA9IGh0b25zKHJzLT50cmFuc21pdC5zZXF1ZW5jZSsrKTsKKwlydHBoLT50aW1lc3RhbXAgPSBodG9ubChycy0+dHJhbnNtaXQudGltZXN0YW1wKTsKKwlycy0+dHJhbnNtaXQudGltZXN0YW1wICs9IGR1cmF0aW9uOworCXJ0cGgtPnNzcmMgPSBodG9ubChycy0+dHJhbnNtaXQuc3NyYyk7CisJbWVtY3B5KG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkciksIGZyYW1lLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJbXNnYl9wdXQobXNnLCBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4pOworCW1zZ2JfZW5xdWV1ZSgmcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCisvKiBpdGVyYXRlIG92ZXIgYWxsIGNodW5rcyBpbiBvbmUgUlRDUCBtZXNzYWdlLCBsb29rIGZvciBDTkFNRSBJRXMgYW5kCisgKiByZXBsYWNlIGFsbCBvZiB0aG9zZSB3aXRoICduZXdfY25hbWUnICovCitzdGF0aWMgaW50IHJ0Y3Bfc2Rlc19jbmFtZV9tYW5nbGUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHJ0Y3BfaGRyICpyaCwKKwkJCQkgIHVfaW50MTZfdCAqcnRjcF9sZW4sIGNvbnN0IGNoYXIgKm5ld19jbmFtZSkKK3sKKwl1X2ludDhfdCAqcnRjcF9lbmQ7CisJdV9pbnQ4X3QgKmN1ciA9ICh1X2ludDhfdCAqKSByaDsKKwl1X2ludDhfdCB0YWcsIGxlbiA9IDA7CisKKwlydGNwX2VuZCA9IGN1ciArICpydGNwX2xlbjsKKwkvKiBtb3ZlIGN1ciB0byBlbmQgb2YgUlRQIGhlYWRlciAqLworCWN1ciArPSBzaXplb2YoKnJoKTsKKworCS8qIGl0ZXJhdGUgb3ZlciBDaHVua3MgKi8KKwl3aGlsZSAoY3VyKzQgPCBydGNwX2VuZCkgeworCQkvKiBza2lwIGZvdXIgYnl0ZXMgU1NSQy9DU1JDICovCisJCWN1ciArPSA0OworCQorCQkvKiBpdGVyYXRlIG92ZXIgSUUncyBpbnNpZGUgdGhlIGNodW5rICovCisJCXdoaWxlIChjdXIrMSA8IHJ0Y3BfZW5kKSB7CisJCQl0YWcgPSAqY3VyKys7CisJCQlpZiAodGFnID09IDApIHsKKwkJCQkvKiBlbmQgb2YgY2h1bmssIHNraXAgYWRkaXRpb25hbCB6ZXJvICovCisJCQkJd2hpbGUgKCpjdXIrKyA9PSAwKSB7IH0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9ICpjdXIrKzsKKwkKKwkJCWlmICh0YWcgPT0gUlRDUF9JRV9DTkFNRSkgeworCQkJCS8qIHdlJ3ZlIGZvdW5kIHRoZSBDTkFNRSwgbGV0cyBtYW5nbGUgaXQgKi8KKwkJCQlpZiAobGVuIDwgc3RybGVuKG5ld19jbmFtZSkpIHsKKwkJCQkJLyogd2UgbmVlZCB0byBtYWtlIG1vcmUgc3BhY2UgKi8KKwkJCQkJaW50IGluY3JlYXNlID0gc3RybGVuKG5ld19jbmFtZSkgLSBsZW47CisKKwkJCQkJbXNnYl9wdXNoKG1zZywgaW5jcmVhc2UpOworCQkJCQltZW1tb3ZlKGN1citsZW4raW5jcmVhc2UsIGN1citsZW4sCisJCQkJCQlydGNwX2VuZCAtIChjdXIrbGVuKSk7CisJCQkJCS8qIEZJWE1FOiB3ZSBoYXZlIHRvIHJlc3BlY3QgUlRDUAorCQkJCQkgKiBwYWRkaW5nL2FsaWdubWVudCBydWxlcyEgKi8KKwkJCQkJbGVuICs9IGluY3JlYXNlOworCQkJCQkqKGN1ci0xKSArPSBpbmNyZWFzZTsKKwkJCQkJcnRjcF9lbmQgKz0gaW5jcmVhc2U7CisJCQkJCSpydGNwX2xlbiArPSBpbmNyZWFzZTsKKwkJCQl9CisJCQkJLyogY29weSBuZXcgQ05BTUUgaW50byBtZXNzYWdlICovCisJCQkJbWVtY3B5KGN1ciwgbmV3X2NuYW1lLCBzdHJsZW4obmV3X2NuYW1lKSk7CisJCQkJLyogRklYTUU6IHplcm8gdGhlIHBhZGRpbmcgaW4gY2FzZSBuZXcgQ05BTUUKKwkJCQkgKiBpcyBzbWFsbGVyIHRoYW4gb2xkIG9uZSAhISEgKi8KKwkJCX0KKwkJCWN1ciArPSBsZW47CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNwX21hbmdsZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0Y3A7CisJc3RydWN0IHJ0Y3BfaGRyICpydHBoOworCXVfaW50MTZfdCBvbGRfbGVuOworCWludCByYzsKKworCWlmICghbWFuZ2xlX3J0Y3BfY25hbWUpCisJCXJldHVybiAwOworCisJcHJpbnRmKCJSVENQXG4iKTsKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiBSVENQIG1lc3NhZ2VzICovCisJcnRwaCA9IChzdHJ1Y3QgcnRjcF9oZHIgKiltc2ctPmRhdGE7CisJd2hpbGUgKCh2b2lkICopcnRwaCArIHNpemVvZigqcnRwaCkgPD0gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQlvbGRfbGVuID0gKG50b2hzKHJ0cGgtPmxlbmd0aCkgKyAxKSAqIDQ7CisJCWlmICgodm9pZCAqKXJ0cGggKyBvbGRfbGVuID4gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRDUCBwYWNrZXQgdG9vIHNob3J0IGZvciAiCisJCQkJImxlbmd0aCBlbGVtZW50XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChydHBoLT50eXBlID09IFJUQ1BfVFlQRV9TREVTKSB7CisJCQljaGFyIG5ld19jbmFtZVsyNTVdOworCQkJc3RybmNweShuZXdfY25hbWUsIGluZXRfbnRvYShyc3MtPnNpbl9sb2NhbC5zaW5fYWRkciksCisJCQkJc2l6ZW9mKG5ld19jbmFtZSkpOworCQkJbmV3X2NuYW1lW3NpemVvZihuZXdfY25hbWUpLTFdID0gJ1wwJzsKKwkJCXJjID0gcnRjcF9zZGVzX2NuYW1lX21hbmdsZShtc2csIHJ0cGgsICZvbGRfbGVuLAorCQkJCQkJICAgIG5ld19jbmFtZSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCQlydHBoID0gKHZvaWQgKilydHBoICsgb2xkX2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIGluY29taW5nIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3JlYWQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUlRQX0FMTE9DX1NJWkUsICJSVFAvUlRDUCIpOworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqb3RoZXJfcnNzOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSByZWFkKHJzcy0+YmZkLmZkLCBtc2ctPmRhdGEsIFJUUF9BTExPQ19TSVpFKTsKKwlpZiAocmMgPD0gMCkgeworCQlyc3MtPmJmZC53aGVuICY9IH5CU0NfRkRfUkVBRDsKKwkJcmV0dXJuIHJjOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmMpOworCisJc3dpdGNoIChycy0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCWlmICghcnMtPnByb3h5Lm90aGVyX3NvY2spIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRQKQorCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydHA7CisJCWVsc2UgaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRDUCkgeworCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydGNwOworCQkJLyogbW9kaWZ5IFJUQ1AgU0RFUyBDTkFNRSAqLworCQkJcmMgPSBydGNwX21hbmdsZShtc2csIHJzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJbXNnYl9lbnF1ZXVlKCZvdGhlcl9yc3MtPnR4X3F1ZXVlLCBtc2cpOworCQlvdGhlcl9yc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQlpZiAoIXJzLT5yZWNlaXZlLmNhbGxyZWYgfHwgIXJzLT5yZWNlaXZlLm5ldCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVENQKSB7CisJCQlpZiAoIW1hbmdsZV9ydGNwX2NuYW1lKSB7CisJCQkJbXNnYl9mcmVlKG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBtb2RpZnkgUlRDUCBTREVTIENOQU1FICovCisJCQlyYyA9IHJ0Y3BfbWFuZ2xlKG1zZywgcnMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJbXNnYl9lbnF1ZXVlKCZyc3MtPnR4X3F1ZXVlLCBtc2cpOworCQkJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCQlicmVhazsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciAhPSBSVFBfUFJJVl9SVFApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJcmMgPSBydHBfZGVjb2RlKG1zZywgcnMtPnJlY2VpdmUuY2FsbHJlZiwgJm5ld19tc2cpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCW1zZ2JfZW5xdWV1ZSgmcnMtPnJlY2VpdmUubmV0LT51cHF1ZXVlLCBuZXdfbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9OT05FOiAvKiBpZiBzb2NrZXQgZXhpc3RzLCBidXQgZGlzYWJsZWQgYnkgYXBwICovCisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisvKiB3cml0ZSBmcm9tIHR4X3F1ZXVlIHRvIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3dyaXRlKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd3JpdHRlbjsKKworCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJcnNzLT5iZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cml0dGVuID0gd3JpdGUocnNzLT5iZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJTE9HUChETUlCLCBMT0dMX0VSUk9SLCAic2hvcnQgd3JpdGUiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogY2FsbGJhY2sgZm9yIHRoZSBzZWxlY3QuYzpiZmRfKiBsYXllciAqLworc3RhdGljIGludCBydHBfYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBydHBfc29ja2V0ICpycyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzczsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yKSB7CisJY2FzZSBSVFBfUFJJVl9SVFA6CisJCXJzcyA9ICZycy0+cnRwOworCQlicmVhazsKKwljYXNlIFJUUF9QUklWX1JUQ1A6CisJCXJzcyA9ICZycy0+cnRjcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZsYWdzICYgQlNDX0ZEX1JFQUQpCisJCXJ0cF9zb2NrZXRfcmVhZChycywgcnNzKTsKKworCWlmIChmbGFncyAmIEJTQ19GRF9XUklURSkKKwkJcnRwX3NvY2tldF93cml0ZShycywgcnNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JzcyhzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywgCisJCSAgICAgc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBpbnQgZmQsIGludCBwcml2X25yKQoreworCS8qIGluaXRpYWxpemUgYmZkICovCisJcnNzLT5iZmQuZmQgPSBmZDsKKwlyc3MtPmJmZC5kYXRhID0gcnM7CisJcnNzLT5iZmQucHJpdl9uciA9IHByaXZfbnI7CisJcnNzLT5iZmQuY2IgPSBydHBfYmZkX2NiOworfQorCitzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldF9jcmVhdGUodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzOworCisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2NyZWF0ZSgpOiAiKTsKKworCXJzID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgcnRwX3NvY2tldCk7CisJaWYgKCFycykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJnJzLT5ydHAudHhfcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmcnMtPnJ0Y3AudHhfcXVldWUpOworCisJcmMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpbml0X3JzcygmcnMtPnJ0cCwgcnMsIHJjLCBSVFBfUFJJVl9SVFApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRwX3NvY2tldDsKKworCXJjID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydHBfYmZkOworCisJaW5pdF9yc3MoJnJzLT5ydGNwLCBycywgcmMsIFJUUF9QUklWX1JUQ1ApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0Y3Bfc29ja2V0OworCisJREVCVUdQQyhETVVYLCAic3VjY2Vzc1xuIik7CisKKwlyYyA9IHJ0cF9zb2NrZXRfYmluZChycywgSU5BRERSX0FOWSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRjcF9iZmQ7CisKKwlyZXR1cm4gcnM7CisKK291dF9ydGNwX2JmZDoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKK291dF9ydGNwX3NvY2tldDoKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworb3V0X3J0cF9iZmQ6CisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKK291dF9ydHBfc29ja2V0OgorCWNsb3NlKHJzLT5ydHAuYmZkLmZkKTsKK291dF9mcmVlOgorCXRhbGxvY19mcmVlKHJzKTsKKwlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJ0cF9zdWJfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsIHVfaW50MzJfdCBpcCwKKwkJCQl1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc29ja2xlbl90IGFsZW4gPSBzaXplb2YocnNzLT5zaW5fbG9jYWwpOworCisJcnNzLT5zaW5fbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJcnNzLT5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX2xvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfUkVBRDsKKworCXJjID0gYmluZChyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJICBzaXplb2YocnNzLT5zaW5fbG9jYWwpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSB0aGUgYWRkcmVzcyB3ZSBhY3R1YWxseSBib3VuZCB0bywgaW4gY2FzZSB3ZQorCSAqIHBhc3NlZCBJTkFERFJfQU5ZIGFzIElQIGFkZHJlc3MgKi8KKwlyZXR1cm4gZ2V0c29ja25hbWUocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCQkgICAmYWxlbik7Cit9CisKKyNkZWZpbmUgUlRQX1BPUlRfQkFTRQkzMDAwMAorc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X3VkcF9wb3J0ID0gUlRQX1BPUlRfQkFTRTsKKworLyogYmluZCBhIFJUUCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzICovCitpbnQgcnRwX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwKQoreworCWludCByYyA9IC1FSU87CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2JpbmQocnM9JXAsIElQPSVzKTogIiwgcnMsCisJCWluZXRfbnRvYShpYSkpOworCisJLyogdHJ5IHRvIGJpbmQgdG8gYSBjb25zZWN1dGl2ZSBwYWlyIG9mIHBvcnRzICovCisJZm9yIChuZXh0X3VkcF9wb3J0ID0gbmV4dF91ZHBfcG9ydCAlIDB4ZmZmZjsKKwkgICAgIG5leHRfdWRwX3BvcnQgPCAweGZmZmY7IG5leHRfdWRwX3BvcnQgKz0gMikgeworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydHAsIGlwLCBuZXh0X3VkcF9wb3J0KTsKKwkJaWYgKHJjICE9IDApCisJCQljb250aW51ZTsKKworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydGNwLCBpcCwgbmV4dF91ZHBfcG9ydCsxKTsKKwkJaWYgKHJjID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKHJjIDwgMCkgeworCQlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWEuc19hZGRyID0gcnMtPnJ0cC5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyOworCURFQlVHUEMoRE1VWCwgIkJPVU5EX0lQPSVzLCBCT1VORF9QT1JUPSV1XG4iLAorCQlpbmV0X250b2EoaWEpLCBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCkpOworCXJldHVybiBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3N1Yl9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywKKwkJCQkgIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHJzcy0+c2luX2xvY2FsKTsKKworCXJzcy0+c2luX3JlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlyc3MtPnNpbl9yZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX3JlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJcmMgPSBjb25uZWN0KHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopICZyc3MtPnNpbl9yZW1vdGUsCisJCSAgICAgc2l6ZW9mKHJzcy0+c2luX3JlbW90ZSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBnZXRzb2NrbmFtZShyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJCSAgICZhbGVuKTsKK30KKworLyogJ2Nvbm5lY3QnIGEgUlRQIHNvY2tldCB0byBhIHJlbW90ZSBwZWVyICovCitpbnQgcnRwX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2Nvbm5lY3QocnM9JXAsIGlwPSVzLCBwb3J0PSV1KVxuIiwKKwkJcnMsIGluZXRfbnRvYShpYSksIHBvcnQpOworCisJcmMgPSBydHBfc3ViX3NvY2tldF9jb25uZWN0KCZycy0+cnRwLCBpcCwgcG9ydCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3QoJnJzLT5ydGNwLCBpcCwgcG9ydCsxKTsKK30KKworLyogYmluZCB0d28gUlRQL1JUQ1Agc29ja2V0cyB0b2dldGhlciAqLworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcikKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfcHJveHkodGhpcz0lcCwgb3RoZXI9JXApXG4iLAorCQl0aGlzLCBvdGhlcik7CisKKwl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUFJPWFk7CisJdGhpcy0+cHJveHkub3RoZXJfc29jayA9IG90aGVyOworCisJb3RoZXItPnJ4X2FjdGlvbiA9IFJUUF9QUk9YWTsKKwlvdGhlci0+cHJveHkub3RoZXJfc29jayA9IHRoaXM7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmluZCBSVFAvUlRDUCBzb2NrZXQgdG8gYXBwbGljYXRpb24gKi8KK2ludCBydHBfc29ja2V0X3Vwc3RyZWFtKHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9wcm94eSh0aGlzPSVwLCBjYWxscmVmPSV1KVxuIiwKKwkJdGhpcywgY2FsbHJlZik7CisKKwlpZiAoY2FsbHJlZikgeworCQl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUkVDVl9VUFNUUkVBTTsKKwkJdGhpcy0+cmVjZWl2ZS5uZXQgPSBuZXQ7CisJCXRoaXMtPnJlY2VpdmUuY2FsbHJlZiA9IGNhbGxyZWY7CisJfSBlbHNlCisJCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdHhfcXVldWUoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwkKKwl3aGlsZSAoKG1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSkpKQorCQltc2diX2ZyZWUobXNnKTsKK30KKworaW50IHJ0cF9zb2NrZXRfZnJlZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2ZyZWUocnM9JXApXG4iLCBycyk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhdmUgcmVmZXJlbmNlcyBkYW5nbGluZyB0byB1cyAqLworCWlmIChycy0+cnhfYWN0aW9uID09IFJUUF9QUk9YWSAmJgorCSAgICBycy0+cHJveHkub3RoZXJfc29jaykKKwkJcnMtPnByb3h5Lm90aGVyX3NvY2stPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKKwljbG9zZShycy0+cnRwLmJmZC5mZCk7CisJZnJlZV90eF9xdWV1ZSgmcnMtPnJ0cCk7CisKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworCWZyZWVfdHhfcXVldWUoJnJzLT5ydGNwKTsKKworCXRhbGxvY19mcmVlKHJzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMgYi9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRhMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMKQEAgLTAsMCArMSwxMzQ2IEBACisvKgorICogU0NDUCBtYW5hZ2VtZW50IGNvZGUKKyAqCisgKiAoQykgMjAwOSwgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSwgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKworc3RhdGljIHZvaWQgKnRhbGxfc2NjcF9jdHg7CitzdGF0aWMgTExJU1RfSEVBRChzY2NwX2Nvbm5lY3Rpb25zKTsKKworI2RlZmluZSBTQ0NQX01TR19TSVpFIDQwOTYKKyNkZWZpbmUgU0NDUF9NU0dfSEVBRFJPT00gMTI4CisKKy8qIGdsb2JhbCBkYXRhICovCitjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCBzY2NwX3Nzbl9ic3NhcCA9IHsKKwkuc2NjcF9mYW1pbHkJPSAwLAorCS5zY2NwX3Nzbgk9IFNDQ1BfU1NOX0JTU0FQLAorfTsKKworc3RydWN0IHNjY3Bfc3lzdGVtIHsKKwkvKiBsYXllcjMgLT4gbGF5ZXIyICovCisJaW50ICgqd3JpdGVfZGF0YSkoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpOworCXZvaWQgKndyaXRlX2NvbnRleHQ7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9zeXN0ZW0gc2NjcF9zeXN0ZW0gPSB7CisJLndyaXRlX2RhdGEgPSBOVUxMLAorfTsKKworc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayB7CisJLyogY29ubmVjdGlvbiBiYXNlZCAqLworCWludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCB2b2lkICopOworCXZvaWQgKmFjY2VwdF9jb250ZXh0OworCisJLyogY29ubmVjdGlvbiBsZXNzICovCisJaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopOworCXZvaWQgKnJlYWRfY29udGV4dDsKKworCXVfaW50OF90IHNzbjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBjYWxsYmFjazsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKHNjY3BfY2FsbGJhY2tzKTsKKworc3RhdGljIHN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKl9maW5kX3Nzbih1X2ludDhfdCBzc24pCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJnNjY3BfY2FsbGJhY2tzLCBjYWxsYmFjaykgeworCQlpZiAoY2ItPnNzbiA9PSBzc24pCisJCQlyZXR1cm4gY2I7CisJfQorCisJLyogbmVlZCB0byBhZGQgb25lICovCisJY2IgPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrKTsKKwlpZiAoIWNiKSB7CisJCURFQlVHUChEU0NDUCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzY2NwIGNhbGxiYWNrLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNiLT5zc24gPSBzc247CisJbGxpc3RfYWRkX3RhaWwoJmNiLT5jYWxsYmFjaywgJnNjY3BfY2FsbGJhY2tzKTsKKwlyZXR1cm4gY2I7Cit9CisKKworc3RhdGljIGludCBfc2VuZF9tc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlyZXR1cm4gc2NjcF9zeXN0ZW0ud3JpdGVfZGF0YShtc2csIHNjY3Bfc3lzdGVtLndyaXRlX2NvbnRleHQpOworfQorCisvKgorICogcGFyc2luZyByb3V0aW5lcworICovCitzdGF0aWMgaW50IGNvcHlfYWRkcmVzcyhzdHJ1Y3Qgc2NjcF9hZGRyZXNzICphZGRyLCB1X2ludDhfdCBvZmZzZXQsIHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICpwYXJ0eTsKKworCWludCByb29tID0gbXNnYl9sMmxlbihtc2diKSAtIG9mZnNldDsKKwl1X2ludDhfdCByZWFkID0gMDsKKwl1X2ludDhfdCBsZW5ndGg7CisKKwlpZiAocm9vbSA8PSAwKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggcm9vbSBmb3IgYW4gYWRkcmVzczogJXVcbiIsIHJvb20pOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuZ3RoID0gbXNnYi0+bDJoW29mZnNldF07CisJaWYgKHJvb20gPD0gbGVuZ3RoKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggcm9vbSBmb3Igb3B0aW9uYWwgZGF0YSAldSAldVxuIiwgcm9vbSwgbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJcGFydHkgPSAoc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgKikobXNnYi0+bDJoICsgb2Zmc2V0ICsgMSk7CisJaWYgKHBhcnR5LT5wb2ludF9jb2RlX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAyKSB7CisJCSAgICBERUJVR1AoRFNDQ1AsICJQT0kgZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKworCQltZW1jcHkoJmFkZHItPnBvaSwgJnBhcnR5LT5kYXRhW3JlYWRdLCAyKTsKKwkJcmVhZCArPSAyOworCX0KKworCWlmIChwYXJ0eS0+c3NuX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAxKSB7CisJCSAgICBERUJVR1AoRFNDQ1AsICJTU04gZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKwkJYWRkci0+c3NuID0gcGFydHktPmRhdGFbcmVhZF07CisJCXJlYWQgKz0gMTsKKwl9CisKKwlpZiAocGFydHktPmdsb2JhbF90aXRsZV9pbmRpY2F0b3IpIHsKKwkJREVCVUdQKERTQ0NQLCAiR1RJIG5vdCBzdXBwb3J0ZWQgJXVcbiIsICoodV9pbnQ4X3QgKilwYXJ0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyLT5hZGRyZXNzID0gKnBhcnR5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkZHJlc3Moc3RydWN0IHNjY3BfYWRkcmVzcyAqYWRkcikKK3sKKwkvKiBpZ25vcmUgcG9pbnRfY29kZV9pbmRpY2F0b3IuLi4gaXQgc2hvdWxkIGJlIHplcm8uLi4gYnV0ICovCisJaWYgKGFkZHItPmFkZHJlc3Muc3NuX2luZGljYXRvciAhPSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3MuZ2xvYmFsX3RpdGxlX2luZGljYXRvciA9PSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3Mucm91dGluZ19pbmRpY2F0b3IgIT0gMSkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZhZGRyLT5hZGRyZXNzLCBhZGRyLT5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShjb25zdCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgKmRhdGEpCit7CisJdV9pbnQxNl90IHJvb20gPSBtc2diX2wybGVuKG1zZ2IpIC0gb2Zmc2V0OworCXVfaW50MTZfdCByZWFkID0gMDsKKworCXdoaWxlIChyb29tID4gcmVhZCkgeworCQl1X2ludDhfdCB0eXBlID0gbXNnYi0+bDJoW29mZnNldCArIHJlYWRdOworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAocmVhZCArIDEgPj0gcm9vbSkgeworCQkJREVCVUdQKERTQ0NQLCAibm8gcGxhY2UgZm9yIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVfaW50OF90IGxlbmd0aCA9IG1zZ2ItPmwyaFtvZmZzZXQgKyByZWFkICsgMV07CisJCXJlYWQgKz0gMiArIGxlbmd0aDsKKworCisJCWlmIChyb29tIDw9IHJlYWQpIHsKKwkJCURFQlVHUChEU0NDUCwgIm5vIHNwYWNlIGZvciB0aGUgZGF0YTogdHlwZTogJWQgcmVhZDogJWQgcm9vbTogJWQgbDI6ICVkXG4iLAorCQkJICAgICAgIHR5cGUsIHJlYWQsIHJvb20sIG1zZ2JfbDJsZW4obXNnYikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19EQVRBKSB7CisJCQlkYXRhLT5kYXRhX2xlbiA9IGxlbmd0aDsKKwkJCWRhdGEtPmRhdGFfc3RhcnQgPSBvZmZzZXQgKyByZWFkIC0gbGVuZ3RoOworCQl9CisKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBvcHRpb25hbF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0LCBvcHRpb25hbF9zdGFydCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsZWRfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCwgdmFyaWFibGVfY2FsbGVkKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKW1zZ2ItPmwyaDsKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IG91dCB0aGUgY2FsbGluZyBhbmQgY2FsbGVkIGFkZHJlc3MuIEFkZCB0aGUgb2Zmc2V0ICovCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQsIGNhbGxlZF9vZmZzZXQgKyByZXEtPnZhcmlhYmxlX2NhbGxlZCwgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmcmVxLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJLyoKKwkgKiBwYXJzZSBvcHRpb25hbCBkYXRhLgorCSAqLworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZXEtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQpOworCXN0YXRpYyBpbnQgb3B0aW9uYWxfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKnJscyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICopIG1zZ2ItPmwyaDsKKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBzdHJ1Y3QgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPiBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmxzLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJnJscy0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZybHMtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkKTsKKwlzdGF0aWMgaW50IG9wdGlvbmFsX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqcmVmOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVmID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqKSBtc2diLT5sMmg7CisKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZyZWYtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZWYtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0pOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3Qgb3B0aW9uYWxfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqY29uOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29uID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmY29uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJmNvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyBjb24tPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqY21wbDsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNtcGwgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmY21wbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZjbXBsLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEpOworCXN0YXRpYyBpbnQgdmFyaWFibGVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSwgdmFyaWFibGVfc3RhcnQpOworCisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxID0gKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKiltc2diLT5sMmg7CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgc3RydWN0ICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diID4gaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGR0MS0+c2VnbWVudGluZyAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIlRoaXMgcGFja2V0IGhhcyBzZWdtZW50aW5nLCBub3Qgc3VwcG9ydGVkOiAlZFxuIiwgZHQxLT5zZWdtZW50aW5nKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmR0MS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogc29tZSBtb3JlICBzaXplIGNoZWNrcyBpbiBoZXJlICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCB2YXJpYWJsZV9vZmZzZXQgKyBkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgMSkgeworCQlERUJVR1AoRFNDQ1AsICJOb3QgZW5vdWdoIHNwYWNlIGZvciB2YXJpYWJsZSBzdGFydDogJXUgJXVcbiIsCisJCQltc2diX2wybGVuKG1zZ2IpLCBkdDEtPnZhcmlhYmxlX3N0YXJ0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGF0YV9sZW4gPSBtc2diLT5sMmhbdmFyaWFibGVfb2Zmc2V0ICsgZHQxLT52YXJpYWJsZV9zdGFydF07CisJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgdmFyaWFibGVfb2Zmc2V0ICsgMV07CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSA8IHJlc3VsdC0+ZGF0YV9sZW4pIHsKKwkJREVCVUdQKERTQ0NQLCAiTm90IGVub3VnaCByb29tIGZvciB0aGUgcGF5bG9hZDogJXUgJXVcbiIsCisJCQltc2diX2wzbGVuKG1zZ2IpLCByZXN1bHQtPmRhdGFfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfdWR0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGVkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxlZCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsaW5nX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxpbmcpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9kYXRhKTsKKworCXN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKnVkdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICopbXNnYi0+bDJoOworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29weSBvdXQgdGhlIGNhbGxpbmcgYW5kIGNhbGxlZCBhZGRyZXNzLiBBZGQgdGhlIG9mZiAqLworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkLCBjYWxsZWRfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9jYWxsZWQsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsaW5nLCBjYWxsaW5nX29mZnNldCArIHVkdC0+dmFyaWFibGVfY2FsbGluZywgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGluZykgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCX0KKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBkYXRhICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBkYXRhX29mZnNldCArIHVkdC0+dmFyaWFibGVfZGF0YSArIDEpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlciArIG9mZnNldCAldSAldSAldVxuIiwKKwkJCW1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplLCB1ZHQtPnZhcmlhYmxlX2RhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwltc2diLT5sM2ggPSAmdWR0LT5kYXRhW3VkdC0+dmFyaWFibGVfZGF0YV07CisJcmVzdWx0LT5kYXRhX2xlbiA9IG1zZ2JfbDNsZW4obXNnYik7CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSAhPSAgbXNnYi0+bDNoWy0xXSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIGlzIHRydW5jYXRlZCBpczogJXUgc2hvdWxkOiAldVxuIiwKKwkJCW1zZ2JfbDNsZW4obXNnYiksIG1zZ2ItPmwzaFstMV0pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2VfaXQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV9pdCk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICppdDsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWl0ID0gKHN0cnVjdCBzY2NwX2RhdGFfaXQgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTZW5kIFVEVC4gQ3VycmVudGx5IHdlIGhhdmUgYSBmaXhlZCBhZGRyZXNzLi4uCisgKi8KK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9kYXRhKGludCBjbGFzcywgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmluLAorCQkJICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKm91dCwgc3RydWN0IG1zZ2IgKnBheWxvYWQpCit7CisJc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqdWR0OworCXVfaW50OF90ICpkYXRhOworCWludCByZXQ7CisKKwlpZiAobXNnYl9sM2xlbihwYXlsb2FkKSA+IDI1NikgeworCQlERUJVR1AoRFNDQ1AsICJUaGUgcGF5bG9hZCBpcyB0b28gYmlnIGZvciBvbmUgdWR0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJCSAgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3A6IHVkdCIpOworCW1zZy0+bDJoID0gJm1zZy0+ZGF0YVswXTsKKwl1ZHQgPSAoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqKW1zZ2JfcHV0KG1zZywgc2l6ZW9mKCp1ZHQpKTsKKworCXVkdC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfVURUOworCXVkdC0+cHJvdG9fY2xhc3MgPSBjbGFzczsKKwl1ZHQtPnZhcmlhYmxlX2NhbGxlZCA9IDM7CisJdWR0LT52YXJpYWJsZV9jYWxsaW5nID0gNTsKKwl1ZHQtPnZhcmlhYmxlX2RhdGEgPSA3OworCisJLyogZm9yIHZhcmlhYmxlIGRhdGEgd2Ugc3RhcnQgd2l0aCBhIHNpemUgYW5kIHRoZSBkYXRhICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBvdXQtPnNjY3Bfc3NuOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBpbi0+c2NjcF9zc247CisKKwkvKiBjb3B5IHRoZSBwYXlsb2FkICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIG1zZ2JfbDNsZW4ocGF5bG9hZCkpOworCWRhdGFbMF0gPSBtc2diX2wzbGVuKHBheWxvYWQpOworCW1lbWNweSgmZGF0YVsxXSwgcGF5bG9hZC0+bDNoLCBtc2diX2wzbGVuKHBheWxvYWQpKTsKKworCXJldCA9IF9zZW5kX21zZyhtc2cpOworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfcmVhZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJaWYgKF9zY2NwX3BhcnNlX3VkdChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwljYiA9IF9maW5kX3NzbihyZXN1bHQuY2FsbGVkLnNzbik7CisJaWYgKCFjYiB8fCAhY2ItPnJlYWRfY2IpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm8gcm91dGluZyBmb3IgVURUIGZvciBjYWxsZWQgU1NOOiAldVxuIiwgcmVzdWx0LmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJcmV0dXJuIGNiLT5yZWFkX2NiKG1zZ2IsIG1zZ2JfbDNsZW4obXNnYiksIGNiLT5yZWFkX2NvbnRleHQpOworfQorCisvKgorICogaGFuZGxlIGNvbm5lY3Rpb24gb3JpZW50YXRlZCBtZXRob2RzCisgKi8KK3N0YXRpYyBpbnQgc291cmNlX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChyZWZlcmVuY2UsICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBzaXplb2YoKnJlZmVyZW5jZSkpID09IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmZXJlbmNlKQoreworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAobWVtY21wKHJlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKCpyZWZlcmVuY2UpKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RhdGljIHVfaW50MzJfdCBsYXN0X3JlZiA9IDB4MzAwMDA7CisJaW50IHdyYXBwZWQgPSAwOworCisJZG8geworCQlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKwkJcmVmZXJlbmNlLm9jdGV0MSA9IChsYXN0X3JlZiA+PiAgMCkgJiAweGZmOworCQlyZWZlcmVuY2Uub2N0ZXQyID0gKGxhc3RfcmVmID4+ICA4KSAmIDB4ZmY7CisJCXJlZmVyZW5jZS5vY3RldDMgPSAobGFzdF9yZWYgPj4gMTYpICYgMHhmZjsKKworCQkrK2xhc3RfcmVmOworCQkvKiBkbyBub3QgdXNlIHRoZSByZXZlcnNlZCB3b3JkIGFuZCB3cmFwIGFyb3VuZCAqLworCQlpZiAoKGxhc3RfcmVmICYgMHgwMEZGRkZGRikgPT0gMHgwMEZGRkZGRikgeworCQkJREVCVUdQKERTQ0NQLCAiV3JhcHBlZCBzZWFyY2hpbmcgZm9yIGEgZnJlZSBjb2RlXG4iKTsKKwkJCWxhc3RfcmVmID0gMDsKKwkJCSsrd3JhcHBlZDsKKwkJfQorCisJCWlmIChzb3VyY2VfbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoJnJlZmVyZW5jZSkgPT0gMCkgeworCQkJY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAod3JhcHBlZCAhPSAyKTsKKworCURFQlVHUChEU0NDUCwgIkZpbmRpbmcgYSBmcmVlIHJlZmVyZW5jZSBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG5ld19zdGF0ZSkKK3sKKwlpbnQgb2xkX3N0YXRlID0gY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZTsKKworCWNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlX2NiKQorCQljb25uZWN0aW9uLT5zdGF0ZV9jYihjb25uZWN0aW9uLCBvbGRfc3RhdGUpOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfcmVmdXNlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNyY19yZWYsIGludCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKnJlZjsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgcmV0OworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgcmVmIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlyZWYgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqcmVmKSk7CisJcmVmLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUkVGOworCW1lbWNweSgmcmVmLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNyY19yZWYsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJcmVmLT5jYXVzZSA9IGNhdXNlOworCXJlZi0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZ2IsIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnYik7CisJbXNnYl9mcmVlKG1zZ2IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVzcG9uc2U7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICpjb25maXJtOworCXVfaW50OF90ICpvcHRpb25hbF9kYXRhOworCWludCByZXQ7CisKKwlpZiAoYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2UoY29ubmVjdGlvbikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmVzcG9uc2UgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBjb25maXJtIik7CisJcmVzcG9uc2UtPmwyaCA9ICZyZXNwb25zZS0+ZGF0YVswXTsKKworCWNvbmZpcm0gPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICopIG1zZ2JfcHV0KHJlc3BvbnNlLCBzaXplb2YoKmNvbmZpcm0pKTsKKworCWNvbmZpcm0tPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NDOworCW1lbWNweSgmY29uZmlybS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZjb25maXJtLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKTsKKwljb25maXJtLT5wcm90b19jbGFzcyA9IDI7CisJY29uZmlybS0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJb3B0aW9uYWxfZGF0YSA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChyZXNwb25zZSwgMSk7CisJb3B0aW9uYWxfZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCXJldCA9IF9zZW5kX21zZyhyZXNwb25zZSk7CisJbXNnYl9mcmVlKHJlc3BvbnNlKTsKKworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmNhbGxlZCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVxdWVzdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKnJlcTsKKwl1X2ludDhfdCAqZGF0YTsKKwl1X2ludDhfdCBleHRyYV9zaXplID0gMyArIDE7CisJaW50IHJldDsKKworCisJaWYgKG1zZyAmJiAobXNnYl9sM2xlbihtc2cpIDwgMyB8fCBtc2diX2wzbGVuKG1zZykgPiAxMzApKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgYW1vdW50IG9mIGRhdGEuLi4gJWRcbiIsIG1zZ2JfbDNsZW4obXNnKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBhIGlkICovCisJaWYgKGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKGNvbm5lY3Rpb24pICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiQXNzaWduaW5nIGEgbG9jYWwgcmVmZXJlbmNlIGZhaWxlZC5cbiIpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfU0VUVVBfRVJST1IpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAobXNnKQorCQlleHRyYV9zaXplICs9IDIgKyBtc2diX2wzbGVuKG1zZyk7CisJcmVxdWVzdCA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgY29ubmVjdGlvbiByZXF1ZXN0Iik7CisJcmVxdWVzdC0+bDJoID0gJnJlcXVlc3QtPmRhdGFbMF07CisJcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKSBtc2diX3B1dChyZXF1ZXN0LCBzaXplb2YoKnJlcSkpOworCisJcmVxLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUjsKKwltZW1jcHkoJnJlcS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSk7CisJcmVxLT5wcm90b19jbGFzcyA9IDI7CisJcmVxLT52YXJpYWJsZV9jYWxsZWQgPSAyOworCXJlcS0+b3B0aW9uYWxfc3RhcnQgPSA0OworCisJLyogd3JpdGUgdGhlIGNhbGxlZCBwYXJ0eSBhZGRyZXNzICovCisJZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gY2FsbGVkLT5zY2NwX3NzbjsKKworCS8qIHdyaXRlIHRoZSBwYXlsb2FkICovCisJaWYgKG1zZykgeworCSAgICBkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMiArIG1zZ2JfbDNsZW4obXNnKSk7CisJICAgIGRhdGFbMF0gPSBTQ0NQX1BOQ19EQVRBOworCSAgICBkYXRhWzFdID0gbXNnYl9sM2xlbihtc2cpOworCSAgICBtZW1jcHkoJmRhdGFbMl0sIG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpOworCX0KKworCWRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmxpc3QsICZzY2NwX2Nvbm5lY3Rpb25zKTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVRVUVTVCk7CisKKwlyZXQgPSBfc2VuZF9tc2cocmVxdWVzdCk7CisJbXNnYl9mcmVlKHJlcXVlc3QpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqX2RhdGEpCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxOworCXVfaW50OF90ICpkYXRhOworCWludCBleHRyYV9zaXplOworCWludCByZXQ7CisKKwlpZiAobXNnYl9sM2xlbihfZGF0YSkgPCAyIHx8IG1zZ2JfbDNsZW4oX2RhdGEpID4gMjU2KSB7CisJCURFQlVHUChEU0NDUCwgImRhdGEgc2l6ZSB0b28gYmlnLCBzZWdtZW50aW5nIHVuaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWV4dHJhX3NpemUgPSAxICsgbXNnYl9sM2xlbihfZGF0YSk7CisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgZHQxIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlkdDEgPSAoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKmR0MSkpOworCWR0MS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfRFQxOworCW1lbWNweSgmZHQxLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJZHQxLT5zZWdtZW50aW5nID0gMDsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlkdDEtPnZhcmlhYmxlX3N0YXJ0ID0gMTsKKwlkYXRhID0gbXNnYl9wdXQobXNnYiwgZXh0cmFfc2l6ZSk7CisJZGF0YVswXSA9IGV4dHJhX3NpemUgLSAxOworCW1lbWNweSgmZGF0YVsxXSwgX2RhdGEtPmwzaCwgZXh0cmFfc2l6ZSAtIDEpOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZ2IpOworCW1zZ2JfZnJlZShtc2diKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9pdCAqaXQ7CisJaW50IHJldDsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGl0Iik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisJaXQgPSAoc3RydWN0IHNjY3BfZGF0YV9pdCAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKml0KSk7CisJaXQtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0lUOworCW1lbWNweSgmaXQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJml0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCWl0LT5wcm90b19jbGFzcyA9IDB4MjsKKwlpdC0+c2VxdWVuY2luZ1swXSA9IGl0LT5zZXF1ZW5jaW5nWzFdID0gMDsKKwlpdC0+Y3JlZGl0ID0gMDsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqcmVsOworCXVfaW50OF90ICpkYXRhOworCWludCByZXQ7CisKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsIFNDQ1BfTVNHX0hFQURST09NLAorCQkJCSAgInNjY3A6IGNvbm5lY3Rpb24gcmVsZWFzZWQiKTsKKwltc2ctPmwyaCA9ICZtc2ctPmRhdGFbMF07CisJcmVsID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKnJlbCkpOworCXJlbC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfUkxTRDsKKwlyZWwtPnJlbGVhc2VfY2F1c2UgPSBjYXVzZTsKKworCS8qIGNvcHkgdGhlIHNvdXJjZSByZWZlcmVuY2VzICovCisJbWVtY3B5KCZyZWwtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJnJlbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0UpOworCXJldCA9IF9zZW5kX21zZyhtc2cpOworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE9wZW4gYSBjb25uZWN0aW9uLiBUaGUgZm9sbG93aW5nIGlzIGdvaW5nIHRvIGhhcHBlbjoKKyAqCisgKgktIFZlcmlmeSB0aGUgcGFja2V0LCBlLmcuIHRoYXQgd2UgaGF2ZSBubyBvdGhlciBjb25uZWN0aW9uCisgKgkgIHRoYXQgaWQuCisgKiAgICAgIC0gQXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbgorICogICAgICAtIFRyeSB0byBvcGVuIHRoZSBjb25uZWN0aW9uIGJ5IGFzc2lnbmluZyBhIHNvdXJjZSBsb2NhbCByZWZlcmVuY2UKKyAqICAgICAgICBhbmQgc2VuZGluZyB0aGUgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJY2IgPSBfZmluZF9zc24ocmVzdWx0LmNhbGxlZC5zc24pOworCWlmICghY2IgfHwgIWNiLT5hY2NlcHRfY2IpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm8gcm91dGluZyBmb3IgQ1IgZm9yIGNhbGxlZCBTU046ICV1XG4iLCByZXN1bHQuY2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgc3lzdGVtIHdhbnRzIHRoaXMgY29ubmVjdGlvbiAqLworCWNvbm5lY3Rpb24gPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24pIHsKKwkJREVCVUdQKERTQ0NQLCAiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBzYW5pdHkgY2hlY2tzOgorCSAqCS0gSXMgdGhlIHNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgaW4gYW55IG90aGVyIGNvbm5lY3Rpb24/CisJICogdGhlbiB3aWxsIGNhbGwgYWNjZXB0LCBhc3NpZ24gYSAiZGVzdGluYXRpb24iIGxvY2FsIHJlZmVyZW5jZQorCSAqIGFuZCBzZW5kIGEgY29ubmVjdGlvbiBjb25maXJtLCBvdGhlcndpc2Ugd2Ugd2lsbCBzZW5kIGEgcmVmdXNlZWQKKwkgKiBvbmUuLi4uCisJICovCisJaWYgKGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIk5lZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb24gd2l0aCBleGlzdGluZyByZWZlcmVuY2VcbiIpOworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRSk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gLTE7CisJfQorCisJY29ubmVjdGlvbi0+aW5jb21pbmcgPSAxOworCWNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICpyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChjYi0+YWNjZXB0X2NiKGNvbm5lY3Rpb24sIGNiLT5hY2NlcHRfY29udGV4dCkgIT0gMCkgeworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKworCWxsaXN0X2FkZF90YWlsKCZjb25uZWN0aW9uLT5saXN0LCAmc2NjcF9jb25uZWN0aW9ucyk7CisKKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oY29ubmVjdGlvbikgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJTZW5kaW5nIGNvbmZpcm0gZmFpbGVkLi4uIG5vIGF2YWlsYWJsZSBzb3VyY2UgcmVmZXJlbmNlP1xuIik7CisKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCWxsaXN0X2RlbCgmY29ubmVjdGlvbi0+bGlzdCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgZGF0YSBsZXQgdXMgZm9yd2FyZCB0aGluZ3MuCisJICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm5lY3Rpb24tPmRhdGFfY2IpIHsKKwkJY29ubmVjdGlvbi0+ZGF0YV9jYihjb25uZWN0aW9uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdGhlIHJlbGVhc2UgY29uZmlybWVkICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBmaW5kIHRoZSBjb25uZWN0aW9uICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJREVCVUdQKERTQ0NQLCAiUmVsZWFzZSBjb21wbGV0ZSBvZiB1bmtub3duIGNvbm5lY3Rpb25cbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJbGxpc3RfZGVsKCZjb25uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgRGF0YSBGb3JtIDEgbWVzc2FnZSAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9kdDEoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCURFQlVHUChEU0NDUCwgIk5vIGNvbm5lY3Rpb24gZm91bmQgZm9yIGR0MSBkYXRhXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29uZmlybSBhIGNvbm5lY3Rpb24gcmVsZWFzZSAqLworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqcmxjOworCWludCByZXQ7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBybGMiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCXJsYyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpybGMpKTsKKwlybGMtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1JMQzsKKwltZW1jcHkoJnJsYy0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmcmxjLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjb25uZWN0aW9ucyBhbmQgc2V0IHRoZSBzdGF0ZS4gVXNlciBjb2RlCisJICogc2hvdWxkIG5vdyBmcmVlIHRoZSBlbnRyeS4KKwkgKi8KKwlsbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNvbm5lY3Rpb24gcmVsZWFzZWQsIHNlbmQgYSByZWxlYXNlZCBjb25maXJtICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IsICZyZXN1bHQpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJREVCVUdQKERTQ0NQLCAiVW5rbm93biBjb25uZWN0aW9uIHdhcyByZWxlYXNlZC5cbiIpOworCXJldHVybiAtMTsKKworCS8qIHdlIGhhdmUgZm91bmQgYSBjb25uZWN0aW9uICovCitmb3VuZDoKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCS8qIGdlbmVyYXRlIGEgcmVzcG9uc2UgKi8KKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoY29ubikgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJTZW5kaW5nIHJlbGVhc2UgY29uZmlybWVkIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWZ1c2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlERUJVR1AoRFNDQ1AsICJSZWZ1c2VkIGJ1dCBubyBjb25uZWN0aW9uIGZvdW5kXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisKKwlsbGlzdF9kZWwoJmNvbm4tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlERUJVR1AoRFNDQ1AsICJDb25maXJtZWQgYnV0IG5vIGNvbm5lY3Rpb24gZm91bmRcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJLyogY29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBjb25uZWN0aW9uICovCisJY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gKnJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBzY2NwX3N5c3RlbV9pbml0KGludCAoKm91dGdvaW5nKShzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KSwgdm9pZCAqY3R4KQoreworCXNjY3Bfc3lzdGVtLndyaXRlX2RhdGEgPSBvdXRnb2luZzsKKwlzY2NwX3N5c3RlbS53cml0ZV9jb250ZXh0ID0gY3R4OworCisJcmV0dXJuIDA7Cit9CisKKy8qIG9oIG15IGdvZCBhIHJlYWwgU0NDUCBwYWNrZXQuIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCitpbnQgc2NjcF9zeXN0ZW1faW5jb21pbmcoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCAxICkgeworCQlERUJVR1AoRFNDQ1AsICJUb28gc2hvcnQgcGFja2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWludCB0eXBlID0gbXNnYi0+bDJoWzBdOworCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX3JlYWQobXNnYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEU0NDUCwgInVuaW1wbGVtZW50ZWQgbXNnIHR5cGU6ICVkXG4iLCB0eXBlKTsKKwl9OworCisJcmV0dXJuIC0xOworfQorCisvKiBjcmVhdGUgYSBwYWNrZXQgZnJvbSB0aGUgZGF0YSAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJREVCVUdQKERTQ0NQLCAic2NjcF9jb25uZWN0aW9uX3dyaXRlOiBXcm9uZyBjb25uZWN0aW9uIHN0YXRlOiAlcCAlZFxuIiwKKwkJICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9kYXRhKGNvbm5lY3Rpb24sIGRhdGEpOworfQorCisvKgorICogU2VuZCBhIEluYWN0aXZpdHkgVGVzdCBtZXNzYWdlLiBUaGUgb3duZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIHNob3VsZCBzdGFydCBhIHRpbWVyIGFuZCBjYWxsIHRoaXMgbWV0aG9kIHJlZ3VsYXJpbHkuIENhbGxpbmcKKyAqIHRoaXMgZXZlcnkgNjAgc2Vjb25kcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guCisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlERUJVR1AoRFNDQ1AsICJzY2NwX2Nvbm5lY3Rpb25fd3JpdGU6IFdyb25nIGNvbm5lY3Rpb24gc3RhdGU6ICVwICVkXG4iLAorCQkgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KGNvbm5lY3Rpb24pOworfQorCisvKiBzZW5kIGEgY29ubmVjdGlvbiByZWxlYXNlIGFuZCB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiByZWxlYXNlZCAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jbG9zZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgY2F1c2UpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCURFQlVHUEMoRFNDQ1AsICJDYW4gbm90IGNsb3NlIHRoZSBjb25uZWN0aW9uLiBJdCB3YXMgbmV2ZXIgb3BlbmVkOiAlcCAlZFxuIiwKKwkJCWNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlZChjb25uZWN0aW9uLCBjYXVzZSk7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUKKwkgICAgJiYgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCURFQlVHUChEU0NDUCwgIlRoZSBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZSBpdCBpcyBmcmVlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpsb2NhbCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlcXVlc3QoY29ubiwgbG9jYWwsIGRhdGEpOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJCQkgaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIHZvaWQgKiksIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMjsKKworCWNiID0gX2ZpbmRfc3NuKHNvY2stPnNjY3Bfc3NuKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gLTE7CisKKwljYi0+YWNjZXB0X2NiID0gYWNjZXB0X2NiOworCWNiLT5hY2NlcHRfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqaW4sCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpvdXQsIGludCBjbGFzcykKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9kYXRhKGNsYXNzLCBpbiwgb3V0LCBkYXRhKTsKK30KKworaW50IHNjY3Bfc2V0X3JlYWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCSAgaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLTI7CisKKwljYiAgPSBfZmluZF9zc24oc29jay0+c2NjcF9zc24pOworCWlmICghY2IpCisJCXJldHVybiAtMTsKKworCWNiLT5yZWFkX2NiID0gcmVhZF9jYjsKKwljYi0+cmVhZF9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkgPD0gc2l6ZW9mKHVfaW50MzJfdCksIGVub3VnaF9zcGFjZSk7CisKK3VfaW50MzJfdCBzY2NwX3NyY19yZWZfdG9faW50KHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZikKK3sKKwl1X2ludDMyX3Qgc3JjX3JlZiA9IDA7CisJbWVtY3B5KCZzcmNfcmVmLCByZWYsIHNpemVvZigqcmVmKSk7CisJcmV0dXJuIHNyY19yZWY7Cit9CisKK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc2NjcF9zcmNfcmVmX2Zyb21faW50KHVfaW50MzJfdCBpbnRfcmVmKQoreworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgcmVmOworCW1lbWNweSgmcmVmLCAmaW50X3JlZiwgc2l6ZW9mKHJlZikpOworCXJldHVybiByZWY7Cit9CisKK2ludCBzY2NwX2RldGVybWluZV9tc2dfdHlwZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbXNnLT5sMmhbMF07Cit9CisKK2ludCBzY2NwX3BhcnNlX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlpbnQgdHlwZTsKKworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwl0eXBlID0gbXNnLT5sMmhbMF07CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfdWR0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0lUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfaXQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwl9OworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlVuaW1wbGVtZW50ZWQgTVNHIFR5cGU6IDB4JXhcbiIsIHR5cGUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZCh2b2lkKQoreworCXRhbGxfc2NjcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgInNjY3AiKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSB2b2lkIG9uX2Rzb191bmxvYWQodm9pZCkKK3sKKwl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9zY2NwX2N0eCwgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGEyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBHU00gc2lsZW50IGNhbGwgZmVhdHVyZSAqLworCisvKgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogcGFnaW5nIG9mIHRoZSByZXF1ZXN0ZWQgc3Vic2NyaWJlciBoYXMgY29tcGxldGVkICovCitzdGF0aWMgaW50IHBhZ2luZ19jYl9zaWxlbnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSBzaWdkYXRhOworCWludCByYzsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1AoRFNNUywgInBhZ2luZ19jYl9zaWxlbnQ6ICIpOworCisJc2lnZGF0YS5sY2hhbiA9IGxjaGFuOworCXNpZ2RhdGEuZGF0YSA9IF9kYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CisJCURFQlVHUEMoRFNNUywgInN1Y2Nlc3MsIHVzaW5nIFRpbWVzbG90ICV1IG9uIEFSRkNOICV1XG4iLAorCQkJbGNoYW4tPnRzLT5uciwgbGNoYW4tPnRzLT50cngtPmFyZmNuKTsKKwkJbGNoYW4tPnNpbGVudF9jYWxsID0gMTsKKwkJLyogaW5jcmVtZW50IGxjaGFuIHJlZmVyZW5jZSBjb3VudCAqLworCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfU1VDQ0VTUywgJnNpZ2RhdGEpOworCQl1c2VfbGNoYW4obGNoYW4pOworCQlicmVhazsKKwljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJREVCVUdQKERTTVMsICJleHBpcmVkXG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NDQUxMLCBTX1NDQUxMX0VYUElSRUQsICZzaWdkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJlY2VpdmUgYSBsYXllciAzIG1lc3NhZ2UgZnJvbSBhIHNpbGVudCBjYWxsICovCitpbnQgc2lsZW50X2NhbGxfcngoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwkvKiBGSVhNRTogZG8gc29tZXRoaW5nIGxpa2Ugc2VuZGluZyBpdCB0aHJvdWdoIGEgVURQIHBvcnQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zZ19tYXRjaCB7CisJdV9pbnQ4X3QgcGRpc2M7CisJdV9pbnQ4X3QgbXNnX3R5cGU7Cit9OworCisvKiBsaXN0IG9mIG1lc3NhZ2VzIHRoYXQgYXJlIGhhbmRsZWQgaW5zaWRlIE9wZW5CU0MsIGV2ZW4gaW4gYSBzaWxlbnQgY2FsbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtc2dfbWF0Y2ggc2lsZW50X2NhbGxfYWNjZXB0W10gPSB7CisJeyBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUIH0sCisJeyBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVEgfSwKK307CisKKy8qIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlcm91dGUgYSBtZXNzYWdlIGFzIHBhcnQgb2YgYSBzaWxlbnQgY2FsbCAqLworaW50IHNpbGVudF9jYWxsX3Jlcm91dGUoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJaW50IGk7CisKKwkvKiBpZiB3ZSdyZSBub3QgcGFydCBvZiBhIHNpbGVudCBjYWxsLCBuZXZlciByZXJvdXRlICovCisJaWYgKCFtc2ctPmxjaGFuLT5zaWxlbnRfY2FsbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgYSBzcGVjaWFsIG1lc3NhZ2UgdGhhdCBpcyBoYW5kbGVkIGluIG9wZW5ic2MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaWxlbnRfY2FsbF9hY2NlcHQpOyBpKyspIHsKKwkJaWYgKHNpbGVudF9jYWxsX2FjY2VwdFtpXS5wZGlzYyA9PSBwZGlzYyAmJgorCQkgICAgc2lsZW50X2NhbGxfYWNjZXB0W2ldLm1zZ190eXBlID09IGdoLT5tc2dfdHlwZSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIG90aGVyd2lzZSwgcmVyb3V0ZSAqLworCXJldHVybiAxOworfQorCisKKy8qIGluaXRpYXRlIGEgc2lsZW50IGNhbGwgd2l0aCBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK2ludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCWludCByYzsKKworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgdHlwZSwKKwkJCSAgICBwYWdpbmdfY2Jfc2lsZW50LCBkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuZCBhIHNpbGVudCBjYWxsIHdpdGggYSBnaXZlbiBzdWJzY3JpYmVyICovCitpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRpZCB3ZSBhY3R1YWxseSBlc3RhYmxpc2ggYSBzaWxlbnQgY2FsbCBmb3IgdGhpcyBndXk/ICovCisJaWYgKCFsY2hhbi0+c2lsZW50X2NhbGwpCisJCXJldHVybiAtRUlOVkFMOworCisJcHV0X2xjaGFuKGxjaGFuKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc3ViY2hhbl9kZW11eC5jIGIvb3BlbmJzYy9zcmMvc3ViY2hhbl9kZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmMxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qIEEgRTEgc3ViLWNoYW5uZWwgKGRlKW11bHRpcGxleGVyIHdpdGggVFJBVSBmcmFtZSBzeW5jICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3ZvaWQgKnRhbGxfdHFlX2N0eDsKKworc3RhdGljIGlubGluZSB2b2lkIGFwcGVuZF9iaXQoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gsIHVfaW50OF90IGJpdCkKK3sKKwlzY2gtPm91dF9iaXRidWZbc2NoLT5vdXRfaWR4KytdID0gYml0OworfQorCisjZGVmaW5lIFNZTkNfSERSX0JJVFMJMTYKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBudWxsYnl0ZXNbU1lOQ19IRFJfQklUU107CisKKy8qIGNoZWNrIGlmIHdlIGhhdmUganVzdCBjb21wbGV0ZWQgdGhlIDE2IGJpdCB6ZXJvIHN5bmMgaGVhZGVyLAorICogaW4gYWNjb3JkYW5jZSB3aXRoIEdTTSBUUyAwOC42MCBDaGFwdGVyIDQuOC4xICovCitzdGF0aWMgaW50IHN5bmNfaGRyX2NvbXBsZXRlKHN0cnVjdCBkZW11eF9zdWJjaCAqc2NoLCB1X2ludDhfdCBiaXQpCit7CisJaWYgKGJpdCA9PSAwKQorCQlzY2gtPmNvbnNlY3V0aXZlX3plcm9zKys7CisJZWxzZQorCQlzY2gtPmNvbnNlY3V0aXZlX3plcm9zID0gMDsKKworCWlmIChzY2gtPmNvbnNlY3V0aXZlX3plcm9zID49IFNZTkNfSERSX0JJVFMpIHsKKwkJc2NoLT5jb25zZWN1dGl2ZV96ZXJvcyA9IDA7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiByZXN5bmNocm9uaXplIHRvIGN1cnJlbnQgbG9jYXRpb24gKi8KK3N0YXRpYyB2b2lkIHJlc3luY190b19oZXJlKHN0cnVjdCBkZW11eF9zdWJjaCAqc2NoKQoreworCW1lbXNldChzY2gtPm91dF9iaXRidWYsIDAsIFNZTkNfSERSX0JJVFMpOworCisJLyogc2V0IGluZGV4IGluIGEgd2F5IHRoYXQgd2UgY2FuIGNvbnRpbnVlIHJlY2VpdmluZyBiaXRzIGFmdGVyCisJICogdGhlIGVuZCBvZiB0aGUgU1lOQyBoZWFkZXIgKi8KKwlzY2gtPm91dF9pZHggPSBTWU5DX0hEUl9CSVRTOworCXNjaC0+aW5fc3luYyA9IDE7Cit9CisKK2ludCBzdWJjaF9kZW11eF9pbml0KHN0cnVjdCBzdWJjaF9kZW11eCAqZG14KQoreworCWludCBpOworCisJZG14LT5jaGFuX2FjdGl2ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfU1VCQ0g7IGkrKykgeworCQlzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCA9ICZkbXgtPnN1YmNoW2ldOworCQlzY2gtPm91dF9pZHggPSAwOworCQltZW1zZXQoc2NoLT5vdXRfYml0YnVmLCAweGZmLCBzaXplb2Yoc2NoLT5vdXRfYml0YnVmKSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBpbnB1dCBzb21lIGFyYml0cmFyeSAobW9kdWxvIDQpIG51bWJlciBvZiBieXRlcyBvZiBhIDY0ayBFMSBjaGFubmVsLAorICogc3BsaXQgaXQgaW50byB0aGUgMTZrIHN1YmNoYW5uZWxzICovCitpbnQgc3ViY2hfZGVtdXhfaW4oc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBpLCBjOworCisJLyogd2UgYXZvaWQgcGFydGlhbGx5IGZpbGxlZCBieXRlcyBpbiBvdXRidWYgKi8KKwlpZiAobGVuICUgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdV9pbnQ4X3QgaW5ieXRlID0gZGF0YVtpXTsKKworCQlmb3IgKGMgPSAwOyBjIDwgTlJfU1VCQ0g7IGMrKykgeworCQkJc3RydWN0IGRlbXV4X3N1YmNoICpzY2ggPSAmZG14LT5zdWJjaFtjXTsKKwkJCXVfaW50OF90IGluYml0czsKKwkJCXVfaW50OF90IGJpdDsKKworCQkJLyogaWdub3JlIGluYWN0aXZlIHN1YmNoYW5uZWxzICovCisJCQlpZiAoIShkbXgtPmNoYW5fYWN0aXYgJiAoMSA8PCBjKSkpCisJCQkJY29udGludWU7CisKKwkJCWluYml0cyA9IGluYnl0ZSA+PiAoYyA8PCAxKTsKKworCQkJLyogdHdvIGJpdHMgZm9yIGVhY2ggc3ViY2hhbm5lbCAqLworCQkJaWYgKGluYml0cyAmIDB4MDEpCisJCQkJYml0ID0gMTsKKwkJCWVsc2UKKwkJCQliaXQgPSAwOworCQkJYXBwZW5kX2JpdChzY2gsIGJpdCk7CisKKwkJCWlmIChzeW5jX2hkcl9jb21wbGV0ZShzY2gsIGJpdCkpCisJCQkJcmVzeW5jX3RvX2hlcmUoc2NoKTsKKworCQkJaWYgKGluYml0cyAmIDB4MDIpCisJCQkJYml0ID0gMTsKKwkJCWVsc2UKKwkJCQliaXQgPSAwOworCQkJYXBwZW5kX2JpdChzY2gsIGJpdCk7CisKKwkJCWlmIChzeW5jX2hkcl9jb21wbGV0ZShzY2gsIGJpdCkpCisJCQkJcmVzeW5jX3RvX2hlcmUoc2NoKTsKKworCQkJLyogRklYTUU6IHZlcmlmeSB0aGUgZmlyc3QgYml0IGluIG9jdGV0IDIsIDQsIDYsIC4uLgorCQkJICogYWNjb3JkaW5nIHRvIFRTIDA4LjYwIDQuOC4xICovCisKKwkJCS8qIG9uY2Ugd2UgaGF2ZSByZWFjaGVkIFRSQVVfRlJBTUVfQklUUywgY2FsbAorCQkJICogdGhlIFRSQVUgZnJhbWUgaGFuZGxlciBjYWxsYmFjayBmdW5jdGlvbiAqLworCQkJaWYgKHNjaC0+b3V0X2lkeCA+PSBUUkFVX0ZSQU1FX0JJVFMpIHsKKwkJCQlpZiAoc2NoLT5pbl9zeW5jKSB7CisJCQkJCWRteC0+b3V0X2NiKGRteCwgYywgc2NoLT5vdXRfYml0YnVmLAorCQkJCQkgICAgc2NoLT5vdXRfaWR4LCBkbXgtPmRhdGEpOworCQkJCQlzY2gtPmluX3N5bmMgPSAwOworCQkJCX0KKwkJCQlzY2gtPm91dF9pZHggPSAwOworCQkJfQorCQl9CisJfQorCXJldHVybiBpOworfQorCitpbnQgc3ViY2hfZGVtdXhfYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCkKK3sKKwlpZiAoc3ViY2ggPj0gTlJfU1VCQ0gpCisJCXJldHVybiAtRUlOVkFMOworCisJZG14LT5jaGFuX2FjdGl2IHw9ICgxIDw8IHN1YmNoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN1YmNoX2RlbXV4X2RlYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCkKK3sKKwlpZiAoc3ViY2ggPj0gTlJfU1VCQ0gpCisJCXJldHVybiAtRUlOVkFMOworCisJZG14LT5jaGFuX2FjdGl2ICY9IH4oMSA8PCBzdWJjaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1VTFRJUExFWEVSICovCisKK3N0YXRpYyBpbnQgYWxsb2NfYWRkX2lkbGVfZnJhbWUoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzY2hfbnIpCit7CisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgd2l0aCBpZGxlIHBhdHRlcm4gKi8KKwlyZXR1cm4gc3ViY2hhbl9tdXhfZW5xdWV1ZShteCwgc2NoX25yLCB0cmF1X2lkbGVfZnJhbWUoKSwKKwkJCQkgICBUUkFVX0ZSQU1FX0JJVFMpOworfQorCisvKiByZXR1cm4gdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYml0cyBmcm9tIHRoZSBzcGVjaWZpZWQgc3ViY2hhbm5lbCAqLworc3RhdGljIGludCBnZXRfc3ViY2hfYml0cyhzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHN1YmNoLAorCQkJICB1X2ludDhfdCAqYml0cywgaW50IG51bV9yZXF1ZXN0ZWQpCit7CisJc3RydWN0IG11eF9zdWJjaCAqc2NoID0gJm14LT5zdWJjaFtzdWJjaF07CisJaW50IG51bV9iaXRzID0gMDsKKworCXdoaWxlIChudW1fYml0cyA8IG51bV9yZXF1ZXN0ZWQpIHsKKwkJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHhlOworCQlpbnQgbnVtX2JpdHNfbGVmdDsKKwkJaW50IG51bV9iaXRzX3RoaXN0aW1lOworCisJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgZW50cnkgYXQgdG9wIG9mIHR4IHF1ZXVlLgorCQkgKiBpZiBub3QsIGFkZCBhbiBpZGxlIGZyYW1lICovCisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlhbGxvY19hZGRfaWRsZV9mcmFtZShteCwgc3ViY2gpOworCQorCQlpZiAobGxpc3RfZW1wdHkoJnNjaC0+dHhfcXVldWUpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJdHhlID0gbGxpc3RfZW50cnkoc2NoLT50eF9xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5LCBsaXN0KTsKKwkJbnVtX2JpdHNfbGVmdCA9IHR4ZS0+Yml0X2xlbiAtIHR4ZS0+bmV4dF9iaXQ7CisKKwkJaWYgKG51bV9iaXRzX2xlZnQgPCBudW1fcmVxdWVzdGVkKQorCQkJbnVtX2JpdHNfdGhpc3RpbWUgPSBudW1fYml0c19sZWZ0OworCQllbHNlCisJCQludW1fYml0c190aGlzdGltZSA9IG51bV9yZXF1ZXN0ZWQ7CisKKwkJLyogcHVsbCB0aGUgYml0cyBmcm9tIHRoZSB0eGUgKi8KKwkJbWVtY3B5KGJpdHMgKyBudW1fYml0cywgdHhlLT5iaXRzICsgdHhlLT5uZXh0X2JpdCwgbnVtX2JpdHNfdGhpc3RpbWUpOworCQl0eGUtPm5leHRfYml0ICs9IG51bV9iaXRzX3RoaXN0aW1lOworCisJCS8qIGZyZWUgdGhlIHR4X3F1ZXVlIGVudHJ5IGlmIGl0IGlzIGZ1bGx5IGNvbnN1bWVkICovCisJCWlmICh0eGUtPm5leHRfYml0ID49IHR4ZS0+Yml0X2xlbikgeworCQkJbGxpc3RfZGVsKCZ0eGUtPmxpc3QpOworCQkJdGFsbG9jX2ZyZWUodHhlKTsKKwkJfQorCisJCS8qIGluY3JlbWVudCBnbG9iYWwgbnVtYmVyIG9mIGJpdHMgZGVxdWV1ZWQgKi8KKwkJbnVtX2JpdHMgKz0gbnVtX2JpdHNfdGhpc3RpbWU7CisJfQorCisJcmV0dXJuIG51bV9yZXF1ZXN0ZWQ7Cit9CisKKy8qIGNvbXBhY3QgYW4gYXJyYXkgb2YgOCBzaW5nbGUtYml0IGJ5dGVzIGludG8gb25lIGJ5dGUgb2YgOCBiaXRzICovCitzdGF0aWMgdV9pbnQ4X3QgY29tcGFjdF9iaXRzKGNvbnN0IHVfaW50OF90ICpiaXRzKQoreworCXVfaW50OF90IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXQgfD0gKGJpdHNbaV0gPyAxIDogMCkgPDwgaTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIG9idGFpbiBhIHNpbmdsZSBvdXRwdXQgYnl0ZSBmcm9tIHRoZSBzdWJjaGFubmVsIG11eGVyICovCitzdGF0aWMgaW50IG11eF9vdXRwdXRfYnl0ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgdV9pbnQ4X3QgKmJ5dGUpCit7CisJdV9pbnQ4X3QgYml0c1s4XTsKKwlpbnQgcmM7CisKKwkvKiBjb21iaW5lIHR3byBiaXRzIG9mIGV2ZXJ5IHN1YmNoYW4gKi8KKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAwLCAmYml0c1swXSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMSwgJmJpdHNbMl0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDIsICZiaXRzWzRdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAzLCAmYml0c1s2XSwgMik7CisKKwkqYnl0ZSA9IGNvbXBhY3RfYml0cyhiaXRzKTsKKworCXJldHVybiByYzsKK30KKworLyogUmVxdWVzdCB0aGUgb3V0cHV0IG9mIHNvbWUgbXV4ZWQgYnl0ZXMgZnJvbSB0aGUgc3ViY2hhbiBtdXhlciAqLworaW50IHN1YmNoYW5fbXV4X291dChzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IHJjOworCQlyYyA9IG11eF9vdXRwdXRfYnl0ZShteCwgJmRhdGFbaV0pOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGxsaXN0X2xlbihzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGkgPSAwOworCisJbGxpc3RfZm9yX2VhY2goZW50cnksIGhlYWQpCisJCWkrKzsKKworCXJldHVybiBpOworfQorCisvKiBldmljdCB0aGUgJ251bV9ldmljdCcgbnVtYmVyIG9mIG9sZGVzdCBlbnRyaWVzIGluIHRoZSBxdWV1ZSAqLworc3RhdGljIHZvaWQgdHhfcXVldWVfZXZpY3Qoc3RydWN0IG11eF9zdWJjaCAqc2NoLCBpbnQgbnVtX2V2aWN0KQoreworCXN0cnVjdCBzdWJjaF90eHFfZW50cnkgKnRxZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZXZpY3Q7IGkrKykgeworCQlpZiAobGxpc3RfZW1wdHkoJnNjaC0+dHhfcXVldWUpKQorCQkJcmV0dXJuOworCisJCXRxZSA9IGxsaXN0X2VudHJ5KHNjaC0+dHhfcXVldWUubmV4dCwgc3RydWN0IHN1YmNoX3R4cV9lbnRyeSwgbGlzdCk7CisJCWxsaXN0X2RlbCgmdHFlLT5saXN0KTsKKwkJdGFsbG9jX2ZyZWUodHFlKTsKKwl9Cit9CisKKy8qIGVucXVldWUgc29tZSBkYXRhIGludG8gdGhlIHR4X3F1ZXVlIG9mIGEgZ2l2ZW4gc3ViY2hhbm5lbCAqLworaW50IHN1YmNoYW5fbXV4X2VucXVldWUoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzX25yLCBjb25zdCB1X2ludDhfdCAqZGF0YSwKKwkJCWludCBsZW4pCit7CisJc3RydWN0IG11eF9zdWJjaCAqc2NoID0gJm14LT5zdWJjaFtzX25yXTsKKwlpbnQgbGlzdF9sZW4gPSBsbGlzdF9sZW4oJnNjaC0+dHhfcXVldWUpOworCXN0cnVjdCBzdWJjaF90eHFfZW50cnkgKnRxZSA9IHRhbGxvY196ZXJvX3NpemUodGFsbF90cWVfY3R4LAorCQkJCQkJCXNpemVvZigqdHFlKSArIGxlbik7CisJaWYgKCF0cWUpCisJCXJldHVybiAtRU5PTUVNOworCisJdHFlLT5iaXRfbGVuID0gbGVuOworCW1lbWNweSh0cWUtPmJpdHMsIGRhdGEsIGxlbik7CisKKwlpZiAobGlzdF9sZW4gPiAyKQorCQl0eF9xdWV1ZV9ldmljdChzY2gsIGxpc3RfbGVuLTIpOworCisJbGxpc3RfYWRkX3RhaWwoJnRxZS0+bGlzdCwgJnNjaC0+dHhfcXVldWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGluaXRpYWxpemUgb25lIHN1YmNoYW5uZWwgbXV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaGFuX211eF9pbml0KHN0cnVjdCBzdWJjaF9tdXggKm14KQoreworCWludCBpOworCisJbWVtc2V0KG14LCAwLCBzaXplb2YoKm14KSk7CisJZm9yIChpID0gMDsgaSA8IE5SX1NVQkNIOyBpKyspIHsKKwkJc3RydWN0IG11eF9zdWJjaCAqc2NoID0gJm14LT5zdWJjaFtpXTsKKwkJSU5JVF9MTElTVF9IRUFEKCZzY2gtPnR4X3F1ZXVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jIGIvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5ZDYwOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3N5c3RlbV9pbmZvcm1hdGlvbi5jCkBAIC0wLDAgKzEsNDczIEBACisvKiBHU00gMDQuMDggU3lzdGVtIEluZm9ybWF0aW9uIChTSSkgZW5jb2RpbmcgYW5kIGRlY29kaW5nCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yZXN0X29jdGV0cy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBHU000OF9DRUxMX0NIQU5fREVTQ19TSVpFCTE2CisjZGVmaW5lIEdTTV9NQUNCTE9DS19MRU4gCQkyMworI2RlZmluZSBHU01fTUFDQkxPQ0tfUEFERElORwkJMHgyYgorCisvKiB2ZXJpZnkgdGhlIHNpemVzIG9mIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gdHlwZSBzdHJ1Y3RzICovCisKKy8qIHJlc3Qgb2N0ZXRzIGFyZSBub3QgcGFydCBvZiB0aGUgc3RydWN0ICovCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfaGVhZGVyKSA9PSAzLCBfc2lfaGVhZGVyX3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCkgPT0gMywgX3NpX3JhY2hfY29udHJvbCk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSkgPT0gMjIsIF9zaTFfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMikgPT0gMjMsIF9zaTJfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMykgPT0gMTksIF9zaTNfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCkgPT0gMTMsIF9zaTRfc2l6ZSk7CisKKy8qIGJzMTEgZm9yZ290IHRoZSBsMiBsZW4sIDAtNiByZXN0IG9jdGV0cyAqLworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzUpID09IDE4LCBfc2k1X3NpemUpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzYpID09IDExLCBfc2k2X3NpemUpOworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMpID09IDMsIF9zaTEzX3NpemUpOworCisvKiBGcmVxdWVuY3kgTGlzdHMgYXMgcGVyIFRTIDA0LjA4IDEwLjUuMi4xMyAqLworCisvKiAxMC41LjIuMTMuMjogQml0IG1hcCAwIGZvcm1hdCAqLworc3RhdGljIGludCBmcmVxX2xpc3RfYm0wX3NldF9hcmZjbih1X2ludDhfdCAqY2hhbl9saXN0LCB1bnNpZ25lZCBpbnQgYXJmY24pCit7CisJdW5zaWduZWQgaW50IGJ5dGUsIGJpdDsKKworCWlmIChhcmZjbiA+IDEyNCB8fCBhcmZjbiA8IDEpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJCaXRtYXAgMCBvbmx5IHN1cHBvcnRzIEFSRkNOIDEuLi4xMjRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB0aGUgYml0bWFzayBpcyBmcm9tIDEuLjEyNCwgbm90IGZyb20gMC4uMTIzICovCisJYXJmY24tLTsKKworCWJ5dGUgPSBhcmZjbiAvIDg7CisJYml0ID0gYXJmY24gJSA4OworCisJY2hhbl9saXN0W0dTTTQ4X0NFTExfQ0hBTl9ERVNDX1NJWkUtMS1ieXRlXSB8PSAoMSA8PCBiaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIDEwLjUuMi4xMy43OiBWYXJpYWJsZSBiaXQgbWFwIGZvcm1hdCAqLworc3RhdGljIGludCBmcmVxX2xpc3RfYm1yZWxfc2V0X2FyZmNuKHVfaW50OF90ICpjaGFuX2xpc3QsIHVuc2lnbmVkIGludCBhcmZjbikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSwgYml0OworCXVuc2lnbmVkIGludCBtaW5fYXJmY247CisJdW5zaWduZWQgaW50IGJpdG5vOworCisJbWluX2FyZmNuID0gKGNoYW5fbGlzdFswXSAmIDEpIDw8IDk7CisJbWluX2FyZmNuIHw9IGNoYW5fbGlzdFsxXSA8PCAxOworCW1pbl9hcmZjbiB8PSAoY2hhbl9saXN0WzJdID4+IDcpICYgMTsKKworCS8qIFRoZSBsb3dlciBlbmQgb2Ygb3VyIGJpdG1ha3MgaXMgYWx3YXlzIGltcGxpY2l0bHkgaW5jbHVkZWQgKi8KKwlpZiAoYXJmY24gPT0gbWluX2FyZmNuKQorCQlyZXR1cm4gMDsKKworCWlmIChhcmZjbiA8IG1pbl9hcmZjbikgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgImFyZmNuKCV1KSA8IG1pbigldSlcbiIsIGFyZmNuLCBtaW5fYXJmY24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFyZmNuID4gbWluX2FyZmNuICsgMTExKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiYXJmY24oJXUpID4gbWluKCV1KSArIDExMVxuIiwgYXJmY24sIG1pbl9hcmZjbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJpdG5vID0gKGFyZmNuIC0gbWluX2FyZmNuKTsKKwlieXRlID0gYml0bm8gLyA4OworCWJpdCA9IGJpdG5vICUgODsKKworCWNoYW5fbGlzdFsyICsgYnl0ZV0gfD0gMSA8PCAoNyAtIGJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGUgYSBjZWxsIGNoYW5uZWwgbGlzdCBhcyBwZXIgU2VjdGlvbiAxMC41LjIuMWIgb2YgMDQuMDggKi8KK3N0YXRpYyBpbnQgYml0dmVjMmZyZXFfbGlzdCh1X2ludDhfdCAqY2hhbl9saXN0LCBzdHJ1Y3QgYml0dmVjICpidiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCBpLCByYywgbWluID0gMTAyNCwgbWF4ID0gLTE7CisKKwltZW1zZXQoY2hhbl9saXN0LCAwLCAxNik7CisKKwkvKiBHU005MDAtb25seSBoYW5kc2V0cyBvbmx5IHN1cHBvcnQgJ2JpdCBtYXAgMCBmb3JtYXQnICovCisJaWYgKGJ0cy0+YmFuZCA9PSBHU01fQkFORF85MDApIHsKKwkJY2hhbl9saXN0WzBdID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQkJaWYgKGJpdHZlY19nZXRfYml0X3BvcyhidiwgaSkpIHsKKwkJCQlyYyA9IGZyZXFfbGlzdF9ibTBfc2V0X2FyZmNuKGNoYW5fbGlzdCwgaSk7CisJCQkJaWYgKHJjIDwgMCkKKwkJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlICdWYXJpYWJsZSBiaXRtYXAgZm9ybWF0JyAqLworCWNoYW5fbGlzdFswXSA9IDB4OGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJaWYgKGkgPCBtaW4pCisJCQkJbWluID0gaTsKKwkJCWlmIChpID4gbWF4KQorCQkJCW1heCA9IGk7CisJCX0KKwl9CisKKwlpZiAobWF4ID09IC0xKSB7CisJCS8qIEVtcHR5IHNldCwgdXNlICdiaXQgbWFwIDAgZm9ybWF0JyAqLworCQljaGFuX2xpc3RbMF0gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKG1heCAtIG1pbikgPiAxMTEpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJtaW5fYXJmY249JXUsIG1heF9hcmZjbj0ldSwgIgorCQkJImRpc3RhbmNlID4gMTExXG4iLCBtaW4sIG1heCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoYW5fbGlzdFswXSB8PSAobWluID4+IDkpICYgMTsKKwljaGFuX2xpc3RbMV0gPSAobWluID4+IDEpOworCWNoYW5fbGlzdFsyXSA9IChtaW4gJiAxKSA8PCA3OworCisJZm9yIChpID0gMDsgaSA8IGJ2LT5kYXRhX2xlbio4OyBpKyspIHsKKwkJaWYgKGJpdHZlY19nZXRfYml0X3BvcyhidiwgaSkpIHsKKwkJCXJjID0gZnJlcV9saXN0X2JtcmVsX3NldF9hcmZjbihjaGFuX2xpc3QsIGkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGUgYSBjZWxsIGNoYW5uZWwgbGlzdCBhcyBwZXIgU2VjdGlvbiAxMC41LjIuMWIgb2YgMDQuMDggKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfY2VsbF9jaGFuX2xpc3QodV9pbnQ4X3QgKmNoYW5fbGlzdCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgYml0dmVjICpidiA9ICZidHMtPnNpX2NvbW1vbi5jZWxsX2FsbG9jOworCisJLyogZmlyc3Qgd2UgZ2VuZXJhdGUgYSBiaXR2ZWMgb2YgYWxsIFRSWCBBUkZDTidzIGluIG91ciBCVFMgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQliaXR2ZWNfc2V0X2JpdF9wb3MoYnYsIHRyeC0+YXJmY24sIDEpOworCisJLyogdGhlbiB3ZSBnZW5lcmF0ZSBhIEdTTSAwNC4wOCBmcmVxdWVuY3kgbGlzdCBmcm9tIHRoZSBiaXR2ZWMgKi8KKwlyZXR1cm4gYml0dmVjMmZyZXFfbGlzdChjaGFuX2xpc3QsIGJ2LCBidHMpOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBnZW5lcmF0ZV9iY2NoX2NoYW5fbGlzdCh1X2ludDhfdCAqY2hhbl9saXN0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzICpjdXJfYnRzOworCXN0cnVjdCBiaXR2ZWMgKmJ2ID0gJmJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3Q7CisKKwkvKiBmaXJzdCB3ZSBnZW5lcmF0ZSBhIGJpdHZlYyBvZiB0aGUgQkNDSCBBUkZDTidzIGluIG91ciBCU0MgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfYnRzLCAmYnRzLT5uZXR3b3JrLT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyX2J0cyA9PSBidHMpCisJCQljb250aW51ZTsKKwkJYml0dmVjX3NldF9iaXRfcG9zKGJ2LCBjdXJfYnRzLT5jMC0+YXJmY24sIDEpOworCX0KKworCS8qIHRoZW4gd2UgZ2VuZXJhdGUgYSBHU00gMDQuMDggZnJlcXVlbmN5IGxpc3QgZnJvbSB0aGUgYml0dmVjICovCisJcmV0dXJuIGJpdHZlYzJmcmVxX2xpc3QoY2hhbl9saXN0LCBidiwgYnRzKTsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTEodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEgKnNpMSA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSAqKSBvdXRwdXQ7CisKKwltZW1zZXQoc2kxLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTEtPmhlYWRlci5sMl9wbGVuID0gKDIxIDw8IDIpIHwgMTsKKwlzaTEtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kxLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMS0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMTsKKworCXJjID0gZ2VuZXJhdGVfY2VsbF9jaGFuX2xpc3Qoc2kxLT5jZWxsX2NoYW5uZWxfZGVzY3JpcHRpb24sIGJ0cyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2kxLT5yYWNoX2NvbnRyb2wgPSBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2w7CisKKwkvKiBTSTEgUmVzdCBPY3RldHMgKDEwLjUuMi4zMiksIGNvbnRhaW5zIE5DSCBwb3NpdGlvbiAqLworCXJjID0gcmVzdF9vY3RldHNfc2kxKHNpMS0+cmVzdF9vY3RldHMsIE5VTEwpOworCXJldHVybiBzaXplb2YoKnNpMSkgKyByYzsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTIodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzIgKnNpMiA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMiAqKSBvdXRwdXQ7CisKKwltZW1zZXQoc2kyLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTItPmhlYWRlci5sMl9wbGVuID0gKDIyIDw8IDIpIHwgMTsKKwlzaTItPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kyLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMi0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMjsKKworCXJjID0gZ2VuZXJhdGVfYmNjaF9jaGFuX2xpc3Qoc2kyLT5iY2NoX2ZyZXF1ZW5jeV9saXN0LCBidHMpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXNpMi0+bmNjX3Blcm1pdHRlZCA9IGJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQ7CisJc2kyLT5yYWNoX2NvbnRyb2wgPSBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2w7CisKKwlyZXR1cm4gc2l6ZW9mKCpzaTIpOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gc2lfaW5mbyA9IHsKKwkuc2VsZWN0aW9uX3BhcmFtcyA9IHsKKwkJLnByZXNlbnQgPSAwLAorCX0sCisJLnBvd2VyX29mZnNldCA9IHsKKwkJLnByZXNlbnQgPSAwLAorCX0sCisJLnNpMnRlcl9pbmRpY2F0b3IgPSAwLAorCS5lYXJseV9jbV9jdHJsID0gMSwKKwkuc2NoZWR1bGluZyA9IHsKKwkJLnByZXNlbnQgPSAwLAorCX0sCisJLmdwcnNfaW5kID0geworCQkuc2kxM19wb3NpdGlvbiA9IDAsCisJCS5yYV9jb2xvdXIgPSAwLAorCQkucHJlc2VudCA9IDEsCisJfSwKKwkubHNhX3BhcmFtcyA9IHsKKwkJLnByZXNlbnQgPSAwLAorCX0sCisJLmNlbGxfaWQgPSAwLAkvKiBGSVhNRTogZG9lc24ndCB0aGUgYnRzIGhhdmUgdGhpcz8gKi8KKwkuYnJlYWtfaW5kID0gMCwKK307CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2kzKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zICpzaTMgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMgKikgb3V0cHV0OworCisJbWVtc2V0KHNpMywgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJc2kzLT5oZWFkZXIubDJfcGxlbiA9ICgxOCA8PCAyKSB8IDE7CisJc2kzLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMy0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTMtPmhlYWRlci5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzM7CisKKwlzaTMtPmNlbGxfaWRlbnRpdHkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaSgmc2kzLT5sYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkJICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsCisJCQkgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisJc2kzLT5jb250cm9sX2NoYW5uZWxfZGVzYyA9IGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYzsKKwlzaTMtPmNlbGxfb3B0aW9ucyA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9uczsKKwlzaTMtPmNlbGxfc2VsX3BhciA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3BhcjsKKwlzaTMtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIFNJMyBSZXN0IE9jdGV0cyAoMTAuNS4yLjM0KSwgY29udGFpbmluZworCQlDQlEsIENFTExfUkVTRUxFQ1RfT0ZGU0VULCBURU1QT1JBUllfT0ZGU0VULCBQRU5BTFRZX1RJTUUKKwkJUG93ZXIgT2Zmc2V0LCAydGVyIEluZGljYXRvciwgRWFybHkgQ2xhc3NtYXJrIFNlbmRpbmcsCisJCVNjaGVkdWxpbmcgaWYgYW5kIFdIRVJFLCBHUFJTIEluZGljYXRvciwgU0kxMyBwb3NpdGlvbiAqLworCXJjID0gcmVzdF9vY3RldHNfc2kzKHNpMy0+cmVzdF9vY3RldHMsICZzaV9pbmZvKTsKKworCXJldHVybiBzaXplb2YoKnNpMykgKyByYzsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTQodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzQgKnNpNCA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCAqKSBvdXRwdXQ7CisKKwkvKiBsZW5ndGggb2YgYWxsIElFcyBwcmVzZW50IGV4Y2VwdCBTSTQgcmVzdCBvY3RldHMgYW5kIGwyX3BsZW4gKi8KKwlpbnQgbDJfcGxlbiA9IHNpemVvZigqc2k0KSAtIDE7CisKKwltZW1zZXQoc2k0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTQtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2k0LT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpNC0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNDsKKworCWdzbTQ4X2dlbmVyYXRlX2xhaSgmc2k0LT5sYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkJICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsCisJCQkgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisJc2k0LT5jZWxsX3NlbF9wYXIgPSBidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXI7CisJc2k0LT5yYWNoX2NvbnRyb2wgPSBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2w7CisKKwkvKiBPcHRpb25hbDogQ0JDSCBDaGFubmVsIERlc2NyaXB0aW9uICsgQ0JDSCBNb2JpbGUgQWxsb2NhdGlvbiAqLworCisJc2k0LT5oZWFkZXIubDJfcGxlbiA9IChsMl9wbGVuIDw8IDIpIHwgMTsKKworCS8qIFNJNCBSZXN0IE9jdGV0cyAoMTAuNS4yLjM1KSwgY29udGFpbmluZworCQlPcHRpb25hbCBQb3dlciBvZmZzZXQsIEdQUlMgSW5kaWNhdG9yLAorCQlDZWxsIElkZW50aXR5LCBMU0EgSUQsIFNlbGVjdGlvbiBQYXJhbWV0ZXIgKi8KKwlyYyA9IHJlc3Rfb2N0ZXRzX3NpNChzaTQtPmRhdGEsICZzaV9pbmZvKTsKKworCXJldHVybiBzaXplb2YoKnNpNCkgKyByYzsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTUodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSAqc2k1OworCWludCByYywgbDJfcGxlbiA9IDE4OworCisJbWVtc2V0KG91dHB1dCwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJLyogaXAuYWNjZXNzIG5hbm9CVFMgbmVlZHMgbDJfcGxlbiEhICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCSpvdXRwdXQrKyA9IChsMl9wbGVuIDw8IDIpIHwgMTsKKwkJbDJfcGxlbisrOworCX0KKworCXNpNSA9IChzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSAqKSBvdXRwdXQ7CisKKwkvKiBsMiBwc2V1ZG8gbGVuZ3RoLCBub3QgcGFydCBvZiBtc2c6IDE4ICovCisJc2k1LT5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2k1LT5za2lwX2luZGljYXRvciA9IDA7CisJc2k1LT5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzU7CisJcmMgPSBnZW5lcmF0ZV9iY2NoX2NoYW5fbGlzdChzaTUtPmJjY2hfZnJlcXVlbmN5X2xpc3QsIGJ0cyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogMDQuMDggOS4xLjM3OiBMMiBQc2V1ZG8gTGVuZ3RoIG9mIDE4ICovCisJcmV0dXJuIGwyX3BsZW47Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2k2KHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzYgKnNpNjsKKwlpbnQgbDJfcGxlbiA9IDExOworCisJbWVtc2V0KG91dHB1dCwgR1NNX01BQ0JMT0NLX1BBRERJTkcsIEdTTV9NQUNCTE9DS19MRU4pOworCisJLyogaXAuYWNjZXNzIG5hbm9CVFMgbmVlZHMgbDJfcGxlbiEhICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCSpvdXRwdXQrKyA9IChsMl9wbGVuIDw8IDIpIHwgMTsKKwkJbDJfcGxlbisrOworCX0KKworCXNpNiA9IChzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNiAqKSBvdXRwdXQ7CisKKwkvKiBsMiBwc2V1ZG8gbGVuZ3RoLCBub3QgcGFydCBvZiBtc2c6IDExICovCisJc2k2LT5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2k2LT5za2lwX2luZGljYXRvciA9IDA7CisJc2k2LT5zeXN0ZW1faW5mb3JtYXRpb24gPSBHU000OF9NVF9SUl9TWVNJTkZPXzY7CisJc2k2LT5jZWxsX2lkZW50aXR5ID0gaHRvbnMoYnRzLT5jZWxsX2lkZW50aXR5KTsKKwlnc200OF9nZW5lcmF0ZV9sYWkoJnNpNi0+bGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJCSAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLAorCQkJICAgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCXNpNi0+Y2VsbF9vcHRpb25zID0gYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zOworCXNpNi0+bmNjX3Blcm1pdHRlZCA9IGJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQ7CisKKwkvKiBTSTYgUmVzdCBPY3RldHM6IDEwLjUuMi4zNWE6IFBDSCAvIE5DSCBpbmZvLCBWQlMvVkdDUyBvcHRpb25zICovCisKKwlyZXR1cm4gbDJfcGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBnc200OF9zaTEzX2luZm8gc2kxM19kZWZhdWx0ID0geworCS5jZWxsX29wdHMgPSB7CisJCS5ubW8gCQk9IEdQUlNfTk1PX0lJSSwKKwkJLnQzMTY4CQk9IDE1MDAsCisJCS50MzE5MgkJPSA1MDAsCisJCS5kcnhfdGltZXJfbWF4CT0gMywKKwkJLmJzX2N2X21heAk9IDE1LAorCX0sCisJLnB3cl9jdHJsX3BhcnMgPSB7CisJCS5hbHBoYQkJPSAxMCwJLyogYSA9IDEuMCAqLworCQkudF9hdmdfdwk9IDI1LAorCQkudF9hdmdfdAk9IDI1LAorCQkucGNfbWVhc19jaGFuCT0gMCwgCS8qIGRvd25saW5nIG1lYXN1cmVkIG9uIENDQ0ggKi8KKwkJLm5fYXZnX2kJPSAxNSwKKwl9LAorCS5iY2NoX2NoYW5nZV9tYXJrCT0gMSwKKwkuc2lfY2hhbmdlX2ZpZWxkCT0gMCwKKwkucGJjY2hfcHJlc2VudAkJPSAwLAorCXsKKwkJLm5vX3BiY2NoID0geworCQkJLnJhYwkJPSAwLAkvKiBuZWVkcyB0byBiZSBwYXRjaGVkICovCisJCQkuc3BnY19jY2NoX3N1cCAJPSAwLAorCQkJLm5ldF9jdHJsX29yZAk9IDAsCisJCQkucHJpb19hY2NfdGhyCT0gNiwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTEzKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzICpzaTEzID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMyAqKSBvdXRwdXQ7CisJaW50IHJldDsKKworCW1lbXNldChzaTEzLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTEzLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMTMtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kxMy0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMTM7CisKKwlzaTEzX2RlZmF1bHQubm9fcGJjY2gucmFjID0gYnRzLT5ncHJzLnJhYzsKKworCXJldCA9IHJlc3Rfb2N0ZXRzX3NpMTMoc2kxMy0+cmVzdF9vY3RldHMsICZzaTEzX2RlZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc2kxMy0+aGVhZGVyLmwyX3BsZW4gPSByZXQgJiAweGZmOworCisJcmV0dXJuIHNpemVvZiAoKnNpMTMpICsgcmV0OworfQorCitpbnQgZ3NtX2dlbmVyYXRlX3NpKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0eXBlKQoreworCXNpX2luZm8uZ3Byc19pbmQucHJlc2VudCA9IGJ0cy0+Z3Bycy5lbmFibGVkOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMToKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMShvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMjoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMihvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMzoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMyhvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNDoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNChvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNToKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNShvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fNjoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpNihvdXRwdXQsIGJ0cyk7CisJY2FzZSBSU0xfU1lTVEVNX0lORk9fMTM6CisJCXJldHVybiBnZW5lcmF0ZV9zaTEzKG91dHB1dCwgYnRzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYyBiL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc5ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jCkBAIC0wLDAgKzEsMzYgQEAKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2V4dGVybiB2b2lkICp0YWxsX21zZ2JfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfZmxlX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2xvY29wX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2dzbXNfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc3Vic2NyX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3N1Yl9yZXFfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfY2FsbF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9wYWdpbmdfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc2lnaF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF90cWVfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdHJhbnNfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfbWFwX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3VwcV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9jdHJfY3R4OworCit2b2lkIHRhbGxvY19jdHhfaW5pdCh2b2lkKQoreworCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOworCXRhbGxfZmxlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsIAorCQkJCQkgICJiczExX2ZpbGVfbGlzdF9lbnRyeSIpOworCXRhbGxfbG9jb3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImxvY191cGRhdGluZ19vcGVyIik7CisJdGFsbF9nc21zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzbXMiKTsKKwl0YWxsX3N1YnNjcl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyaWJlciIpOworCXRhbGxfc3ViX3JlcV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyX3JlcXVlc3QiKTsKKwl0YWxsX2NhbGxfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImdzbV9jYWxsIik7CisJdGFsbF9wYWdpbmdfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInBhZ2luZ19yZXF1ZXN0Iik7CisJdGFsbF9zaWdoX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzaWduYWxfaGFuZGxlciIpOworCXRhbGxfdHFlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJjaF90eHFfZW50cnkiKTsKKwl0YWxsX3RyYW5zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmFuc2FjdGlvbiIpOworCXRhbGxfbWFwX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X21hcF9lbnRyeSIpOworCXRhbGxfdXBxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X3VwcV9lbnRyeSIpOworCXRhbGxfY3RyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJjb3VudGVyIik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMgYi9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExMTliNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogbWluaW1hbGlzdGljIHRlbG5ldC9uZXR3b3JrIGludGVyZmFjZSBpdCBtaWdodCB0dXJuIGludG8gYSB3aXJlIGludGVyZmFjZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKworI2RlZmluZSBXUklURV9DT05ORUNUSU9OKGZkLCBtc2cuLi4pIFwKKwlpbnQgcmV0OyBcCisJY2hhciBidWZbNDA5Nl07IFwKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2cpOyBcCisJcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCisKKy8qIHBlciBjb25uZWN0aW9uIGRhdGEgKi8KK0xMSVNUX0hFQUQoYWN0aXZlX2Nvbm5lY3Rpb25zKTsKKworc3RhdGljIHZvaWQgKnRhbGxfdGVsbmV0X2N0eDsKKworLyogcGVyIG5ldHdvcmsgZGF0YSAqLworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKKworc3RhdGljIHN0cnVjdCBic2NfZmQgc2VydmVyX3NvY2tldCA9IHsKKwkud2hlbgkgICAgPSBCU0NfRkRfUkVBRCwKKwkuY2IJICAgID0gdGVsbmV0X25ld19jb25uZWN0aW9uLAorCS5wcml2X25yICAgID0gMCwKK307CisKK3ZvaWQgdGVsbmV0X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBpbnQgcG9ydCkgeworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7CisJaW50IGZkLCBvbiA9IDE7CisKKwl0YWxsX3RlbG5ldF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAorCQkJCQkgICAgICJ0ZWxuZXRfY29ubmVjdGlvbiIpOworCisJYnNjX3Z0eV9pbml0KG5ldHdvcmspOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKworCWlmIChmZCA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIHNvY2tldCBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJbWVtc2V0KCZzb2NrX2FkZHIsIDAsIHNpemVvZihzb2NrX2FkZHIpKTsKKwlzb2NrX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc29ja19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2tfYWRkciwgc2l6ZW9mKHNvY2tfYWRkcikpIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2UgZmFpbGVkIHRvIGJpbmRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxpc3RlbihmZCwgMCkgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gbGlzdGVuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNlcnZlcl9zb2NrZXQuZGF0YSA9IG5ldHdvcms7CisJc2VydmVyX3NvY2tldC5mZCA9IGZkOworCWJzY19yZWdpc3Rlcl9mZCgmc2VydmVyX3NvY2tldCk7Cit9CisKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodDsKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb247CisKK3N0YXRpYyB2b2lkIHByaW50X3dlbGNvbWUoaW50IGZkKSB7CisJaW50IHJldDsKKwlzdGF0aWMgY2hhciAqbXNnID0KKwkJIldlbGNvbWUgdG8gdGhlIE9wZW5CU0MgQ29udHJvbCBpbnRlcmZhY2VcbiI7CisKKwlyZXQgPSB3cml0ZShmZCwgbXNnLCBzdHJsZW4obXNnKSk7CisJcmV0ID0gd3JpdGUoZmQsIG9wZW5ic2NfY29weXJpZ2h0LCBzdHJsZW4ob3BlbmJzY19jb3B5cmlnaHQpKTsKK30KKworaW50IHRlbG5ldF9jbG9zZV9jbGllbnQoc3RydWN0IGJzY19mZCAqZmQpIHsKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKilmZC0+ZGF0YTsKKworCWNsb3NlKGZkLT5mZCk7CisJYnNjX3VucmVnaXN0ZXJfZmQoZmQpOworCisJaWYgKGNvbm4tPmRiZykgeworCQlkZWJ1Z19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJfQorCisJbGxpc3RfZGVsKCZjb25uLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoY29ubik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xpZW50X2RhdGEoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IGZkLT5kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyYyA9IHZ0eV9yZWFkKGNvbm4tPnZ0eSk7CisJfQorCisJLyogdnR5IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgZnJvbSB2aXRoaW4gdnR5X3JlYWQoKSAqLworCWlmICghY29ubi0+dnR5KQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkgeworCQlyYyA9IGJ1ZmZlcl9mbHVzaF9hbGwoY29ubi0+dnR5LT5vYnVmLCBmZC0+ZmQpOworCQlpZiAocmMgPT0gQlVGRkVSX0VNUFRZKQorCQkJY29ubi0+ZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSB7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKKwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNvY2thZGRyKTsKKwlpbnQgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja2FkZHIsICZsZW4pOworCisJaWYgKG5ld19jb25uZWN0aW9uIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInRlbG5ldCBhY2NlcHQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfdGVsbmV0X2N0eCwgc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5uZXR3b3JrID0gKHN0cnVjdCBnc21fbmV0d29yayopZmQtPmRhdGE7CisJY29ubmVjdGlvbi0+ZmQuZGF0YSA9IGNvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQuZmQgPSBuZXdfY29ubmVjdGlvbjsKKwljb25uZWN0aW9uLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJY29ubmVjdGlvbi0+ZmQuY2IgPSBjbGllbnRfZGF0YTsKKwlic2NfcmVnaXN0ZXJfZmQoJmNvbm5lY3Rpb24tPmZkKTsKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+ZW50cnksICZhY3RpdmVfY29ubmVjdGlvbnMpOworCisJcHJpbnRfd2VsY29tZShuZXdfY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT52dHkgPSB2dHlfY3JlYXRlKG5ld19jb25uZWN0aW9uLCBjb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24tPnZ0eSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImNvdWxkbid0IGNyZWF0ZSBWVFlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gVlRZIGNvZGUgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdnR5LT5wcml2OworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZjb25uZWN0aW9uLT5mZDsKKworCWlmICh2dHktPnR5cGUgIT0gVlRZX1RFUk0pCisJCXJldHVybjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFZUWV9SRUFEOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgVlRZX1dSSVRFOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQlicmVhazsKKwljYXNlIFZUWV9DTE9TRUQ6CisJCS8qIHZ0eSBsYXllciBpcyBhYm91dCB0byBmcmVlKCkgdnR5ICovCisJCWNvbm5lY3Rpb24tPnZ0eSA9IE5VTEw7CisJCXRlbG5ldF9jbG9zZV9jbGllbnQoYmZkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Rva2VuX2F1dGguYwpAQCAtMCwwICsxLDE1NiBAQAorLyogU01TIGJhc2VkIHRva2VuIGF1dGhlbnRpY2F0aW9uIGZvciBhZC1ob2MgR1NNIG5ldHdvcmtzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjZGVmaW5lIFRPS0VOX1NNU19URVhUICJIQVIgMjAwOSBHU00uICBSZWdpc3RlciBhdCBodHRwOi8vaGFyMjAwOS5nbnVtb25rcy5vcmcvICIgXAorCQkJIllvdXIgSU1TSSBpcyAlcywgYXV0aCB0b2tlbiBpcyAlMDhYLCBwaG9uZSBubyBpcyAlcy4iCisKK2V4dGVybiBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fdGV4dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLAorCQkJCSAgICAgY29uc3QgY2hhciAqdGV4dCk7CisKK3N0YXRpYyBjaGFyICpidWlsZF9zbXNfc3RyaW5nKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB1X2ludDMyX3QgdG9rZW4pCit7CisJY2hhciAqc21zX3N0cjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3RybGVuKHN1YnNjci0+aW1zaSkgKyA4ICsgc3RybGVuKFRPS0VOX1NNU19URVhUKTsKKwlzbXNfc3RyID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCWlmICghc21zX3N0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihzbXNfc3RyLCBsZW4sIFRPS0VOX1NNU19URVhULCBzdWJzY3ItPmltc2ksIHRva2VuLAorCQkgc3Vic2NyLT5leHRlbnNpb24pOworCXNtc19zdHJbbGVuLTFdID0gJ1wwJzsKKworCXJldHVybiBzbXNfc3RyOworfQorCitzdGF0aWMgaW50IHRva2VuX3N1YnNjcl9jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fc21zICpzbXM7CisJaW50IHJjID0gMDsKKworCWlmIChzaWduYWwgIT0gU19TVUJTQ1JfQVRUQUNIRUQpCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+bmV0LT5hdXRoX3BvbGljeSAhPSBHU01fQVVUSF9QT0xJQ1lfVE9LRU4pCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSB7CisJCXVfaW50MzJfdCB0b2tlbjsKKwkJY2hhciAqc21zX3N0cjsKKworCQkvKiB3ZSd2ZSBzZWVuIHRoaXMgc3Vic2NyaWJlciBmb3IgdGhlIGZpcnN0IHRpbWUuICovCisJCXJjID0gZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdWJzY3IsICZ0b2tlbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtc19zdHIgPSBidWlsZF9zbXNfc3RyaW5nKHN1YnNjciwgdG9rZW4pOworCQlpZiAoIXNtc19zdHIpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJc21zID0gc21zX2Zyb21fdGV4dChzdWJzY3IsIHNtc19zdHIpOworCQl0YWxsb2NfZnJlZShzbXNfc3RyKTsKKwkJaWYgKCFzbXMpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJcmMgPSBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN1YnNjciwgc21zKTsKKworCQkvKiBGSVhNRTogZWxzZSwgZGVsZXRlIHRoZSBzdWJzY2lyYmVyIGZyb20gZGF0YWJhc2UgKi8KK3VuYXV0aDoKKworCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgaGltIGluIGFnYWluIHVubGVzcyBoZSBjbGlja3MgdGhlIHdlYiBVSSAqLworCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAwOworCQlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKwkJaWYgKHJjKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJCWlmIChsY2hhbikgeworCQkJCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisJCQkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJCQlnc200OF90eF9tbV9hdXRoX3JlaihsY2hhbik7CisJCQkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0b2tlbl9zbXNfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisKKworCWlmIChzaWduYWwgIT0gU19TTVNfREVMSVZFUkVEKQorCQlyZXR1cm4gMDsKKworCisJLyogdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHdlJ3ZlIGJlZW4gbG9va2luZyBmb3IgKi8KKwlpZiAoIXNtcy0+cmVjZWl2ZXIgfHwKKwkgICAgIShzbXMtPnJlY2VpdmVyLT5mbGFncyAmIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QpKQorCQlyZXR1cm4gMDsKKworCisJaWYgKHNtcy0+cmVjZWl2ZXItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHNtcy0+cmVjZWl2ZXIpOworCWlmIChsY2hhbikgeworCQkvKiBraWNrIHRoZSBzdWJzY3JpYmVyIG9mZiB0aGUgbmV0d29yayAqLworCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkvKiBGSVhNRTogY2xvc2UgdGhlIGNoYW5uZWwgZWFybHkgPyovCisJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy9zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCB0b2tlbl9zdWJzY3JfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NNUywgdG9rZW5fc21zX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYW5zYWN0aW9uLmMgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTI3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiBHU00gMDQuMDcgVHJhbnNhY3Rpb24gaGFuZGxpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKwordm9pZCAqdGFsbF90cmFuc19jdHg7CisKK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+c3Vic2NyID09IHN1YnNjciAmJgorCQkgICAgdHJhbnMtPnByb3RvY29sID09IHByb3RvICYmCisJCSAgICB0cmFucy0+dHJhbnNhY3Rpb25faWQgPT0gdHJhbnNfaWQpCisJCQlyZXR1cm4gdHJhbnM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCURFQlVHUChEQ0MsICJzdWJzY3I9JXAsIHN1YnNjci0+bmV0PSVwXG4iLCBzdWJzY3IsIHN1YnNjci0+bmV0KTsKKworCXRyYW5zID0gdGFsbG9jX3plcm8odGFsbF90cmFuc19jdHgsIHN0cnVjdCBnc21fdHJhbnMpOworCWlmICghdHJhbnMpCisJCXJldHVybiBOVUxMOworCisJdHJhbnMtPnN1YnNjciA9IHN1YnNjcjsKKwlzdWJzY3JfZ2V0KHRyYW5zLT5zdWJzY3IpOworCisJdHJhbnMtPnByb3RvY29sID0gcHJvdG9jb2w7CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisJdHJhbnMtPmNhbGxyZWYgPSBjYWxscmVmOworCisJbGxpc3RfYWRkX3RhaWwoJnRyYW5zLT5lbnRyeSwgJnN1YnNjci0+bmV0LT50cmFuc19saXN0KTsKKworCXJldHVybiB0cmFuczsKK30KKwordm9pZCB0cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN3aXRjaCAodHJhbnMtPnByb3RvY29sKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJX2dzbTQ4X2NjX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJX2dzbTQxMV9zbXNfdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCWlmICh0cmFucy0+bGNoYW4pCisJCXB1dF9sY2hhbih0cmFucy0+bGNoYW4pOworCisJaWYgKCF0cmFucy0+bGNoYW4gJiYgdHJhbnMtPnN1YnNjciAmJiB0cmFucy0+c3Vic2NyLT5uZXQpIHsKKwkJLyogU3RvcCBwYWdpbmcgb24gYWxsIGJ0cycgKi8KKwkJcGFnaW5nX3JlcXVlc3Rfc3RvcChOVUxMLCB0cmFucy0+c3Vic2NyLCBOVUxMKTsKKwl9CisKKwlpZiAodHJhbnMtPnN1YnNjcikKKwkJc3Vic2NyX3B1dCh0cmFucy0+c3Vic2NyKTsKKworCWxsaXN0X2RlbCgmdHJhbnMtPmVudHJ5KTsKKworCXRhbGxvY19mcmVlKHRyYW5zKTsKK30KKworLyogYWxsb2NhdGUgYW4gdW51c2VkIHRyYW5zYWN0aW9uIElEIGZvciB0aGUgZ2l2ZW4gc3Vic2NyaWJlcgorICogaW4gdGhlIGdpdmVuIHByb3RvY29sIHVzaW5nIHRoZSB0aV9mbGFnIHNwZWNpZmllZCAqLworaW50IHRyYW5zX2Fzc2lnbl90cmFuc19pZChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgdV9pbnQ4X3QgcHJvdG9jb2wsIHVfaW50OF90IHRpX2ZsYWcpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwl1bnNpZ25lZCBpbnQgdXNlZF90aWRfYml0bWFzayA9IDA7CisJaW50IGksIGosIGg7CisKKwlpZiAodGlfZmxhZykKKwkJdGlfZmxhZyA9IDB4ODsKKworCS8qIGdlbmVyYXRlIGJpdG1hc2sgb2YgYWxyZWFkeS11c2VkIFRJRHMgZm9yIHRoaXMgKHN1YnNjcixwcm90bykgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5zdWJzY3IgIT0gc3Vic2NyIHx8CisJCSAgICB0cmFucy0+cHJvdG9jb2wgIT0gcHJvdG9jb2wgfHwKKwkJICAgIHRyYW5zLT50cmFuc2FjdGlvbl9pZCA9PSAweGZmKQorCQkJY29udGludWU7CisJCXVzZWRfdGlkX2JpdG1hc2sgfD0gKDEgPDwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkKTsKKwl9CisKKwkvKiBmaW5kIGEgbmV3IG9uZSwgdHJ5aW5nIHRvIGdvIGluIGEgJ2NpcmN1bGFyJyBwYXR0ZXJuICovCisJZm9yIChoID0gNjsgaCA+IDA7IGgtLSkKKwkJaWYgKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCAoaCB8IHRpX2ZsYWcpKSkKKwkJCWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaiA9ICgoaCArIGkpICUgNykgfCB0aV9mbGFnOworCQlpZiAoKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCBqKSkgPT0gMCkKKwkJCXJldHVybiBqOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogdXBkYXRlIGFsbCB0cmFuc2FjdGlvbnMgdG8gdXNlIGEgZGlmZmVyZW50IExDSEFOLCBlLmcuCisgKiBhZnRlciBoYW5kb3ZlciBoYXMgc3VjY2VlZGVkICovCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX25ldykKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuX29sZC0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCBudW0gPSAwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW5fb2xkKSB7CisJCQkvKiBkcm9wIG9sZCBjaGFubmVsIHVzZSBjb3VuZCAqLworCQkJcHV0X2xjaGFuKHRyYW5zLT5sY2hhbik7CisJCQkvKiBhc3NpZ24gbmV3IGNoYW5uZWwgKi8KKwkJCXRyYW5zLT5sY2hhbiA9IGxjaGFuX25ldzsKKwkJCS8qIGJ1bXAgbmV3IGNoYW5uZWwgdXNlIGNvdW50ICovCisJCQl1c2VfbGNoYW4odHJhbnMtPmxjaGFuKTsKKwkJCW51bSsrOworCQl9CisJfQorCisJcmV0dXJuIG51bTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYyBiL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM2MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiBUUkFVIGZyYW1lIGhhbmRsaW5nIGFjY29yZGluZyB0byBHU00gVFMgMDguNjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgdV9pbnQzMl90IGdldF9iaXRzKGNvbnN0IHVfaW50OF90ICpiaXRidWYsIGludCBvZmZzZXQsIGludCBudW0pCit7CisJaW50IGk7CisJdV9pbnQzMl90IHJldCA9IDA7CisKKwlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBudW07IGkrKykgeworCQlyZXQgPSByZXQgPDwgMTsKKwkJaWYgKGJpdGJ1ZltpXSkKKwkJCXJldCB8PSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4xICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZnIoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweShmci0+Y19iaXRzKzAsIHRyYXVfYml0cysxNywgMTUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkoZnItPmNfYml0cysxNSwgdHJhdV9iaXRzKzMxMCwgNik7CisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkoZnItPnRfYml0cyswLCB0cmF1X2JpdHMrMzE2LCA0KTsKKwkvKiBEMSAuLiBEMjU1ICovCisJZm9yIChpID0gMzI7IGkgPCAzMDQ7IGkrPSAxNikgeworCQltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMraSsxLCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjU2IC4uIEQyNjAgKi8KKwltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMgKyAzMDUsIDUpOworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4yICovCitzdGF0aWMgdm9pZCBkZWNvZGVfYW1yKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCWludCBpOworCWludCBkX2lkeCA9IDA7CisKKwkvKiBDMSAuLiBDMTUgKi8KKwltZW1jcHkoZnItPmNfYml0cyswLCB0cmF1X2JpdHMrMTcsIDE1KTsKKwkvKiBDMTYgLi4gQzI1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMTUsIHRyYXVfYml0cyszMywgMTApOworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KGZyLT50X2JpdHMrMCwgdHJhdV9iaXRzKzMxNiwgNCk7CisJLyogRDEgLi4gRDUgKi8KKwltZW1jcHkoZnItPmRfYml0cywgdHJhdV9iaXRzKzQzLCA1KTsKKwkvKiBENiAuLiBEMjQ1ICovCisJZm9yIChpID0gNDg7IGkgPCAzMDQ7IGkgKz0gMTYpIHsKKwkJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzK2krMSwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI0NiAuLiBEMjU2ICovCisJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzICsgMzA1LCAxMSk7Cit9CisKK2ludCBkZWNvZGVfdHJhdV9mcmFtZShzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyh0cmF1X2JpdHMsIDE3LCA1KTsKKworCXN3aXRjaCAoY2JpdHM1KSB7CisJY2FzZSBUUkFVX0ZUX0ZSX1VQOgorCWNhc2UgVFJBVV9GVF9GUl9ET1dOOgorCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCWNhc2UgVFJBVV9GVF9JRExFX0RPV046CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJZGVjb2RlX2ZyKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfQU1SOgorCQlkZWNvZGVfYW1yKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgImNhbid0IGRlY29kZSB1bmltcGxlbWVudGVkIFRSQVUgIgorCQkJIkZyYW1lIFR5cGUgMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJjYW4ndCBkZWNvZGUgdW5rbm93biBUUkFVICIKKwkJCSJGcmFtZSBUeXBlIDB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3QgdV9pbnQ4X3QgZnRfZnJfZG93bl9iaXRzW10gPSB7IDEsIDEsIDEsIDAsIDAgfTsKK2NvbnN0IHVfaW50OF90IGZ0X2lkbGVfZG93bl9iaXRzW10gPSB7IDAsIDEsIDEsIDEsIDAgfTsKKworLyogbW9kaWZ5IGFuIHVwbGluayBUUkFVIGZyYW1lIHNvIHdlIGNhbiBzZW5kIGl0IGRvd25saW5rICovCitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKGZyLT5jX2JpdHMsIDAsIDUpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJCW1lbWNweShmci0+Y19iaXRzLCBmdF9mcl9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJLyogY2xlYXIgdGltZSBhbGlnbm1lbnQgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrNSwgMCwgNik7CisJCS8qIEZJWE1FOiBzZXQgVUZFIGFwcHJvcHJpYXRlbHkgKi8KKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCQltZW1jcHkoZnItPmNfYml0cywgZnRfaWRsZV9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCQkvKiB3ZSBjYW5ub3QgY29udmVydCBhIGRvd25saW5rIHRvIGEgZG93bmxpbmsgZnJhbWUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5rbm93biBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfZnIodV9pbnQ4X3QgKnRyYXVfYml0cywgY29uc3Qgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCXRyYXVfYml0c1sxNl0gPSAxOworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweSh0cmF1X2JpdHMrMTcsIGZyLT5jX2JpdHMrMCwgMTUpOworCS8qIEQxIC4uIEQyNTUgKi8KKwlmb3IgKGkgPSAzMjsgaSA8IDMwNDsgaSs9IDE2KSB7CisJCXRyYXVfYml0c1tpXSA9IDE7CisJCW1lbWNweSh0cmF1X2JpdHMraSsxLCBmci0+ZF9iaXRzICsgZF9pZHgsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNTYgLi4gRDI2MCAqLworCXRyYXVfYml0c1szMDRdID0gMTsKKwltZW1jcHkodHJhdV9iaXRzICsgMzA1LCBmci0+ZF9iaXRzICsgZF9pZHgsIDUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkodHJhdV9iaXRzKzMxMCwgZnItPmNfYml0cysxNSwgNik7CisKKwkvKiBGSVhNRTogaGFuZGxlIHRpbWluZyBhZGp1c3RtZW50ICovCisKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweSh0cmF1X2JpdHMrMzE2LCBmci0+dF9iaXRzKzAsIDQpOworfQorCisKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyhmci0+Y19iaXRzLCAwLCA1KTsKKwkKKwkvKiAxNiBiaXRzIG9mIHN5bmMgaGVhZGVyICovCisJbWVtc2V0KHRyYXVfYml0cywgMCwgMTYpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfRUZSOgorCQllbmNvZGVfZnIodHJhdV9iaXRzLCBmcik7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSBmcl9pZGxlX2ZyYW1lID0geworCS5jX2JpdHMgPSB7IDAsIDEsIDEsIDEsIDAgfSwJLyogSURMRSBET1dOTElOSyAzLjUuNSAqLworCS50X2JpdHMgPSB7IDEsIDEsIDEsIDEgfSwKK307CitzdGF0aWMgdV9pbnQ4X3QgZW5jb2RlZF9pZGxlX2ZyYW1lW1RSQVVfRlJBTUVfQklUU107CitzdGF0aWMgaW50IGRiaXRzX2luaXR0ZWQ7CisKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCkKK3sKKwkvKiBvbmx5IGluaXRpYWxpemUgZHVyaW5nIHRoZSBmaXJzdCBjYWxsICovCisJaWYgKCFkYml0c19pbml0dGVkKSB7CisJCS8qIHNldCBhbGwgRC1iaXRzIHRvIDEgKi8KKwkJbWVtc2V0KCZmcl9pZGxlX2ZyYW1lLmRfYml0cywgMHgwMSwgMjYwKTsKKwkJZW5jb2RlX2ZyKGVuY29kZWRfaWRsZV9mcmFtZSwgJmZyX2lkbGVfZnJhbWUpOworCX0KKwlyZXR1cm4gZW5jb2RlZF9pZGxlX2ZyYW1lOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdHJhdV9tdXguYyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYTVjMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCit1X2ludDhfdCBnc21fZnJfbWFwW10gPSB7CisJNiwgNiwgNSwgNSwgNCwgNCwgMywgMywKKwk3LCAyLCAyLCA2LCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgNywgMiwgMiwgNiwgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDcsIDIsIDIsIDYsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCA3LCAyLCAyLCA2LCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMworfTsKKworc3RydWN0IG1hcF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjLCBkc3Q7Cit9OworCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjOworCXVfaW50MzJfdCBjYWxscmVmOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoc3NfbWFwKTsKK3N0YXRpYyBMTElTVF9IRUFEKHNzX3VwcXVldWUpOworCit2b2lkICp0YWxsX21hcF9jdHgsICp0YWxsX3VwcV9jdHg7CisKKy8qIG1hcCBvbmUgcGFydGljdWxhciBzdWJzbG90IHRvIGFub3RoZXIgc3Vic2xvdCAqLworaW50IHRyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYywKKwkJIGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0KQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbWUgPSB0YWxsb2ModGFsbF9tYXBfY3R4LCBzdHJ1Y3QgbWFwX2VudHJ5KTsKKwlpZiAoIW1lKSB7CisJCUxPR1AoRE1JQiwgTE9HTF9GQVRBTCwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUUkFVIG11eCBtYXAgYmV0d2VlbiAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoZTE9JXUsdHM9JXUsc3M9JXUpXG4iLAorCQlzcmMtPmUxX25yLCBzcmMtPmUxX3RzLCBzcmMtPmUxX3RzX3NzLAorCQlkc3QtPmUxX25yLCBkc3QtPmUxX3RzLCBkc3QtPmUxX3RzX3NzKTsKKworCS8qIG1ha2Ugc3VyZSB0byBnZXQgcmlkIG9mIGFueSBzdGFsZSBvbGQgbWFwcGluZ3MgKi8KKwl0cmF1X211eF91bm1hcChzcmMsIDApOworCXRyYXVfbXV4X3VubWFwKGRzdCwgMCk7CisKKwltZW1jcHkoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKG1lLT5zcmMpKTsKKwltZW1jcHkoJm1lLT5kc3QsIGRzdCwgc2l6ZW9mKG1lLT5kc3QpKTsKKwlsbGlzdF9hZGQoJm1lLT5saXN0LCAmc3NfbWFwKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3MsICpkc3Rfc3M7CisKKwlzcmNfc3MgPSAmc3JjLT50cy0+ZTFfbGluazsKKwlkc3Rfc3MgPSAmZHN0LT50cy0+ZTFfbGluazsKKworCXJldHVybiB0cmF1X211eF9tYXAoc3JjX3NzLCBkc3Rfc3MpOworfQorCisKKy8qIHVubWFwIG9uZSBwYXJ0aWN1bGFyIHN1YnNsb3QgZnJvbSBhbm90aGVyIHN1YnNsb3QgKi8KK2ludCB0cmF1X211eF91bm1hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNzLCB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgbWFwX2VudHJ5ICptZSwgKm1lMjsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWUsICp1ZTI7CisKKwlpZiAoc3MpCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWUsIG1lMiwgJnNzX21hcCwgbGlzdCkgeworCQkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNzLCBzaXplb2YoKnNzKSkgfHwKKwkJCSAgICAhbWVtY21wKCZtZS0+ZHN0LCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQkJbGxpc3RfZGVsKCZtZS0+bGlzdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVlLCB1ZTIsICZzc191cHF1ZXVlLCBsaXN0KSB7CisJCWlmICh1ZS0+Y2FsbHJlZiA9PSBjYWxscmVmKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzcyAmJiAhbWVtY21wKCZ1ZS0+c3JjLCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKiBsb29rLXVwIGFuIGVudHkgaW4gdGhlIFRSQVUgbXV4IG1hcCAqLworc3RhdGljIHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqCitsb29rdXBfdHJhdV9tdXhfbWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobWUsICZzc19tYXAsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPmRzdDsKKwkJaWYgKCFtZW1jbXAoJm1lLT5kc3QsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPnNyYzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYW4gZW50eSBpbiB0aGUgVFJBVSB1cHF1ZXVlICovCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqCitsb29rdXBfdHJhdV91cHF1ZXVlKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHVlLCAmc3NfdXBxdWV1ZSwgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmdWUtPnNyYywgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuIHVlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IGNfYml0c19jaGVja1tdID0geyAwLCAwLCAwLCAxLCAwIH07CisKKy8qIHdlIGdldCBjYWxsZWQgYnkgc3ViY2hhbl9kZW11eCAqLworaW50IHRyYXVfbXV4X2lucHV0KHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjX2UxX3NzLAorCQkgICBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzLCBpbnQgbnVtX2JpdHMpCit7CisJc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB0ZjsKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSBsb29rdXBfdHJhdV9tdXhfbWFwKHNyY19lMV9zcyk7CisJc3RydWN0IHN1YmNoX211eCAqbXg7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCWludCByYzsKKworCS8qIGRlY29kZSBUUkFVLCBjaGFuZ2UgaXQgdG8gZG93bmxpbmssIHJlLWVuY29kZSAqLworCXJjID0gZGVjb2RlX3RyYXVfZnJhbWUoJnRmLCB0cmF1X2JpdHMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKCFkc3RfZTFfc3MpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKwkJc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZTsKKwkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJaW50IGksIGosIGssIGwsIG87CisJCS8qIGZyYW1lIHNoYWxsIGJlIHNlbnQgdG8gdXBxdWV1ZSAqLworCQlpZiAoISh1ZSA9IGxvb2t1cF90cmF1X3VwcXVldWUoc3JjX2UxX3NzKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF1ZS0+Y2FsbHJlZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWVtY21wKHRmLmNfYml0cywgY19iaXRzX2NoZWNrLCBzaXplb2YoY19iaXRzX2NoZWNrKSkpCisJCQlERUJVR1BDKERNVVgsICJpbGxlZ2FsIHRyYXUgKEMxLUM1KSAlc1xuIiwKKwkJCQloZXhkdW1wKHRmLmNfYml0cywgc2l6ZW9mKGNfYml0c19jaGVjaykpKTsKKwkJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIDMzLAorCQkJCSAiR1NNLURBVEEiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKiltc2ctPmRhdGE7CisJCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkpOworCQlkYXRhID0gZnJhbWUtPmRhdGE7CisJCWRhdGFbMF0gPSAweGQgPDwgNDsKKwkJLyogcmVhc3NlbWJsZSBkLWJpdHMgKi8KKwkJaSA9IDA7IC8qIGNvdW50cyBiaXRzICovCisJCWogPSA0OyAvKiBjb3VudHMgb3V0cHV0IGJpdHMgKi8KKwkJayA9IGdzbV9mcl9tYXBbMF0tMTsgLyogY3VycmVudCBudW1iZXIgYml0IGluIGVsZW1lbnQgKi8KKwkJbCA9IDA7IC8qIGNvdW50cyBlbGVtZW50IGJpdHMgKi8KKwkJbyA9IDA7IC8qIG9mZnNldCBpbnB1dCBiaXRzICovCisJCXdoaWxlIChpIDwgMjYwKSB7CisJCQlkYXRhW2ovOF0gfD0gKHRmLmRfYml0c1trK29dIDw8ICg3LShqJTgpKSk7CisJCQlpZiAoLS1rIDwgMCkgeworCQkJCW8gKz0gZ3NtX2ZyX21hcFtsXTsKKwkJCQlrID0gZ3NtX2ZyX21hcFsrK2xdLTE7CisJCQl9CisJCQlpKys7CisJCQlqKys7CisJCX0KKwkJZnJhbWUtPm1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUU7CisJCWZyYW1lLT5jYWxscmVmID0gdWUtPmNhbGxyZWY7CisJCW1zZ2JfZW5xdWV1ZSgmdWUtPm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlteCA9IGUxaW5wX2dldF9tdXgoZHN0X2UxX3NzLT5lMV9uciwgZHN0X2UxX3NzLT5lMV90cyk7CisJaWYgKCFteCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0cmF1X2ZyYW1lX3VwMmRvd24oJnRmKTsKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KKworLyogYWRkIHJlY2VpdmVyIGluc3RhbmNlIGZvciBsY2hhbiBhbmQgY2FsbHJlZiAqLworaW50IHRyYXVfcmVjdl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3M7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCisJdWUgPSB0YWxsb2ModGFsbF91cHFfY3R4LCBzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSk7CisJaWYgKCF1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcmNfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVFJBVSByZWNlaXZlciAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoY2FsbHJlZiAweCV4KVxuIiwKKwkJc3JjX3NzLT5lMV9uciwgc3JjX3NzLT5lMV90cywgc3JjX3NzLT5lMV90c19zcywKKwkJY2FsbHJlZik7CisKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHJpZCBvZiBhbnkgc3RhbGUgb2xkIG1hcHBpbmdzICovCisJdHJhdV9tdXhfdW5tYXAoc3JjX3NzLCBjYWxscmVmKTsKKworCW1lbWNweSgmdWUtPnNyYywgc3JjX3NzLCBzaXplb2YodWUtPnNyYykpOworCXVlLT5uZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVlLT5jYWxscmVmID0gY2FsbHJlZjsKKwlsbGlzdF9hZGQoJnVlLT5saXN0LCAmc3NfdXBxdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYXVfc2VuZF9mcmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSkKK3sKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCXN0cnVjdCBzdWJjaF9tdXggKm14OworCWludCBpLCBqLCBrLCBsLCBvOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBmcmFtZS0+ZGF0YTsKKwlzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIHRmOworCisJbXggPSBlMWlucF9nZXRfbXV4KGRzdF9lMV9zcy0+ZTFfbnIsIGRzdF9lMV9zcy0+ZTFfdHMpOworCWlmICghbXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQkvKiBzZXQgYy1iaXRzIGFuZCB0LWJpdHMgKi8KKwkJdGYuY19iaXRzWzBdID0gMTsKKwkJdGYuY19iaXRzWzFdID0gMTsKKwkJdGYuY19iaXRzWzJdID0gMTsKKwkJdGYuY19iaXRzWzNdID0gMDsKKwkJdGYuY19iaXRzWzRdID0gMDsKKwkJbWVtc2V0KCZ0Zi5jX2JpdHNbNV0sIDAsIDYpOworCQltZW1zZXQoJnRmLmNfYml0c1sxMV0sIDEsIDEwKTsKKwkJbWVtc2V0KCZ0Zi50X2JpdHNbMF0sIDEsIDQpOworCQkvKiByZWFzc2VtYmxlIGQtYml0cyAqLworCQlpID0gMDsgLyogY291bnRzIGJpdHMgKi8KKwkJaiA9IDQ7IC8qIGNvdW50cyBpbnB1dCBiaXRzICovCisJCWsgPSBnc21fZnJfbWFwWzBdLTE7IC8qIGN1cnJlbnQgbnVtYmVyIGJpdCBpbiBlbGVtZW50ICovCisJCWwgPSAwOyAvKiBjb3VudHMgZWxlbWVudCBiaXRzICovCisJCW8gPSAwOyAvKiBvZmZzZXQgb3V0cHV0IGJpdHMgKi8KKwkJd2hpbGUgKGkgPCAyNjApIHsKKwkJCXRmLmRfYml0c1trK29dID0gKGRhdGFbai84XSA+PiAoNy0oaiU4KSkpICYgMTsKKwkJCWlmICgtLWsgPCAwKSB7CisJCQkJbyArPSBnc21fZnJfbWFwW2xdOworCQkJCWsgPSBnc21fZnJfbWFwWysrbF0tMTsKKwkJCX0KKwkJCWkrKzsKKwkJCWorKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Vzc2QuYyBiL29wZW5ic2Mvc3JjL3Vzc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QxMWYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdXNzZC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIE5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRHMuICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE1pa2UgSGFiZW4gPG1pY2hhZWwuaGFiZW5AYnRpbnRlcm5ldC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQKKyAgIFVTU0QgbWVzc2FnZXMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKy8qIERlY2xhcmF0aW9ucyBvZiBVU1NEIHN0cmluZ3MgdG8gYmUgcmVjb2duaXNlZCAqLworY29uc3QgY2hhciBVU1NEX1RFWFRfT1dOX05VTUJFUltdID0gIiojMTAwIyI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VuZF9vd25fbnVtYmVyKGNvbnN0IHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CisKKworLyogRW50cnlwb2ludCAtIGhhbmRsZXIgZnVuY3Rpb24gY29tbW9uIHRvIGFsbCBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEcyAqLworaW50IGhhbmRsZV9yY3ZfdXNzZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCB1c3NkX3JlcXVlc3QgcmVxOworCisJZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KG1zZywgJnJlcSk7CisJaWYgKHJlcS50ZXh0WzBdID09IDB4RkYpICAvKiBSZWxlYXNlLUNvbXBsZXRlICovCisJCXJldHVybiAwOworCisJaWYgKHN0cnN0cihVU1NEX1RFWFRfT1dOX05VTUJFUiwgcmVxLnRleHQpICE9IE5VTEwpIHsKKwkJREVCVUdQKERNTSwgIlVTU0Q6IE93biBudW1iZXIgcmVxdWVzdGVkXG4iKTsKKwkJcmV0dXJuIHNlbmRfb3duX251bWJlcihtc2csICZyZXEpOworCX0gZWxzZSB7CisJCURFQlVHUChETU0sICJVbmhhbmRsZWQgVVNTRCAlc1xuIiwgcmVxLnRleHQpOworCQlyZXR1cm4gZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KG1zZywgJnJlcSk7CisJfQorfQorCisvKiBBIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWNoYXIgKm93bl9udW1iZXIgPSBtc2ctPmxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbjsKKwljaGFyIHJlc3BvbnNlX3N0cmluZ1tHU01fRVhURU5TSU9OX0xFTkdUSCArIDIwXTsKKworCS8qIE5lZWQgdHJhaWxpbmcgQ1IgYXMgRU9UIGNoYXJhY3RlciAqLworCXNucHJpbnRmKHJlc3BvbnNlX3N0cmluZywgc2l6ZW9mKHJlc3BvbnNlX3N0cmluZyksICJZb3VyIGV4dGVuc2lvbiBpcyAlc1xyIiwgb3duX251bWJlcik7CisJcmV0dXJuIGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKG1zZywgcmVzcG9uc2Vfc3RyaW5nLCByZXEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvYnVmZmVyLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBCdWZmZXJpbmcgb2Ygb3V0cHV0IGFuZCBpbnB1dC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworLyogQnVmZmVyIG1hc3Rlci4gKi8KK3N0cnVjdCBidWZmZXIgeworCS8qIERhdGEgbGlzdC4gKi8KKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmhlYWQ7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICp0YWlsOworCisJLyogU2l6ZSBvZiBlYWNoIGJ1ZmZlcl9kYXRhIGNodW5rLiAqLworCXNpemVfdCBzaXplOworfTsKKworLyogRGF0YSBjb250YWluZXIuICovCitzdHJ1Y3QgYnVmZmVyX2RhdGEgeworCXN0cnVjdCBidWZmZXJfZGF0YSAqbmV4dDsKKworCS8qIExvY2F0aW9uIHRvIGFkZCBuZXcgZGF0YS4gKi8KKwlzaXplX3QgY3A7CisKKwkvKiBQb2ludGVyIHRvIGRhdGEgbm90IHlldCBmbHVzaGVkLiAqLworCXNpemVfdCBzcDsKKworCS8qIEFjdHVhbCBkYXRhIHN0cmVhbSAodmFyaWFibGUgbGVuZ3RoKS4gKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF07CS8qIHJlYWwgZGltZW5zaW9uIGlzIGJ1ZmZlci0+c2l6ZSAqLworfTsKKworLyogSXQgc2hvdWxkIGFsd2F5cyBiZSB0cnVlIHRoYXQ6IDAgPD0gc3AgPD0gY3AgPD0gc2l6ZSAqLworCisvKiBEZWZhdWx0IGJ1ZmZlciBzaXplICh1c2VkIGlmIG5vbmUgc3BlY2lmaWVkKS4gIEl0IGlzIHJvdW5kZWQgdXAgdG8gdGhlCisgICBuZXh0IHBhZ2UgYm91bmRlcnkuICovCisjZGVmaW5lIEJVRkZFUl9TSVpFX0RFRkFVTFQJCTQwOTYKKworI2RlZmluZSBCVUZGRVJfREFUQV9GUkVFKEQpIHRhbGxvY19mcmVlKChEKSkKKworLyogTWFrZSBuZXcgYnVmZmVyLiAqLworc3RydWN0IGJ1ZmZlciAqYnVmZmVyX25ldyhzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiOworCisJYiA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RydWN0IGJ1ZmZlcik7CisKKwlpZiAoc2l6ZSkKKwkJYi0+c2l6ZSA9IHNpemU7CisJZWxzZSB7CisJCXN0YXRpYyBzaXplX3QgZGVmYXVsdF9zaXplOworCQlpZiAoIWRlZmF1bHRfc2l6ZSkgeworCQkJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCQkJZGVmYXVsdF9zaXplID0KKwkJCSAgICAoKCgoQlVGRkVSX1NJWkVfREVGQVVMVCAtIDEpIC8gcGdzeikgKyAxKSAqIHBnc3opOworCQl9CisJCWItPnNpemUgPSBkZWZhdWx0X3NpemU7CisJfQorCisJcmV0dXJuIGI7Cit9CisKKy8qIEZyZWUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgYnVmZmVyICpiKQoreworCWJ1ZmZlcl9yZXNldChiKTsKKwl0YWxsb2NfZnJlZShiKTsKK30KKworLyogTWFrZSBzdHJpbmcgY2xvbmUuICovCitjaGFyICpidWZmZXJfZ2V0c3RyKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc2l6ZV90IHRvdGxlbiA9IDA7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhOworCWNoYXIgKnM7CisJY2hhciAqcDsKKworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KQorCQl0b3RsZW4gKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwlpZiAoIShzID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgKHRvdGxlbiArIDEpLCAiYnVmZmVyX2dldHN0ciIpKSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHM7CisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKKwkJbWVtY3B5KHAsIGRhdGEtPmRhdGEgKyBkYXRhLT5zcCwgZGF0YS0+Y3AgLSBkYXRhLT5zcCk7CisJCXAgKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBzOworfQorCisvKiBSZXR1cm4gMSBpZiBidWZmZXIgaXMgZW1wdHkuICovCitpbnQgYnVmZmVyX2VtcHR5KHN0cnVjdCBidWZmZXIgKmIpCit7CisJcmV0dXJuIChiLT5oZWFkID09IE5VTEwpOworfQorCisvKiBDbGVhciBhbmQgZnJlZSBhbGwgYWxsb2NhdGVkIGRhdGEuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gbmV4dCkgeworCQluZXh0ID0gZGF0YS0+bmV4dDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkYXRhKTsKKwl9CisJYi0+aGVhZCA9IGItPnRhaWwgPSBOVUxMOworfQorCisvKiBBZGQgYnVmZmVyX2RhdGEgdG8gdGhlIGVuZCBvZiBidWZmZXIuICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9kYXRhICpidWZmZXJfYWRkKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCisJZCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsCisJCQkgb2Zmc2V0b2Yoc3RydWN0IGJ1ZmZlcl9kYXRhLCBkYXRhW2ItPnNpemVdKSwKKwkJCSAiYnVmZmVyX2FkZCIpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisJZC0+Y3AgPSBkLT5zcCA9IDA7CisJZC0+bmV4dCA9IE5VTEw7CisKKwlpZiAoYi0+dGFpbCkKKwkJYi0+dGFpbC0+bmV4dCA9IGQ7CisJZWxzZQorCQliLT5oZWFkID0gZDsKKwliLT50YWlsID0gZDsKKworCXJldHVybiBkOworfQorCisvKiBXcml0ZSBkYXRhIHRvIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3B1dChzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCB2b2lkICpwLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGEgPSBiLT50YWlsOworCWNvbnN0IGNoYXIgKnB0ciA9IHA7CisKKwkvKiBXZSB1c2UgZXZlbiBsYXN0IG9uZSBieXRlIG9mIGRhdGEgYnVmZmVyLiAqLworCXdoaWxlIChzaXplKSB7CisJCXNpemVfdCBjaHVuazsKKworCQkvKiBJZiB0aGVyZSBpcyBubyBkYXRhIGJ1ZmZlciBhZGQgaXQuICovCisJCWlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Y3AgPT0gYi0+c2l6ZSkKKwkJCWRhdGEgPSBidWZmZXJfYWRkKGIpOworCisJCWNodW5rID0KKwkJICAgICgoc2l6ZSA8PQorCQkgICAgICAoYi0+c2l6ZSAtIGRhdGEtPmNwKSkgPyBzaXplIDogKGItPnNpemUgLSBkYXRhLT5jcCkpOworCQltZW1jcHkoKGRhdGEtPmRhdGEgKyBkYXRhLT5jcCksIHB0ciwgY2h1bmspOworCQlzaXplIC09IGNodW5rOworCQlwdHIgKz0gY2h1bms7CisJCWRhdGEtPmNwICs9IGNodW5rOworCX0KK30KKworLyogSW5zZXJ0IGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXRjKHN0cnVjdCBidWZmZXIgKmIsIHVfY2hhciBjKQoreworCWJ1ZmZlcl9wdXQoYiwgJmMsIDEpOworfQorCisvKiBQdXQgc3RyaW5nIHRvIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXRzdHIoc3RydWN0IGJ1ZmZlciAqYiwgY29uc3QgY2hhciAqYykKK3sKKwlidWZmZXJfcHV0KGIsIGMsIHN0cmxlbihjKSk7Cit9CisKKy8qIEtlZXAgZmx1c2hpbmcgZGF0YSB0byB0aGUgZmQgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eSBvciBhbiBlcnJvciBpcworICAgZW5jb3VudGVyZWQgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZCBibG9jay4gKi8KK2J1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYWxsKHN0cnVjdCBidWZmZXIgKmIsIGludCBmZCkKK3sKKwlidWZmZXJfc3RhdHVzX3QgcmV0OworCXN0cnVjdCBidWZmZXJfZGF0YSAqaGVhZDsKKwlzaXplX3QgaGVhZF9zcDsKKworCWlmICghYi0+aGVhZCkKKwkJcmV0dXJuIEJVRkZFUl9FTVBUWTsKKwloZWFkX3NwID0gKGhlYWQgPSBiLT5oZWFkKS0+c3A7CisJLyogRmx1c2ggYWxsIGRhdGEuICovCisJd2hpbGUgKChyZXQgPSBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSkgPT0gQlVGRkVSX1BFTkRJTkcpIHsKKwkJaWYgKChiLT5oZWFkID09IGhlYWQpICYmIChoZWFkX3NwID09IGhlYWQtPnNwKQorCQkgICAgJiYgKGVycm5vICE9IEVJTlRSKSkKKwkJCS8qIE5vIGRhdGEgd2FzIGZsdXNoZWQsIHNvIGtlcm5lbCBidWZmZXIgbXVzdCBiZSBmdWxsLiAqLworCQkJcmV0dXJuIHJldDsKKwkJaGVhZF9zcCA9IChoZWFkID0gYi0+aGVhZCktPnNwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwCisvKiBGbHVzaCBlbm91Z2ggZGF0YSB0byBmaWxsIGEgdGVybWluYWwgd2luZG93IG9mIHRoZSBnaXZlbiBzY2VuZSAodXNlZCBvbmx5CisgICBieSB2dHkgdGVsbmV0IGludGVyZmFjZSkuICovCitidWZmZXJfc3RhdHVzX3QKK2J1ZmZlcl9mbHVzaF93aW5kb3coc3RydWN0IGJ1ZmZlciAqIGIsIGludCBmZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkgICAgaW50IGVyYXNlX2ZsYWcsIGludCBub19tb3JlX2ZsYWcpCit7CisJaW50IG5ieXRlczsKKwlpbnQgaW92X2FsbG9jOworCWludCBpb3ZfaW5kZXg7CisJc3RydWN0IGlvdmVjICppb3Y7CisJc3RydWN0IGlvdmVjIHNtYWxsX2lvdlszXTsKKwljaGFyIG1vcmVbXSA9ICIgLS1Nb3JlLS0gIjsKKwljaGFyIGVyYXNlW10gPQorCSAgICB7IDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJCScgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKKwkJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOAorCX07CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhOworCWludCBjb2x1bW47CisKKwlpZiAoIWItPmhlYWQpCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisKKwlpZiAoaGVpZ2h0IDwgMSkgeworCQl6bG9nX3dhcm4KKwkJICAgICgiJXMgY2FsbGVkIHdpdGggbm9uLXBvc2l0aXZlIHdpbmRvdyBoZWlnaHQgJWQsIGZvcmNpbmcgdG8gMSIsCisJCSAgICAgX19mdW5jX18sIGhlaWdodCk7CisJCWhlaWdodCA9IDE7CisJfSBlbHNlIGlmIChoZWlnaHQgPj0gMikKKwkJaGVpZ2h0LS07CisJaWYgKHdpZHRoIDwgMSkgeworCQl6bG9nX3dhcm4KKwkJICAgICgiJXMgY2FsbGVkIHdpdGggbm9uLXBvc2l0aXZlIHdpbmRvdyB3aWR0aCAlZCwgZm9yY2luZyB0byAxIiwKKwkJICAgICBfX2Z1bmNfXywgd2lkdGgpOworCQl3aWR0aCA9IDE7CisJfQorCisJLyogRm9yIGVyYXNlIGFuZCBtb3JlIGRhdGEgYWRkIHR3byB0byBiJ3MgYnVmZmVyX2RhdGEgY291bnQuICovCisJaWYgKGItPmhlYWQtPm5leHQgPT0gTlVMTCkgeworCQlpb3ZfYWxsb2MgPSBzaXplb2Yoc21hbGxfaW92KSAvIHNpemVvZihzbWFsbF9pb3ZbMF0pOworCQlpb3YgPSBzbWFsbF9pb3Y7CisJfSBlbHNlIHsKKwkJaW92X2FsbG9jID0gKChoZWlnaHQgKiAod2lkdGggKyAyKSkgLyBiLT5zaXplKSArIDEwOworCQlpb3YgPSBYTUFMTE9DKE1UWVBFX1RNUCwgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwl9CisJaW92X2luZGV4ID0gMDsKKworCS8qIFByZXZpb3VzbHkgcHJpbnQgb3V0IGlzIHBlcmZvcm1lZC4gKi8KKwlpZiAoZXJhc2VfZmxhZykgeworCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IGVyYXNlOworCQlpb3ZbaW92X2luZGV4XS5pb3ZfbGVuID0gc2l6ZW9mIGVyYXNlOworCQlpb3ZfaW5kZXgrKzsKKwl9CisKKwkvKiBPdXRwdXQgZGF0YS4gKi8KKwljb2x1bW4gPSAxOwkJLyogQ29sdW1uIHBvc2l0aW9uIG9mIG5leHQgY2hhcmFjdGVyIGRpc3BsYXllZC4gKi8KKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhICYmIChoZWlnaHQgPiAwKTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKKwkJc2l6ZV90IGNwOworCisJCWNwID0gZGF0YS0+c3A7CisJCXdoaWxlICgoY3AgPCBkYXRhLT5jcCkgJiYgKGhlaWdodCA+IDApKSB7CisJCQkvKiBDYWxjdWxhdGUgbGluZXMgcmVtYWluaW5nIGFuZCBjb2x1bW4gcG9zaXRpb24gYWZ0ZXIgZGlzcGxheWluZworCQkJICAgdGhpcyBjaGFyYWN0ZXIuICovCisJCQlpZiAoZGF0YS0+ZGF0YVtjcF0gPT0gJ1xyJykKKwkJCQljb2x1bW4gPSAxOworCQkJZWxzZSBpZiAoKGRhdGEtPmRhdGFbY3BdID09ICdcbicpIHx8IChjb2x1bW4gPT0gd2lkdGgpKSB7CisJCQkJY29sdW1uID0gMTsKKwkJCQloZWlnaHQtLTsKKwkJCX0gZWxzZQorCQkJCWNvbHVtbisrOworCQkJY3ArKzsKKwkJfQorCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IChjaGFyICopKGRhdGEtPmRhdGEgKyBkYXRhLT5zcCk7CisJCWlvdltpb3ZfaW5kZXgrK10uaW92X2xlbiA9IGNwIC0gZGF0YS0+c3A7CisJCWRhdGEtPnNwID0gY3A7CisKKwkJaWYgKGlvdl9pbmRleCA9PSBpb3ZfYWxsb2MpCisJCQkvKiBUaGlzIHNob3VsZCBub3Qgb3JkaW5hcmlseSBoYXBwZW4uICovCisJCXsKKwkJCWlvdl9hbGxvYyAqPSAyOworCQkJaWYgKGlvdiAhPSBzbWFsbF9pb3YpIHsKKwkJCQl6bG9nX3dhcm4oIiVzOiBncm93aW5nIGlvdiBhcnJheSB0byAlZDsgIgorCQkJCQkgICJ3aWR0aCAlZCwgaGVpZ2h0ICVkLCBzaXplICVsdSIsCisJCQkJCSAgX19mdW5jX18sIGlvdl9hbGxvYywgd2lkdGgsIGhlaWdodCwKKwkJCQkJICAodV9sb25nKSBiLT5zaXplKTsKKwkJCQlpb3YgPQorCQkJCSAgICBYUkVBTExPQyhNVFlQRV9UTVAsIGlvdiwKKwkJCQkJICAgICBpb3ZfYWxsb2MgKiBzaXplb2YoKmlvdikpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIHNob3VsZCBhYnNvbHV0ZWx5IG5ldmVyIG9jY3VyLiAqLworCQkJCXpsb2dfZXJyCisJCQkJICAgICgiJXM6IGNvcnJ1cHRpb24gZGV0ZWN0ZWQ6IGlvdl9zbWFsbCBvdmVyZmxvd2VkOyAiCisJCQkJICAgICAiaGVhZCAlcCwgdGFpbCAlcCwgaGVhZC0+bmV4dCAlcCIsCisJCQkJICAgICBfX2Z1bmNfXywgYi0+aGVhZCwgYi0+dGFpbCwgYi0+aGVhZC0+bmV4dCk7CisJCQkJaW92ID0KKwkJCQkgICAgWE1BTExPQyhNVFlQRV9UTVAsCisJCQkJCSAgICBpb3ZfYWxsb2MgKiBzaXplb2YoKmlvdikpOworCQkJCW1lbWNweShpb3YsIHNtYWxsX2lvdiwgc2l6ZW9mKHNtYWxsX2lvdikpOworCQkJfQorCQl9CisJfQorCisJLyogSW4gY2FzZSBvZiBgbW9yZScgZGlzcGxheSBuZWVkLiAqLworCWlmIChiLT50YWlsICYmIChiLT50YWlsLT5zcCA8IGItPnRhaWwtPmNwKSAmJiAhbm9fbW9yZV9mbGFnKSB7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9iYXNlID0gbW9yZTsKKwkJaW92W2lvdl9pbmRleF0uaW92X2xlbiA9IHNpemVvZiBtb3JlOworCQlpb3ZfaW5kZXgrKzsKKwl9CisjaWZkZWYgSU9WX01BWAorCS8qIElPVl9NQVggYXJlIG5vcm1hbGx5IGRlZmluZWQgaW4gPHN5cy91aW8uaD4gLCBQb3NpeC4xZy4KKwkgICBleGFtcGxlOiBTb2xhcmlzMi42IGFyZSBkZWZpbmVkIElPVl9NQVggc2l6ZSBhdCAxNi4gICAgICovCisJeworCQlzdHJ1Y3QgaW92ZWMgKmNfaW92ID0gaW92OworCQluYnl0ZXMgPSAwOwkvKiBNYWtlIHN1cmUgaXQncyBpbml0aWFsaXplZC4gKi8KKworCQl3aGlsZSAoaW92X2luZGV4ID4gMCkgeworCQkJaW50IGlvdl9zaXplOworCisJCQlpb3Zfc2l6ZSA9CisJCQkgICAgKChpb3ZfaW5kZXggPiBJT1ZfTUFYKSA/IElPVl9NQVggOiBpb3ZfaW5kZXgpOworCQkJaWYgKChuYnl0ZXMgPSB3cml0ZXYoZmQsIGNfaW92LCBpb3Zfc2l6ZSkpIDwgMCkgeworCQkJCXpsb2dfd2FybigiJXM6IHdyaXRldiB0byBmZCAlZCBmYWlsZWQ6ICVzIiwKKwkJCQkJICBfX2Z1bmNfXywgZmQsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogbW92ZSBwb2ludGVyIGlvLXZlY3RvciAqLworCQkJY19pb3YgKz0gaW92X3NpemU7CisJCQlpb3ZfaW5kZXggLT0gaW92X3NpemU7CisJCX0KKwl9CisjZWxzZQkJCQkvKiBJT1ZfTUFYICovCisJaWYgKChuYnl0ZXMgPSB3cml0ZXYoZmQsIGlvdiwgaW92X2luZGV4KSkgPCAwKQorCQl6bG9nX3dhcm4oIiVzOiB3cml0ZXYgdG8gZmQgJWQgZmFpbGVkOiAlcyIsCisJCQkgIF9fZnVuY19fLCBmZCwgc2FmZV9zdHJlcnJvcihlcnJubykpOworI2VuZGlmCQkJCS8qIElPVl9NQVggKi8KKworCS8qIEZyZWUgcHJpbnRlZCBidWZmZXIgZGF0YS4gKi8KKwl3aGlsZSAoYi0+aGVhZCAmJiAoYi0+aGVhZC0+c3AgPT0gYi0+aGVhZC0+Y3ApKSB7CisJCXN0cnVjdCBidWZmZXJfZGF0YSAqZGVsOworCQlpZiAoIShiLT5oZWFkID0gKGRlbCA9IGItPmhlYWQpLT5uZXh0KSkKKwkJCWItPnRhaWwgPSBOVUxMOworCQlCVUZGRVJfREFUQV9GUkVFKGRlbCk7CisJfQorCisJaWYgKGlvdiAhPSBzbWFsbF9pb3YpCisJCVhGUkVFKE1UWVBFX1RNUCwgaW92KTsKKworCXJldHVybiAobmJ5dGVzIDwgMCkgPyBCVUZGRVJfRVJST1IgOgorCSAgICAoYi0+aGVhZCA/IEJVRkZFUl9QRU5ESU5HIDogQlVGRkVSX0VNUFRZKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uICh1bmxpa2Ugb3RoZXIgYnVmZmVyX2ZsdXNoKiBmdW5jdGlvbnMgYWJvdmUpIGlzIGRlc2lnbmVkCit0byB3b3JrIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuICBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIHdyaXRlIG91dAorYWxsIG9mIHRoZSBxdWV1ZWQgZGF0YSwganVzdCBhICJiaWciIGNodW5rLiAgSXQgcmV0dXJucyAwIGlmIGl0IHdhcworYWJsZSB0byBlbXB0eSBvdXQgdGhlIGJ1ZmZlcnMgY29tcGxldGVseSwgMSBpZiBtb3JlIGZsdXNoaW5nIGlzCityZXF1aXJlZCBsYXRlciwgb3IgLTEgb24gYSBmYXRhbCB3cml0ZSBlcnJvci4gKi8KK2J1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQpCit7CisKKy8qIFRoZXNlIGFyZSBqdXN0IHJlYXNvbmFibGUgdmFsdWVzIHRvIG1ha2Ugc3VyZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZgorZGF0YSBpcyB3cml0dGVuLiAgVGhlcmUncyBubyBuZWVkIHRvIGdvIGNyYXp5IGFuZCB0cnkgdG8gd3JpdGUgaXQgYWxsCitpbiBvbmUgc2hvdC4gKi8KKyNpZmRlZiBJT1ZfTUFYCisjZGVmaW5lIE1BWF9DSFVOS1MgKChJT1ZfTUFYID49IDE2KSA/IDE2IDogSU9WX01BWCkKKyNlbHNlCisjZGVmaW5lIE1BWF9DSFVOS1MgMTYKKyNlbmRpZgorI2RlZmluZSBNQVhfRkxVU0ggMTMxMDcyCisKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmQ7CisJc2l6ZV90IHdyaXR0ZW47CisJc3RydWN0IGlvdmVjIGlvdltNQVhfQ0hVTktTXTsKKwlzaXplX3QgaW92Y250ID0gMDsKKwlzaXplX3QgbmJ5dGUgPSAwOworCisJZm9yIChkID0gYi0+aGVhZDsgZCAmJiAoaW92Y250IDwgTUFYX0NIVU5LUykgJiYgKG5ieXRlIDwgTUFYX0ZMVVNIKTsKKwkgICAgIGQgPSBkLT5uZXh0LCBpb3ZjbnQrKykgeworCQlpb3ZbaW92Y250XS5pb3ZfYmFzZSA9IGQtPmRhdGEgKyBkLT5zcDsKKwkJbmJ5dGUgKz0gKGlvdltpb3ZjbnRdLmlvdl9sZW4gPSBkLT5jcCAtIGQtPnNwKTsKKwl9CisKKwlpZiAoIW5ieXRlKQorCQkvKiBObyBkYXRhIHRvIGZsdXNoOiBzaG91bGQgd2UgaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2U/ICovCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisKKwkvKiBvbmx5IHBsYWNlIHdoZXJlIHdyaXR0ZW4gc2hvdWxkIGJlIHNpZ24gY29tcGFyZWQgKi8KKwlpZiAoKHNzaXplX3QpICh3cml0dGVuID0gd3JpdGV2KGZkLCBpb3YsIGlvdmNudCkpIDwgMCkgeworCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKQorCQkJLyogQ2FsbGluZyBjb2RlIHNob3VsZCB0cnkgYWdhaW4gbGF0ZXIuICovCisJCQlyZXR1cm4gQlVGRkVSX1BFTkRJTkc7CisJCXJldHVybiBCVUZGRVJfRVJST1I7CisJfQorCisJLyogRnJlZSBwcmludGVkIGJ1ZmZlciBkYXRhLiAqLworCXdoaWxlICh3cml0dGVuID4gMCkgeworCQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmQ7CisJCWlmICghKGQgPSBiLT5oZWFkKSkKKwkJCWJyZWFrOworCQlpZiAod3JpdHRlbiA8IGQtPmNwIC0gZC0+c3ApIHsKKwkJCWQtPnNwICs9IHdyaXR0ZW47CisJCQlyZXR1cm4gQlVGRkVSX1BFTkRJTkc7CisJCX0KKworCQl3cml0dGVuIC09IChkLT5jcCAtIGQtPnNwKTsKKwkJaWYgKCEoYi0+aGVhZCA9IGQtPm5leHQpKQorCQkJYi0+dGFpbCA9IE5VTEw7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZCk7CisJfQorCisJcmV0dXJuIGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWTsKKworI3VuZGVmIE1BWF9DSFVOS1MKKyN1bmRlZiBNQVhfRkxVU0gKK30KKworYnVmZmVyX3N0YXR1c190CitidWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlciAqIGIsIGludCBmZCwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBuYnl0ZXM7CisKKyNpZiAwCisJLyogU2hvdWxkIHdlIGF0dGVtcHQgdG8gZHJhaW4gYW55IHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YT8gIFRoaXMgY291bGQgaGVscCByZWR1Y2UgbGF0ZW5jeSBpbiBwdXNoaW5nIG91dCB0aGUgZGF0YSBpZiB3ZSBhcmUgc3R1Y2sgaW4gYSBsb25nLXJ1bm5pbmcgdGhyZWFkIHRoYXQgaXMgcHJldmVudGluZyB0aGUgbWFpbiBzZWxlY3QgbG9vcCBmcm9tIGNhbGxpbmcgdGhlIGZsdXNoIHRocmVhZC4uLiAqLworCisJaWYgKGItPmhlYWQgJiYgKGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoYiwgZmQpID09IEJVRkZFUl9FUlJPUikpCisJCXJldHVybiBCVUZGRVJfRVJST1I7CisjZW5kaWYKKwlpZiAoYi0+aGVhZCkKKwkJLyogQnVmZmVyIGlzIG5vdCBlbXB0eSwgc28gZG8gbm90IGF0dGVtcHQgdG8gd3JpdGUgdGhlIG5ldyBkYXRhLiAqLworCQluYnl0ZXMgPSAwOworCWVsc2UgaWYgKChuYnl0ZXMgPSB3cml0ZShmZCwgcCwgc2l6ZSkpIDwgMCkgeworCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKQorCQkJbmJ5dGVzID0gMDsKKwkJZWxzZQorCQkJcmV0dXJuIEJVRkZFUl9FUlJPUjsKKwl9CisJLyogQWRkIGFueSByZW1haW5pbmcgZGF0YSB0byB0aGUgYnVmZmVyLiAqLworCXsKKwkJc2l6ZV90IHdyaXR0ZW4gPSBuYnl0ZXM7CisJCWlmICh3cml0dGVuIDwgc2l6ZSkKKwkJCWJ1ZmZlcl9wdXQoYiwgKChjb25zdCBjaGFyICopcCkgKyB3cml0dGVuLAorCQkJCSAgIHNpemUgLSB3cml0dGVuKTsKKwl9CisJcmV0dXJuIGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaCBiL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE2NGQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2NhcmRzaGVsbC5oCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorI2RlZmluZSBRVUFHR0FfUFJPR05BTUUJUEFDS0FHRV9OQU1FCisjZGVmaW5lIFFVQUdHQV9WRVJTSU9OCVBBQ0tBR0VfVkVSU0lPTgorI2RlZmluZSBRVUFHR0FfQ09QWVJJR0hUICJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIKKyNkZWZpbmUgQ09ORklHRklMRV9NQVNLIDAyMgorI2RlZmluZSBTWVNDT05GRElSICIvdXNyL2xvY2FsL2V0YyIKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMgYi9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWVkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jCkBAIC0wLDAgKzEsMzQxMSBAQAorLyoKKyAgICRJZDogY29tbWFuZC5jLHYgMS40NyAyMDA1LzA0LzI1IDE2OjI2OjQyIHBhdWwgRXhwICQKKworICAgQ29tbWFuZCBpbnRlcnByZXRlciByb3V0aW5lIGZvciB2aXJ0dWFsIHRlcm1pbmFsIFtha2EgVGVsZXRZcGVdCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4LCA5OSBLdW5paGlybyBJc2hpZ3VybworCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisKK0dOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJjYXJkc2hlbGwuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworLy8jaW5jbHVkZSAibWVtb3J5LmgiCisvLyNpbmNsdWRlICJsb2cuaCIKKy8vI2luY2x1ZGUgPGxpYi92ZXJzaW9uLmg+CisvLyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlIDx2dHkvdmVjdG9yLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisvLyNpbmNsdWRlICJ3b3JrcXVldWUuaCIKKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3ZvaWQgKnRhbGxfdnR5X2NtZF9jdHg7CisKKy8qIENvbW1hbmQgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIHNvbWUgbGV2ZWwgb2YgY29tbWFuZCBsaXN0cy4gTm9ybWFsbHkKKyAgIGVhY2ggZGFlbW9uIG1haW50YWlucyBlYWNoIG93biBjbWR2ZWMuICovCit2ZWN0b3IgY21kdmVjOworCisvKiBIb3N0IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFN0YW5kYXJkIGNvbW1hbmQgbm9kZSBzdHJ1Y3R1cmVzLiAqLworc3RydWN0IGNtZF9ub2RlIGF1dGhfbm9kZSA9IHsKKwlBVVRIX05PREUsCisJIlBhc3N3b3JkOiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHZpZXdfbm9kZSA9IHsKKwlWSUVXX05PREUsCisJIiVzPiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGF1dGhfZW5hYmxlX25vZGUgPSB7CisJQVVUSF9FTkFCTEVfTk9ERSwKKwkiUGFzc3dvcmQ6ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgZW5hYmxlX25vZGUgPSB7CisJRU5BQkxFX05PREUsCisJIiVzIyAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGNvbmZpZ19ub2RlID0geworCUNPTkZJR19OT0RFLAorCSIlcyhjb25maWcpIyAiLAorCTEKK307CisKKy8qIERlZmF1bHQgbW90ZCBzdHJpbmcuICovCitjb25zdCBjaGFyICpkZWZhdWx0X21vdGQgPSAiXHJcblwKK0hlbGxvLCB0aGlzIGlzICIgUVVBR0dBX1BST0dOQU1FICIgKHZlcnNpb24gIiBRVUFHR0FfVkVSU0lPTiAiKS5cclxuXAorIiBRVUFHR0FfQ09QWVJJR0hUICJcclxuXAorXHJcbiI7CisKKyNpZiAwCitzdGF0aWMgc3RydWN0IGZhY2lsaXR5X21hcCB7CisJaW50IGZhY2lsaXR5OworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IG1hdGNoOworfSBzeXNsb2dfZmFjaWxpdGllc1tdID0geworCXsKKwlMT0dfS0VSTiwgImtlcm4iLCAxfSwgeworCUxPR19VU0VSLCAidXNlciIsIDJ9LCB7CisJTE9HX01BSUwsICJtYWlsIiwgMX0sIHsKKwlMT0dfREFFTU9OLCAiZGFlbW9uIiwgMX0sIHsKKwlMT0dfQVVUSCwgImF1dGgiLCAxfSwgeworCUxPR19TWVNMT0csICJzeXNsb2ciLCAxfSwgeworCUxPR19MUFIsICJscHIiLCAyfSwgeworCUxPR19ORVdTLCAibmV3cyIsIDF9LCB7CisJTE9HX1VVQ1AsICJ1dWNwIiwgMn0sIHsKKwlMT0dfQ1JPTiwgImNyb24iLCAxfSwKKyNpZmRlZiBMT0dfRlRQCisJeworCUxPR19GVFAsICJmdHAiLCAxfSwKKyNlbmRpZgorCXsKKwlMT0dfTE9DQUwwLCAibG9jYWwwIiwgNn0sIHsKKwlMT0dfTE9DQUwxLCAibG9jYWwxIiwgNn0sIHsKKwlMT0dfTE9DQUwyLCAibG9jYWwyIiwgNn0sIHsKKwlMT0dfTE9DQUwzLCAibG9jYWwzIiwgNn0sIHsKKwlMT0dfTE9DQUw0LCAibG9jYWw0IiwgNn0sIHsKKwlMT0dfTE9DQUw1LCAibG9jYWw1IiwgNn0sIHsKKwlMT0dfTE9DQUw2LCAibG9jYWw2IiwgNn0sIHsKKwlMT0dfTE9DQUw3LCAibG9jYWw3IiwgNn0sIHsKKzAsIE5VTEwsIDB9LH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpmYWNpbGl0eV9uYW1lKGludCBmYWNpbGl0eSkKK3sKKwlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKKworCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCisJCWlmIChmbS0+ZmFjaWxpdHkgPT0gZmFjaWxpdHkpCisJCQlyZXR1cm4gZm0tPm5hbWU7CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50IGZhY2lsaXR5X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKKworCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCisJCWlmICghc3RybmNtcChzdHIsIGZtLT5uYW1lLCBmbS0+bWF0Y2gpKQorCQkJcmV0dXJuIGZtLT5mYWNpbGl0eTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbGV2ZWxfbWF0Y2goY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGV2ZWw7CisKKwlmb3IgKGxldmVsID0gMDsgemxvZ19wcmlvcml0eVtsZXZlbF0gIT0gTlVMTDsgbGV2ZWwrKykKKwkJaWYgKCFzdHJuY21wKHMsIHpsb2dfcHJpb3JpdHlbbGV2ZWxdLCAyKSkKKwkJCXJldHVybiBsZXZlbDsKKwlyZXR1cm4gWkxPR19ESVNBQkxFRDsKK30KKyNlbmRpZgorCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG1haW4gd2hlbiBhIGRhZW1vbiBpcyBpbnZva2VkIHdpdGggLXYgb3IgLS12ZXJzaW9uLiAqLwordm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCXByaW50ZigiJXMgdmVyc2lvbiAlc1xuIiwgcHJvZ25hbWUsIFFVQUdHQV9WRVJTSU9OKTsKKwlwcmludGYoIiVzXG4iLCBRVUFHR0FfQ09QWVJJR0hUKTsKK30KKwwKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29uY2F0ZW5hdGUgYXJndiBhcmd1bWVudCBpbnRvIGEgc2luZ2xlIHN0cmluZworICAgd2l0aCBpbnNlcnRpbmcgJyAnIGNoYXJhY3RlciBiZXR3ZWVuIGVhY2ggYXJndW1lbnQuICAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpCit7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKwljaGFyICpzdHI7CisJY2hhciAqcDsKKworCWxlbiA9IDA7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOworCWlmICghbGVuKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gc3RyID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiwgImFydmdfY29uY2F0Iik7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspIHsKKwkJc2l6ZV90IGFyZ2xlbjsKKwkJbWVtY3B5KHAsIGFyZ3ZbaV0sIChhcmdsZW4gPSBzdHJsZW4oYXJndltpXSkpKTsKKwkJcCArPSBhcmdsZW47CisJCSpwKysgPSAnICc7CisJfQorCSoocCAtIDEpID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCisvKiBJbnN0YWxsIHRvcCBub2RlIG9mIGNvbW1hbmQgdmVjdG9yLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICpub2RlLCBpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKSkKK3sKKwl2ZWN0b3Jfc2V0X2luZGV4KGNtZHZlYywgbm9kZS0+bm9kZSwgbm9kZSk7CisJbm9kZS0+ZnVuYyA9IGZ1bmM7CisJbm9kZS0+Y21kX3ZlY3RvciA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGNvbW1hbmQncyBzdHJpbmcuICBVc2VkIGluIHNvcnRfbm9kZSAoKS4gKi8KK3N0YXRpYyBpbnQgY21wX25vZGUoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmEgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilwOworCXN0cnVjdCBjbWRfZWxlbWVudCAqYiA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXE7CisKKwlyZXR1cm4gc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKTsKK30KKworc3RhdGljIGludCBjbXBfZGVzYyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworCXN0cnVjdCBkZXNjICphID0gKihzdHJ1Y3QgZGVzYyAqKilwOworCXN0cnVjdCBkZXNjICpiID0gKihzdHJ1Y3QgZGVzYyAqKilxOworCisJcmV0dXJuIHN0cmNtcChhLT5jbWQsIGItPmNtZCk7Cit9CisKKy8qIFNvcnQgZWFjaCBub2RlJ3MgY29tbWFuZCBlbGVtZW50IGFjY29yZGluZyB0byBjb21tYW5kIHN0cmluZy4gKi8KK3ZvaWQgc29ydF9ub2RlKCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgoY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQl2ZWN0b3IgY21kX3ZlY3RvciA9IGNub2RlLT5jbWRfdmVjdG9yOworCQkJcXNvcnQoY21kX3ZlY3Rvci0+aW5kZXgsIHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3RvciksCisJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX25vZGUpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCWlmICgoY21kX2VsZW1lbnQgPQorCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKKwkJCQkgICAgJiYgdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkgeworCQkJCQlkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsCisJCQkJCQkJdmVjdG9yX2FjdGl2ZQorCQkJCQkJCShjbWRfZWxlbWVudC0+c3RydmVjKSAtCisJCQkJCQkJMSk7CisJCQkJCXFzb3J0KGRlc2N2ZWMtPmluZGV4LAorCQkJCQkgICAgICB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpLAorCQkJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX2Rlc2MpOworCQkJCX0KKwkJfQorfQorCisvKiBCcmVha2luZyB1cCBzdHJpbmcgaW50byBlYWNoIGNvbW1hbmQgcGllY2UuIEkgYXNzdW1lIGdpdmVuCisgICBjaGFyYWN0ZXIgaXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyLiBSZXR1cm4gdmFsdWUgaXMgYQorICAgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIGNoYXIgKiogZGF0YSBlbGVtZW50LiAqLwordmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3AsICpzdGFydDsKKwljaGFyICp0b2tlbjsKKwlpbnQgc3RybGVuOworCXZlY3RvciBzdHJ2ZWM7CisKKwlpZiAoc3RyaW5nID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY3AgPSBzdHJpbmc7CisKKwkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KKwl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KKwlpZiAoKmNwID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJaWYgKCpjcCA9PSAnIScgfHwgKmNwID09ICcjJykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBQcmVwYXJlIHJldHVybiB2ZWN0b3IuICovCisJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIENvcHkgZWFjaCBjb21tYW5kIHBpZWNlIGFuZCBzZXQgaW50byB2ZWN0b3IuICovCisJd2hpbGUgKDEpIHsKKwkJc3RhcnQgPSBjcDsKKwkJd2hpbGUgKCEoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmCisJCSAgICAgICAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisJCXN0cmxlbiA9IGNwIC0gc3RhcnQ7CisJCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJtYWtlX3N0cnZlYyIpOworCQltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOworCQkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisJCXZlY3Rvcl9zZXQoc3RydmVjLCB0b2tlbik7CisKKwkJd2hpbGUgKChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgJiYKKwkJICAgICAgICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICdcMCcpCisJCQlyZXR1cm4gc3RydmVjOworCX0KK30KKworLyogRnJlZSBhbGxvY2F0ZWQgc3RyaW5nIHZlY3Rvci4gKi8KK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKmNwOworCisJaWYgKCF2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNwID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQl0YWxsb2NfZnJlZShjcCk7CisKKwl2ZWN0b3JfZnJlZSh2KTsKK30KKworLyogRmV0Y2ggbmV4dCBkZXNjcmlwdGlvbi4gIFVzZWQgaW4gY21kX21ha2VfZGVzY3ZlYygpLiAqLworc3RhdGljIGNoYXIgKmNtZF9kZXNjX3N0cihjb25zdCBjaGFyICoqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7CisJY2hhciAqdG9rZW47CisJaW50IHN0cmxlbjsKKworCWNwID0gKnN0cmluZzsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLworCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLworCWlmICgqY3AgPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGFydCA9IGNwOworCisJd2hpbGUgKCEoKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJc3RybGVuID0gY3AgLSBzdGFydDsKKwl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAiY21kX2Rlc2Nfc3RyIik7CisJbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKKwkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisKKwkqc3RyaW5nID0gY3A7CisKKwlyZXR1cm4gdG9rZW47Cit9CisKKy8qIE5ldyBzdHJpbmcgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbWFrZV9kZXNjdmVjKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZGVzY3N0cikKK3sKKwlpbnQgbXVsdGlwbGUgPSAwOworCWNvbnN0IGNoYXIgKnNwOworCWNoYXIgKnRva2VuOworCWludCBsZW47CisJY29uc3QgY2hhciAqY3A7CisJY29uc3QgY2hhciAqZHA7CisJdmVjdG9yIGFsbHZlYzsKKwl2ZWN0b3Igc3RydmVjID0gTlVMTDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWNwID0gc3RyaW5nOworCWRwID0gZGVzY3N0cjsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFsbHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJyknKSB7CisJCQltdWx0aXBsZSA9IDA7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJ3wnKSB7CisJCQlpZiAoIW11bHRpcGxlKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIHBhcnNlIGVycm9yITogJXNcbiIsCisJCQkJCXN0cmluZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWNwKys7CisJCX0KKworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisKKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJcmV0dXJuIGFsbHZlYzsKKworCQlzcCA9IGNwOworCisJCXdoaWxlICghCisJCSAgICAgICAoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicKKwkJCXx8ICpjcCA9PSAnKScgfHwgKmNwID09ICd8JykgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWxlbiA9IGNwIC0gc3A7CisKKwkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuICsgMSwgImNtZF9tYWtlX2Rlc2N2ZWMiKTsKKwkJbWVtY3B5KHRva2VuLCBzcCwgbGVuKTsKKwkJKih0b2tlbiArIGxlbikgPSAnXDAnOworCisJCWRlc2MgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJ1Y3QgZGVzYyk7CisJCWRlc2MtPmNtZCA9IHRva2VuOworCQlkZXNjLT5zdHIgPSBjbWRfZGVzY19zdHIoJmRwKTsKKworCQlpZiAobXVsdGlwbGUpIHsKKwkJCWlmIChtdWx0aXBsZSA9PSAxKSB7CisJCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKKwkJCX0KKwkJCW11bHRpcGxlKys7CisJCX0gZWxzZSB7CisJCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7CisJCX0KKwkJdmVjdG9yX3NldChzdHJ2ZWMsIGRlc2MpOworCX0KK30KKworLyogQ291bnQgbWFuZGFudG9yeSBzdHJpbmcgdmVjdG9yIHNpemUuICBUaGlzIGlzIHRvIGRldGVybWluZSBpbnB1dGVkCisgICBjb21tYW5kIGhhcyBlbm91Z2ggY29tbWFuZCBsZW5ndGguICovCitzdGF0aWMgaW50IGNtZF9jbWRzaXplKHZlY3RvciBzdHJ2ZWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHNpemUgPSAwOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoc3RydmVjKTsgaSsrKQorCQlpZiAoKGRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykpID09IDEKKwkJCSAgICAmJiAoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApKSAhPSBOVUxMKSB7CisJCQkJaWYgKGRlc2MtPmNtZCA9PSBOVUxMIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJcmV0dXJuIHNpemU7CisJCQkJZWxzZQorCQkJCQlzaXplKys7CisJCQl9IGVsc2UKKwkJCQlzaXplKys7CisJCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworLyogUmV0dXJuIHByb21wdCBjaGFyYWN0ZXIgb2Ygc3BlY2lmaWVkIG5vZGUuICovCitjb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBub2RlKTsKKwlyZXR1cm4gY25vZGUtPnByb21wdDsKK30KKworLyogSW5zdGFsbCBhIGNvbW1hbmQgaW50byBhIG5vZGUuICovCit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSBudHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICpjbWQpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBudHlwZSk7CisKKwlpZiAoY25vZGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb21tYW5kIG5vZGUgJWQgZG9lc24ndCBleGlzdCwgcGxlYXNlIGNoZWNrIGl0XG4iLAorCQkJbnR5cGUpOworCQlleGl0KDEpOworCX0KKworCXZlY3Rvcl9zZXQoY25vZGUtPmNtZF92ZWN0b3IsIGNtZCk7CisKKwljbWQtPnN0cnZlYyA9IGNtZF9tYWtlX2Rlc2N2ZWMoY21kLT5zdHJpbmcsIGNtZC0+ZG9jKTsKKwljbWQtPmNtZHNpemUgPSBjbWRfY21kc2l6ZShjbWQtPnN0cnZlYyk7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyB2b2lkIHRvNjQoY2hhciAqcywgbG9uZyB2LCBpbnQgbikKK3sKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJKnMrKyA9IGl0b2E2NFt2ICYgMHgzZl07CisJCXYgPj49IDY7CisJfQorfQorCitzdGF0aWMgY2hhciAqemVuY3J5cHQoY29uc3QgY2hhciAqcGFzc3dkKQoreworCWNoYXIgc2FsdFs2XTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKworCXRvNjQoJnNhbHRbMF0sIHJhbmRvbSgpLCAzKTsKKwl0bzY0KCZzYWx0WzNdLCB0di50dl91c2VjLCAzKTsKKwlzYWx0WzVdID0gJ1wwJzsKKworCXJldHVybiBjcnlwdChwYXNzd2QsIHNhbHQpOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gd3JpdGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGhvc3QuICovCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ob3N0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgImhvc3RuYW1lICVzJXMiLCBob3N0Lm5hbWUsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgOCAlcyVzIiwgaG9zdC5wYXNzd29yZF9lbmNyeXB0LAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCA4ICVzJXMiLAorCQkJCWhvc3QuZW5hYmxlX2VuY3J5cHQsIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgJXMlcyIsIGhvc3QucGFzc3dvcmQsCisJCQkJVlRZX05FV0xJTkUpOworCQlpZiAoaG9zdC5lbmFibGUpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCAlcyVzIiwgaG9zdC5lbmFibGUsCisJCQkJVlRZX05FV0xJTkUpOworCX0KKworI2lmIDAKKwlpZiAoemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCAhPSBMT0dfREVCVUcpIHsKKwkJdnR5X291dCh2dHksICIhIE4uQi4gVGhlICdsb2cgdHJhcCcgY29tbWFuZCBpcyBkZXByZWNhdGVkLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICJsb2cgdHJhcCAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bF0sIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoaG9zdC5sb2dmaWxlCisJICAgICYmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0gWkxPR19ESVNBQkxFRCkpIHsKKwkJdnR5X291dCh2dHksICJsb2cgZmlsZSAlcyIsIGhvc3QubG9nZmlsZSk7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdICE9IFpMT0dfRElTQUJMRUQpIHsKKwkJdnR5X291dCh2dHksICJsb2cgc3Rkb3V0Iik7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPQorCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJCXZ0eV9vdXQodnR5LCAiICVzIiwKKwkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+CisJCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJubyBsb2cgbW9uaXRvciVzIiwgVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSAhPQorCQkgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJdnR5X291dCh2dHksICJsb2cgbW9uaXRvciAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSwKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSAhPSBaTE9HX0RJU0FCTEVEKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIHN5c2xvZyIpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSAhPSBMT0dfREFFTU9OKQorCQl2dHlfb3V0KHZ0eSwgImxvZyBmYWNpbGl0eSAlcyVzIiwKKwkJCWZhY2lsaXR5X25hbWUoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSksIFZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9PSAxKQorCQl2dHlfb3V0KHZ0eSwgImxvZyByZWNvcmQtcHJpb3JpdHklcyIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCWlmIChob3N0LmFkdmFuY2VkKQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgYWR2YW5jZWQtdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QubGluZXMgPj0gMCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCAlZCVzIiwgaG9zdC5saW5lcywKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl2dHlfb3V0KHZ0eSwgImJhbm5lciBtb3RkIGZpbGUgJXMlcyIsIGhvc3QubW90ZGZpbGUsCisJCQlWVFlfTkVXTElORSk7CisJZWxzZSBpZiAoIWhvc3QubW90ZCkKKwkJdnR5X291dCh2dHksICJubyBiYW5uZXIgbW90ZCVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgY29tbWFuZCB2ZWN0b3IuICovCitzdGF0aWMgdmVjdG9yIGNtZF9ub2RlX3ZlY3Rvcih2ZWN0b3IgdiwgZW51bSBub2RlX3R5cGUgbnR5cGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KHYsIG50eXBlKTsKKwlyZXR1cm4gY25vZGUtPmNtZF92ZWN0b3I7Cit9CisKKyNpZiAwCisvKiBGaWx0ZXIgY29tbWFuZCB2ZWN0b3IgYnkgc3ltYm9sLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYWN0dWFsbHkgdXNlZDsKKyAqIHNob3VsZCBpdCBiZSBkZWxldGVkPyAqLworc3RhdGljIGludCBjbWRfZmlsdGVyX2J5X3N5bWJvbChjaGFyICpjb21tYW5kLCBjaGFyICpzeW1ib2wpCit7CisJaW50IGksIGxpbTsKKworCWlmIChzdHJjbXAoc3ltYm9sLCAiSVBWNF9BRERSRVNTIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCEKKwkJCSAgICAoaXNkaWdpdCgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJy4nCisJCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy8nKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChzeW1ib2wsICJTVFJJTkciKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIQorCQkJICAgIChpc2FscGhhKChpbnQpY29tbWFuZFtpXSkgfHwgY29tbWFuZFtpXSA9PSAnXycKKwkJCSAgICAgfHwgY29tbWFuZFtpXSA9PSAnLScpKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyY21wKHN5bWJvbCwgIklGTkFNRSIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghaXNhbG51bSgoaW50KWNvbW1hbmRbaV0pKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBDb21wbGV0aW9uIG1hdGNoIHR5cGVzLiAqLworZW51bSBtYXRjaF90eXBlIHsKKwlub19tYXRjaCwKKwlleHRlbmRfbWF0Y2gsCisJaXB2NF9wcmVmaXhfbWF0Y2gsCisJaXB2NF9tYXRjaCwKKwlpcHY2X3ByZWZpeF9tYXRjaCwKKwlpcHY2X21hdGNoLAorCXJhbmdlX21hdGNoLAorCXZhcmFyZ19tYXRjaCwKKwlwYXJ0bHlfbWF0Y2gsCisJZXhhY3RfbWF0Y2gKK307CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMCwgbnVtcyA9IDA7CisJY2hhciBidWZbNF07CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3AgPSBzdHI7CisJCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJCWlmICgqc3RyID09ICcuJykgeworCQkJCWlmIChkb3RzID49IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCWRvdHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCW51bXMrKzsKKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJc3RyKys7CisJfQorCisJaWYgKG51bXMgPCA0KQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGRvdHMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmICpzdHIgIT0gJy8nKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA9PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicgfHwgKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChkb3RzID09IDMpIHsKKwkJCWlmICgqc3RyID09ICcvJykgeworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnXDAnKQorCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisJCX0KKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlzcCA9IHN0cjsKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworCWlmIChhdG9pKHNwKSA+IDMyKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNkZWZpbmUgSVBWNl9BRERSX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUiCisjZGVmaW5lIElQVjZfUFJFRklYX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUvIgorI2RlZmluZSBTVEFURV9TVEFSVAkJMQorI2RlZmluZSBTVEFURV9DT0xPTgkJMgorI2RlZmluZSBTVEFURV9ET1VCTEUJCTMKKyNkZWZpbmUgU1RBVEVfQUREUgkJNAorI2RlZmluZSBTVEFURV9ET1QgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNUQVRFX1NMQVNICQk2CisjZGVmaW5lIFNUQVRFX01BU0sJCTcKKworI2lmZGVmIEhBVkVfSVBWNgorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNl9kdW1teTsKKwlpbnQgcmV0OworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfQUREUl9TVFIpICE9IHN0cmxlbihzdHIpKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkvKiB1c2UgaW5ldF9wdG9uIHRoYXQgaGFzIGEgYmV0dGVyIHN1cHBvcnQsCisJICogZm9yIGV4YW1wbGUgaW5ldF9wdG9uIGNhbiBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgYWRkcmVzc2VzOgorCSAqICA6OjEuMi4zLjQKKwkgKi8KKwlyZXQgPSBpbmV0X3B0b24oQUZfSU5FVDYsIHN0ciwgJnNpbjZfZHVtbXkuc2luNl9hZGRyKTsKKworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIGV4YWN0X21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJZG91YmxlX2NvbG9uKys7CisJCQludW1zKys7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJ1wwJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfQorCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCXN0YXRlID0gU1RBVEVfRE9UOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9UOgorCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gOCkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKyNpZiAwCisJaWYgKG51bXMgPCAxMSkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKyNlbmRpZgkJCQkvKiAwICovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJaW50IG1hc2s7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9QUkVGSVhfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBzdGF0ZSAhPSBTVEFURV9NQVNLKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TVEFSVDoKKwkJCWlmICgqc3RyID09ICc6JykgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCXJldHVybiBub19tYXRjaDsKKwkJCQljb2xvbnMtLTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHN0cjsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQljYXNlIFNUQVRFX0NPTE9OOgorCQkJY29sb25zKys7CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7CisJCQllbHNlIHsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9VQkxFOgorCQkJaWYgKGRvdWJsZV9jb2xvbikKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnICYmICooc3RyICsgMSkgIT0gJy8nKQorCQkJCQljb2xvbnMrKzsKKwkJCQlzcCA9IHN0ciArIDE7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQkJZWxzZQorCQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcyArPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICcuJworCQkJICAgIHx8ICooc3RyICsgMSkgPT0gJ1wwJyB8fCAqKHN0ciArIDEpID09ICcvJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWZvciAoOyBzcCA8PSBzdHI7IHNwKyspCisJCQkJCWlmICgqc3AgPT0gJy8nKQorCQkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJbnVtcysrOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX1NMQVNIOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQlzdGF0ZSA9IFNUQVRFX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bXMgPiAxMSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoc3RhdGUgPCBTVEFURV9NQVNLKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJbWFzayA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlpZiAobWFzayA8IDAgfHwgbWFzayA+IDEyOCkKKwkJcmV0dXJuIG5vX21hdGNoOworCisvKiBJIGRvbid0IGtub3cgd2h5IG1hc2sgPCAxMyBtYWtlcyBjb21tYW5kIG1hdGNoIHBhcnRseS4KKyAgIEZvcmdpdmUgbWUgdG8gbWFrZSB0aGlzIGNvbW1lbnRzLiBJIFdhbnQgdG8gc2V0IHN0YXRpYyBkZWZhdWx0IHJvdXRlCisgICBiZWNhdXNlIG9mIGxhY2sgb2YgZnVuY3Rpb24gdG8gb3JpZ2luYXRlIGRlZmF1bHQgaW4gb3NwZjZkOyBzb3JyeQorICAgICAgIHlhc3UKKyAgaWYgKG1hc2sgPCAxMykKKyAgICByZXR1cm4gcGFydGx5X21hdGNoOworKi8KKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKworI2RlZmluZSBERUNJTUFMX1NUUkxFTl9NQVggMTAKKworc3RhdGljIGludCBjbWRfcmFuZ2VfbWF0Y2goY29uc3QgY2hhciAqcmFuZ2UsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCWNoYXIgYnVmW0RFQ0lNQUxfU1RSTEVOX01BWCArIDFdOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgdmFsOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXZhbCA9IHN0cnRvdWwoc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlyYW5nZSsrOworCXAgPSBzdHJjaHIocmFuZ2UsICctJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKKwkJcmV0dXJuIDA7CisJc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOworCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKKwltaW4gPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UgPSBwICsgMTsKKwlwID0gc3RyY2hyKHJhbmdlLCAnPicpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWF4ID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBNYWtlIGNvbXBsZXRpb24gbWF0Y2ggYW5kIHJldHVybiBtYXRjaCB0eXBlIGZsYWcuICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKKworCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCS8qIENoZWNrIGlzIHRoaXMgcG9pbnQncyBhcmd1bWVudCBvcHRpb25hbCA/ICovCisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkJICAgIHx8CisJCQkJCQkJICAgIENNRF9WQVJJQUJMRShzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZQorCQkJCQkJICAgIGlmIChzdHJuY21wCisJCQkJCQkJKGNvbW1hbmQsIHN0ciwKKwkJCQkJCQkgc3RybGVuKGNvbW1hbmQpKSA9PQorCQkJCQkJCTApIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcGFydGx5X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2g7CisJCQkJCQkJfQorCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWlmICghbWF0Y2hlZCkKKwkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1hdGNoX3R5cGU7Cit9CisKKy8qIEZpbHRlciB2ZWN0b3IgYnkgY29tbWFuZCBjaGFyYWN0ZXIgd2l0aCBpbmRleC4gKi8KK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUKK2NtZF9maWx0ZXJfYnlfc3RyaW5nKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQkvKiBJZiBnaXZlbiBpbmRleCBpcyBiaWdnZXIgdGhhbiBtYXggc3RyaW5nIHZlY3RvciBvZiBjb21tYW5kLAorCQkJICAgc2V0IE5VTEwgKi8KKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpID09CisJCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorCQkJCQkJeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQorCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBDaGVjayBhbWJpZ3VvdXMgbWF0Y2ggKi8KK3N0YXRpYyBpbnQKK2lzX2NtZF9hbWJpZ3VvdXMoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIGludCBpbmRleCwgZW51bSBtYXRjaF90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpbnQgbWF0Y2ggPSAwOworCisJCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQllbnVtIG1hdGNoX3R5cGUgcmV0OworCisJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQkJY2FzZSBleGFjdF9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cmNtcChjb21tYW5kLCBzdHIpID09IDApCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHBhcnRseV9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cm5jbXAoY29tbWFuZCwgc3RyLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsJLyogVGhlcmUgaXMgYW1iaWd1b3VzIG1hdGNoLiAqLworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFuZ2VfbWF0Y2g6CisJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2lmZGVmIEhBVkVfSVBWNgorCQkJCQljYXNlIGlwdjZfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjYoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2Nl9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY2X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCQkJCQljYXNlIGlwdjRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjQoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2NF9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY0X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGV4dGVuZF9tYXRjaDoKKwkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2Ugbm9fbWF0Y2g6CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmICghbWF0Y2gpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQl9CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQoreworCS8qIFNraXAgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkgfHwgQ01EX1ZBUkFSRyhkc3QpIHx8CisJICAgIENNRF9JUFY0KGRzdCkgfHwgQ01EX0lQVjRfUFJFRklYKGRzdCkgfHwgQ01EX1JBTkdFKGRzdCkpCisJCXJldHVybiBOVUxMOworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwkvKiBNYXRjaGVkIHdpdGggaW5wdXQgc3RyaW5nLiAqLworCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKKwkJcmV0dXJuIGRzdDsKKworCXJldHVybiBOVUxMOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworLyogVGhpcyB2ZXJzaW9uIHdpbGwgcmV0dXJuIHRoZSBkc3Qgc3RyaW5nIGFsd2F5cyBpZiBpdCBpcworICAgQ01EX1ZBUklBQkxFIGZvciAnPycga2V5IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb25fZGVzYyhjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwlpZiAoQ01EX1ZBUkFSRyhkc3QpKQorCQlyZXR1cm4gZHN0OworCisJaWYgKENNRF9SQU5HRShkc3QpKSB7CisJCWlmIChjbWRfcmFuZ2VfbWF0Y2goZHN0LCBzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorI2lmZGVmIEhBVkVfSVBWNgorCWlmIChDTURfSVBWNihkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY2X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworCWlmIChDTURfSVBWNChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY0X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9wdGlvbmFsIG9yIHZhcmlhYmxlIGNvbW1hbmRzIGFsd2F5cyBtYXRjaCBvbiAnPycgKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpKQorCQlyZXR1cm4gZHN0OworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgc2FtZSBzdHJpbmcgZWxlbWVudCBleGlzdGVuY2UuICBJZiBpdCBpc24ndCB0aGVyZSByZXR1cm4KKyAgICAxLiAqLworc3RhdGljIGludCBjbWRfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKm1hdGNoOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChtYXRjaCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJaWYgKHN0cmNtcChtYXRjaCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBDb21wYXJlIHN0cmluZyB0byBkZXNjcmlwdGlvbiB2ZWN0b3IuICBJZiB0aGVyZSBpcyBzYW1lIHN0cmluZworICAgcmV0dXJuIDEgZWxzZSByZXR1cm4gMC4gKi8KK3N0YXRpYyBpbnQgZGVzY191bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCBzdHIpID09IDApCisJCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3RyeV9kb19zaG9ydGN1dChlbnVtIG5vZGVfdHlwZSBub2RlLCBjaGFyICpmaXJzdF93b3JkKQoreworCWlmIChmaXJzdF93b3JkICE9IE5VTEwgJiYKKwkgICAgbm9kZSAhPSBBVVRIX05PREUgJiYKKwkgICAgbm9kZSAhPSBWSUVXX05PREUgJiYKKwkgICAgbm9kZSAhPSBBVVRIX0VOQUJMRV9OT0RFICYmCisJICAgIG5vZGUgIT0gRU5BQkxFX05PREUgJiYgMCA9PSBzdHJjbXAoImRvIiwgZmlyc3Rfd29yZCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiAnPycgZGVzY3JpYmUgY29tbWFuZCBzdXBwb3J0LiAqLworc3RhdGljIHZlY3RvcgorY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwljaGFyICpjb21tYW5kOworCXN0YXRpYyBzdHJ1Y3QgZGVzYyBkZXNjX2NyID0geyAiPGNyPiIsICIiIH07CisKKwkvKiBTZXQgaW5kZXguICovCisJaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKKworCS8qIE1ha2UgY29weSB2ZWN0b3Igb2YgY3VycmVudCBub2RlJ3MgY29tbWFuZCB2ZWN0b3IuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisKKwkvKiBGaWx0ZXIgY29tbWFuZHMuICovCisJLyogT25seSB3b3JkcyBwcmVjZWRlcyBjdXJyZW50IHdvcmQgd2lsbCBiZSBjaGVja2VkIGluIHRoaXMgbG9vcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkgeworCQkJCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJCQkJdmVjdG9yIGRlc2N2ZWM7CisJCQkJdW5zaWduZWQgaW50IGosIGs7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCQkgICAgJiYKKwkJCQkJICAgICh2ZWN0b3JfYWN0aXZlCisJCQkJCSAgICAgKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSkgeworCQkJCQkJZGVzY3ZlYyA9CisJCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPgorCQkJCQkJCQlzdHJ2ZWMsCisJCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkJKGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJIHN0cnZlYykgLSAxKTsKKwkJCQkJCWZvciAoayA9IDA7CisJCQkJCQkgICAgIGsgPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOworCQkJCQkJICAgICBrKyspIHsKKwkJCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9CisJCQkJCQkJICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsCisJCQkJCQkJCQlrKTsKKwkJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLAorCQkJCQkJCQkgICBkZXNjKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJCQkJcmV0dXJuIG1hdGNodmVjOworCQkJfQorCisJCQlpZiAoKHJldCA9CisJCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKKwkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLworCS8qICBtYXRjaHZlYyA9IHZlY3Rvcl9pbml0IChJTklUX01BVENIVkVDX1NJWkUpOyAqLworCisJLyogTWFrZSBzdXJlIHRoYXQgY21kX3ZlY3RvciBpcyBmaWx0ZXJlZCBiYXNlZCBvbiBjdXJyZW50IHdvcmQgKi8KKwljb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KTsKKwlpZiAoY29tbWFuZCkKKwkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgpOworCisJLyogTWFrZSBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIGlmIGNvbW1hbmQgaXMgTlVMTCwgaW5kZXggbWF5IGJlIGVxdWFsIHRvIHZlY3Rvcl9hY3RpdmUgKi8KKwkJCWlmIChjb21tYW5kICYmIGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGNvbXBsZXRlZC4gKi8KKwkJCQlpZiAoY29tbWFuZCA9PSBOVUxMCisJCQkJICAgICYmIGluZGV4ID09IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkgeworCQkJCQlzdHJpbmcgPSAiPGNyPiI7CisJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nCisJCQkJCSAgICAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJCXZlY3RvciBkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJICAgICBqKyspCisJCQkJCQlpZiAoKGRlc2MgPQorCQkJCQkJICAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCQlzdHJpbmcgPQorCQkJCQkJCSAgICBjbWRfZW50cnlfZnVuY3Rpb25fZGVzYworCQkJCQkJCSAgICAoY29tbWFuZCwKKwkJCQkJCQkgICAgIGRlc2MtPmNtZCk7CisJCQkJCQkJaWYgKHN0cmluZykgeworCQkJCQkJCQkvKiBVbmlxdWVuZXNzIGNoZWNrICovCisJCQkJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJCQkJdmVjdG9yX3NldAorCQkJCQkJCQkJICAgIChtYXRjaHZlYywKKwkJCQkJCQkJCSAgICAgZGVzYyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJfSBlbHNlCisJCSpzdGF0dXMgPSBDTURfU1VDQ0VTUzsKKworCXJldHVybiBtYXRjaHZlYzsKK30KKwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqIHZ0eSwgaW50ICpzdGF0dXMpCit7CisJdmVjdG9yIHJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIENoZWNrIExDRCBvZiBtYXRjaGVkIGNvbW1hbmQuICovCitzdGF0aWMgaW50IGNtZF9sY2QoY2hhciAqKm1hdGNoZWQpCit7CisJaW50IGk7CisJaW50IGo7CisJaW50IGxjZCA9IC0xOworCWNoYXIgKnMxLCAqczI7CisJY2hhciBjMSwgYzI7CisKKwlpZiAobWF0Y2hlZFswXSA9PSBOVUxMIHx8IG1hdGNoZWRbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQlzMSA9IG1hdGNoZWRbaSAtIDFdOworCQlzMiA9IG1hdGNoZWRbaV07CisKKwkJZm9yIChqID0gMDsgKGMxID0gczFbal0pICYmIChjMiA9IHMyW2pdKTsgaisrKQorCQkJaWYgKGMxICE9IGMyKQorCQkJCWJyZWFrOworCisJCWlmIChsY2QgPCAwKQorCQkJbGNkID0gajsKKwkJZWxzZSB7CisJCQlpZiAobGNkID4gaikKKwkJCQlsY2QgPSBqOworCQl9CisJfQorCXJldHVybiBsY2Q7Cit9CisKKy8qIENvbW1hbmQgbGluZSBjb21wbGV0aW9uIHN1cHBvcnQuICovCitzdGF0aWMgY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkJCWludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwljaGFyICoqbWF0Y2hfc3RyOworCXN0cnVjdCBkZXNjICpkZXNjOworCXZlY3RvciBkZXNjdmVjOworCWNoYXIgKmNvbW1hbmQ7CisJaW50IGxjZDsKKworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBGaXJzdCwgZmlsdGVyIGJ5IHByZWNlZWRpbmcgY29tbWFuZCBzdHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJZW51bSBtYXRjaF90eXBlIG1hdGNoOworCQkJaW50IHJldDsKKworCQkJLyogRmlyc3QgdHJ5IGNvbXBsZXRpb24gbWF0Y2gsIGlmIHRoZXJlIGlzIGV4YWN0bHkgbWF0Y2ggcmV0dXJuIDEgKi8KKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCS8qIElmIHRoZXJlIGlzIGV4YWN0IG1hdGNoIHRoZW4gZmlsdGVyIGFtYmlndW91cyBtYXRjaCBlbHNlIGNoZWNrCisJCQkgICBhbWJpZ3VvdXNuZXNzLiAqLworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgICBlbHNlIGlmIChyZXQgPT0gMikKKwkJCSAgIHsKKwkJCSAgIHZlY3Rvcl9mcmVlIChjbWRfdmVjdG9yKTsKKwkJCSAgICpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJICAgcmV0dXJuIE5VTEw7CisJCQkgICB9CisJCQkgKi8KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IuICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogTm93IHdlIGdvdCBpbnRvIGNvbXBsZXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmc7CisJCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKKworCQkJLyogQ2hlY2sgZmllbGQgbGVuZ3RoICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCisJCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJaWYgKChzdHJpbmcgPSBjbWRfZW50cnlfZnVuY3Rpb24odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwgZGVzYy0+Y21kKSkpCisJCQkJCQkJaWYgKGNtZF91bmlxdWVfc3RyaW5nIChtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJdmVjdG9yX3NldCAobWF0Y2h2ZWMsIHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgc3RyaW5nKSk7CisJCQkJCX0KKwkJCX0KKwkJfQorCisJLyogV2UgZG9uJ3QgbmVlZCBjbWRfdmVjdG9yIGFueSBtb3JlLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogTm8gbWF0Y2hlZCBjb21tYW5kICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JyBwYXR0ZXJuLiAgRG8geW91IG5lZWQgJz8nIGNvbW1hbmQgYXQKKwkJICAgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgPT0gJ1wwJykKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PVEhJTkdfVE9ETzsKKwkJZWxzZQorCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9ubHkgb25lIG1hdGNoZWQgKi8KKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDEpID09IE5VTEwpIHsKKwkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g7CisJCXJldHVybiBtYXRjaF9zdHI7CisJfQorCS8qIE1ha2UgaXQgc3VyZSBsYXN0IGVsZW1lbnQgaXMgTlVMTC4gKi8KKwl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBOVUxMKTsKKworCS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIHN0cmluZ3MuICovCisJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgIT0gTlVMTCkgeworCQlsY2QgPSBjbWRfbGNkKChjaGFyICoqKW1hdGNodmVjLT5pbmRleCk7CisKKwkJaWYgKGxjZCkgeworCQkJaW50IGxlbiA9IHN0cmxlbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKTsKKworCQkJaWYgKGxlbiA8IGxjZCkgeworCQkJCWNoYXIgKmxjZHN0cjsKKworCQkJCWxjZHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsY2QgKyAxLAorCQkJCQkJICAgICAgImNvbXBsZXRlLWxjZHN0ciIpOworCQkJCW1lbWNweShsY2RzdHIsIG1hdGNodmVjLT5pbmRleFswXSwgbGNkKTsKKwkJCQlsY2RzdHJbbGNkXSA9ICdcMCc7CisKKwkJCQkvKiBtYXRjaF9zdHIgPSAoY2hhciAqKikgJmxjZHN0cjsgKi8KKworCQkJCS8qIEZyZWUgbWF0Y2h2ZWMuICovCisJCQkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUobWF0Y2h2ZWMpOyBpKyspIHsKKwkJCQkJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSkKKwkJCQkJCXRhbGxvY19mcmVlKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSk7CisJCQkJfQorCQkJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCS8qIE1ha2UgbmV3IG1hdGNodmVjLiAqLworCQkJCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBsY2RzdHIpOworCQkJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCisJCQkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9NQVRDSDsKKwkJCQlyZXR1cm4gbWF0Y2hfc3RyOworCQkJfQorCQl9CisJfQorCisJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisJKnN0YXR1cyA9IENNRF9DT01QTEVURV9MSVNUX01BVENIOworCXJldHVybiBtYXRjaF9zdHI7Cit9CisKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJY2hhciAqKnJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIHJldHVybiBwYXJlbnQgbm9kZSAqLworLyogTVVTVCBldmVudHVhbGx5IGNvbnZlcmdlIG9uIENPTkZJR19OT0RFICovCitlbnVtIG5vZGVfdHlwZSB2dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlhc3NlcnQodnR5LT5ub2RlID4gQ09ORklHX05PREUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCU0NSX05PREU6CisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCX0KKworCXJldHVybiB2dHktPm5vZGU7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCB2bGluZSB2ZWN0b3IuICovCitzdGF0aWMgaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWludCB2YXJmbGFnOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50cy4gKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwKKwkJCQkJCSAgICAgaW5kZXgpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCisJCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKKwkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKKyNpZiAwCisJCQkJcHJpbnRmKCJERUJVRzogJXNcbiIsIGNtZF9lbGVtZW50LT5zdHJpbmcpOworI2VuZGlmCisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpbmNvbXBsZXRlX2NvdW50Kys7CisJCQl9CisJCX0KKworCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KKwlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7CisJCWlmIChpbmNvbXBsZXRlX2NvdW50KQorCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKKwkJZWxzZQorCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJfQorCisJaWYgKG1hdGNoZWRfY291bnQgPiAxKQorCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisKKwkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KKwl2YXJmbGFnID0gMDsKKwlhcmdjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7CisJCWlmICh2YXJmbGFnKQorCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQllbHNlIHsKKwkJCXZlY3RvciBkZXNjdmVjID0KKwkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7CisKKwkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKKwkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOworCisJCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKKwkJCQkJdmFyZmxhZyA9IDE7CisKKwkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQorCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJfQorCisJCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKKwkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOworCX0KKworCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCisJaWYgKGNtZCkKKwkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKKworCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKKwkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKKworCS8qIEV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kLiAqLworCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKK30KKworaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQsCisJCSAgICBpbnQgdnR5c2gpCit7CisJaW50IHJldCwgc2F2ZWRfcmV0LCB0cmllZCA9IDA7CisJZW51bSBub2RlX3R5cGUgb25vZGU7CisJdm9pZCAqb2luZGV4OworCisJb25vZGUgPSB2dHktPm5vZGU7CisJb2luZGV4ID0gdnR5LT5pbmRleDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIGNtZCk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXNhdmVkX3JldCA9IHJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOworCisJaWYgKHZ0eXNoKQorCQlyZXR1cm4gc2F2ZWRfcmV0OworCisJLyogVGhpcyBhc3N1bWVzIGFsbCBub2RlcyBhYm92ZSBDT05GSUdfTk9ERSBhcmUgY2hpbGRzIG9mIENPTkZJR19OT0RFICovCisJd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkgICAgICAgJiYgdnR5LT5ub2RlID4gQ09ORklHX05PREUpIHsKKwkJdnR5X2dvX3BhcmVudCh2dHkpOworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKwkJdHJpZWQgPSAxOworCQlpZiAocmV0ID09IENNRF9TVUNDRVNTIHx8IHJldCA9PSBDTURfV0FSTklORykgeworCQkJLyogc3VjY2VzZnVsbCBjb21tYW5kLCBsZWF2ZSB0aGUgbm9kZSBhcyBpcyAqLworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwkvKiBubyBjb21tYW5kIHN1Y2NlZWRlZCwgcmVzZXQgdGhlIHZ0eSB0byB0aGUgb3JpZ2luYWwgbm9kZSBhbmQKKwkgICByZXR1cm4gdGhlIGVycm9yIGZvciB0aGlzIG5vZGUgKi8KKwlpZiAodHJpZWQpIHsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXZ0eS0+aW5kZXggPSBvaW5kZXg7CisJfQorCXJldHVybiBzYXZlZF9yZXQ7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCByZWFkbGluZS4gKi8KK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgICBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGluZGV4OworCXZlY3RvciBjbWRfdmVjdG9yOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOworCWludCB2YXJmbGFnOworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7CisJY2hhciAqY29tbWFuZDsKKworCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnQgKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9zdHJpbmcodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwKKwkJCQkJCSAgICAgY21kX3ZlY3RvciwgaW5kZXgpOworCisJCQkvKiBJZiBjb21tYW5kIG1lZXRzICcuVkFSQVJHJyB0aGVuIGZpbmlzaCBtYXRjaGluZy4gKi8KKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfQorCQkJaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCisJbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKKwltYXRjaGVkX2NvdW50ID0gMDsKKwlpbmNvbXBsZXRlX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAodmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgIT0gTlVMTCkgeworCQkJY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlCisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBOb3cgZXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBtYWtlIGZyb20gZmlsZS4gKi8KK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKnZ0eSwgRklMRSAqIGZwKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJd2hpbGUgKGZnZXRzKHZ0eS0+YnVmLCBWVFlfQlVGU0laLCBmcCkpIHsKKwkJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJCS8qIEluIGNhc2Ugb2YgY29tbWVudCBsaW5lICovCisJCWlmICh2bGluZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCS8qIEV4ZWN1dGUgY29uZmlndXJhdGlvbiBjb21tYW5kIDogdGhpcyBpcyBzdHJpY3QgbWF0Y2ggKi8KKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisKKwkJLyogVHJ5IGFnYWluIHdpdGggc2V0dGluZyBub2RlIHRvIENPTkZJR19OT0RFICovCisJCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8KKwkJICAgICAgICYmIHZ0eS0+bm9kZSAhPSBDT05GSUdfTk9ERSkgeworCQkJdnR5X2dvX3BhcmVudCh2dHkpOworCQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisJCX0KKworCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8pCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBmcm9tIHRlcm1pbmFsICovCitERUZVTihjb25maWdfdGVybWluYWwsCisgICAgICBjb25maWdfdGVybWluYWxfY21kLAorICAgICAgImNvbmZpZ3VyZSB0ZXJtaW5hbCIsCisgICAgICAiQ29uZmlndXJhdGlvbiBmcm9tIHZ0eSBpbnRlcmZhY2VcbiIgIkNvbmZpZ3VyYXRpb24gdGVybWluYWxcbiIpCit7CisJaWYgKHZ0eV9jb25maWdfbG9jayh2dHkpKQorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwllbHNlIHsKKwkJdnR5X291dCh2dHksICJWVFkgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgVlRZJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGVuYWJsZSwgY29uZmlnX2VuYWJsZV9jbWQsICJlbmFibGUiLCAiVHVybiBvbiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKK3sKKwkvKiBJZiBlbmFibGUgcGFzc3dvcmQgaXMgTlVMTCwgY2hhbmdlIHRvIEVOQUJMRV9OT0RFICovCisJaWYgKChob3N0LmVuYWJsZSA9PSBOVUxMICYmIGhvc3QuZW5hYmxlX2VuY3J5cHQgPT0gTlVMTCkgfHwKKwkgICAgdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKQorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwllbHNlCisJCXZ0eS0+bm9kZSA9IEFVVEhfRU5BQkxFX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc2FibGUgY29tbWFuZCAqLworREVGVU4oZGlzYWJsZSwKKyAgICAgIGNvbmZpZ19kaXNhYmxlX2NtZCwgImRpc2FibGUiLCAiVHVybiBvZmYgcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJaWYgKHZ0eS0+bm9kZSA9PSBFTkFCTEVfTk9ERSkKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KK0RFRlVOKGNvbmZpZ19leGl0LAorICAgICAgY29uZmlnX2V4aXRfY21kLCAiZXhpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQlpZiAoMCkJCS8vdnR5X3NoZWxsICh2dHkpKQorCQkJZXhpdCgwKTsKKwkJZWxzZQorCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQlicmVhazsKKwljYXNlIFZUWV9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogcXVpdCBpcyBhbGlhcyBvZiBleGl0LiAqLworQUxJQVMoY29uZmlnX2V4aXQsCisgICAgICBjb25maWdfcXVpdF9jbWQsICJxdWl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCisKKy8qIEVuZCBvZiBjb25maWd1cmF0aW9uLiAqLworICAgIERFRlVOKGNvbmZpZ19lbmQsCisgICAgICBjb25maWdfZW5kX2NtZCwgImVuZCIsICJFbmQgY3VycmVudCBtb2RlIGFuZCBjaGFuZ2UgdG8gZW5hYmxlIG1vZGUuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNob3cgdmVyc2lvbi4gKi8KK0RFRlVOKHNob3dfdmVyc2lvbiwKKyAgICAgIHNob3dfdmVyc2lvbl9jbWQsICJzaG93IHZlcnNpb24iLCBTSE9XX1NUUiAiRGlzcGxheXMgcHJvZ3JhbSB2ZXJzaW9uXG4iKQoreworCXZ0eV9vdXQodnR5LCAiJXMgJXMgKCVzKS4lcyIsIFFVQUdHQV9QUk9HTkFNRSwgUVVBR0dBX1ZFUlNJT04sCisJCWhvc3QubmFtZSA/IGhvc3QubmFtZSA6ICIiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyVzIiwgUVVBR0dBX0NPUFlSSUdIVCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworREVGVU4oY29uZmlnX2hlbHAsCisgICAgICBjb25maWdfaGVscF9jbWQsICJoZWxwIiwgIkRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcmFjdGl2ZSBoZWxwIHN5c3RlbVxuIikKK3sKKwl2dHlfb3V0KHZ0eSwKKwkJIlRoaXMgVlRZIHByb3ZpZGVzIGFkdmFuY2VkIGhlbHAgZmVhdHVyZXMuICBXaGVuIHlvdSBuZWVkIGhlbHAsJXNcCithbnl0aW1lIGF0IHRoZSBjb21tYW5kIGxpbmUgcGxlYXNlIHByZXNzICc/Jy4lc1wKKyVzXAorSWYgbm90aGluZyBtYXRjaGVzLCB0aGUgaGVscCBsaXN0IHdpbGwgYmUgZW1wdHkgYW5kIHlvdSBtdXN0IGJhY2t1cCVzXAorIHVudGlsIGVudGVyaW5nIGEgJz8nIHNob3dzIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4lc1wKK1R3byBzdHlsZXMgb2YgaGVscCBhcmUgcHJvdmlkZWQ6JXNcCisxLiBGdWxsIGhlbHAgaXMgYXZhaWxhYmxlIHdoZW4geW91IGFyZSByZWFkeSB0byBlbnRlciBhJXNcCitjb21tYW5kIGFyZ3VtZW50IChlLmcuICdzaG93ID8nKSBhbmQgZGVzY3JpYmVzIGVhY2ggcG9zc2libGUlc1wKK2FyZ3VtZW50LiVzXAorMi4gUGFydGlhbCBoZWxwIGlzIHByb3ZpZGVkIHdoZW4gYW4gYWJicmV2aWF0ZWQgYXJndW1lbnQgaXMgZW50ZXJlZCVzXAorICAgYW5kIHlvdSB3YW50IHRvIGtub3cgd2hhdCBhcmd1bWVudHMgbWF0Y2ggdGhlIGlucHV0JXNcCisgICAoZS5nLiAnc2hvdyBtZT8nLiklcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwKKwkJVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KK0RFRlVOKGNvbmZpZ19saXN0LCBjb25maWdfbGlzdF9jbWQsICJsaXN0IiwgIlByaW50IGNvbW1hbmQgbGlzdFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCB2dHktPm5vZGUpOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY25vZGUtPmNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kID0gdmVjdG9yX3Nsb3QoY25vZGUtPmNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMCisJCSAgICAmJiAhKGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ERVBSRUNBVEVECisJCQkgfHwgY21kLT5hdHRyID09IENNRF9BVFRSX0hJRERFTikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIGNtZC0+c3RyaW5nLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byBmaWxlLiAqLworREVGVU4oY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfZmlsZV9jbWQsCisgICAgICAid3JpdGUgZmlsZSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byBjb25maWd1cmF0aW9uIGZpbGVcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKKwljaGFyICpjb25maWdfZmlsZTsKKwljaGFyICpjb25maWdfZmlsZV90bXAgPSBOVUxMOworCWNoYXIgKmNvbmZpZ19maWxlX3NhdiA9IE5VTEw7CisJc3RydWN0IHZ0eSAqZmlsZV92dHk7CisKKwkvKiBDaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBvcGVyYXRpbmcgdW5kZXIgdnR5c2ggY29uZmlndXJhdGlvbiAqLworCWlmIChob3N0LmNvbmZpZyA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSB0byBjb25maWd1cmF0aW9uIGZpbGUsIHVzaW5nIHZ0eXNoLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIEdldCBmaWxlbmFtZS4gKi8KKwljb25maWdfZmlsZSA9IGhvc3QuY29uZmlnOworCisJY29uZmlnX2ZpbGVfc2F2ID0KKwkgICAgX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsCisJCQkgc3RybGVuKGNvbmZpZ19maWxlKSArIHN0cmxlbihDT05GX0JBQ0tVUF9FWFQpICsgMSwKKwkJCSAiY29uZmlnX2ZpbGVfc2F2Iik7CisJc3RyY3B5KGNvbmZpZ19maWxlX3NhdiwgY29uZmlnX2ZpbGUpOworCXN0cmNhdChjb25maWdfZmlsZV9zYXYsIENPTkZfQkFDS1VQX0VYVCk7CisKKwljb25maWdfZmlsZV90bXAgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuKGNvbmZpZ19maWxlKSArIDgsCisJCQkJCSJjb25maWdfZmlsZV90bXAiKTsKKwlzcHJpbnRmKGNvbmZpZ19maWxlX3RtcCwgIiVzLlhYWFhYWCIsIGNvbmZpZ19maWxlKTsKKworCS8qIE9wZW4gZmlsZSB0byBjb25maWd1cmF0aW9uIHdyaXRlLiAqLworCWZkID0gbWtzdGVtcChjb25maWdfZmlsZV90bXApOworCWlmIChmZCA8IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV90bXAsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIE1ha2UgdnR5IGZvciBjb25maWd1cmF0aW9uIGZpbGUuICovCisJZmlsZV92dHkgPSB2dHlfbmV3KCk7CisJZmlsZV92dHktPmZkID0gZmQ7CisJZmlsZV92dHktPnR5cGUgPSBWVFlfRklMRTsKKworCS8qIENvbmZpZyBmaWxlIGhlYWRlciBwcmludC4gKi8KKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHlcbiEgICAiKTsKKwkvL3Z0eV90aW1lX3ByaW50IChmaWxlX3Z0eSwgMSk7CisJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQlpZiAoKCpub2RlLT5mdW5jKSAoZmlsZV92dHkpKQorCQkJCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKKwkJfQorCXZ0eV9jbG9zZShmaWxlX3Z0eSk7CisKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlX3NhdikgIT0gMCkKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJdnR5X291dCh2dHksCisJCQkJIkNhbid0IHVubGluayBiYWNrdXAgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwlpZiAobGluayhjb25maWdfZmlsZSwgY29uZmlnX2ZpbGVfc2F2KSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgYmFja3VwIG9sZCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXN5bmMoKTsKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgdW5saW5rIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobGluayhjb25maWdfZmlsZV90bXAsIGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLCBjb25maWdfZmlsZSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJc3luYygpOworCisJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCisJaWYgKGNobW9kKGNvbmZpZ19maWxlLCAwNjY2ICYgfkNPTkZJR0ZJTEVfTUFTSykgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGNobW9kIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXMgKCVkKS4lcyIsCisJCQljb25maWdfZmlsZSwgc3RyZXJyb3IoZXJybm8pLCBlcnJubywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5X291dCh2dHksICJDb25maWd1cmF0aW9uIHNhdmVkIHRvICVzJXMiLCBjb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfY21kLAorICAgICAgIndyaXRlIiwgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfbWVtb3J5X2NtZCwKKyAgICAgICJ3cml0ZSBtZW1vcnkiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgY29uZmlndXJhdGlvbiB0byB0aGUgZmlsZSAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kLAorICAgICAgImNvcHkgcnVubmluZy1jb25maWcgc3RhcnR1cC1jb25maWciLAorICAgICAgIkNvcHkgY29uZmlndXJhdGlvblxuIgorICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8uLi4gXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0byBzdGFydHVwIGNvbmZpZyAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworICAgIERFRlVOKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIGNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQsCisgICAgICAid3JpdGUgdGVybWluYWwiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgdG8gdGVybWluYWxcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCisJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikgeworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jCisJCQkgICAgJiYgbm9kZS0+dnR5c2gpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJfSBlbHNlIHsKKwkJdnR5X291dCh2dHksICIlc0N1cnJlbnQgY29uZmlndXJhdGlvbjolcyIsIFZUWV9ORVdMSU5FLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCisJCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCQkJfQorCQl2dHlfb3V0KHZ0eSwgImVuZCVzIiwgVlRZX05FV0xJTkUpOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KK0FMSUFTKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIHNob3dfcnVubmluZ19jb25maWdfY21kLAorICAgICAgInNob3cgcnVubmluZy1jb25maWciLCBTSE9XX1NUUiAicnVubmluZyBjb25maWd1cmF0aW9uXG4iKQorCisvKiBXcml0ZSBzdGFydHVwIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oc2hvd19zdGFydHVwX2NvbmZpZywKKyAgICAgIHNob3dfc3RhcnR1cF9jb25maWdfY21kLAorICAgICAgInNob3cgc3RhcnR1cC1jb25maWciLCBTSE9XX1NUUiAiQ29udGVudGVzIG9mIHN0YXJ0dXAgY29uZmlndXJhdGlvblxuIikKK3sKKwljaGFyIGJ1ZltCVUZTSVpdOworCUZJTEUgKmNvbmZwOworCisJY29uZnAgPSBmb3Blbihob3N0LmNvbmZpZywgInIiKTsKKwlpZiAoY29uZnAgPT0gTlVMTCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlIFslc10lcyIsCisJCQlob3N0LmNvbmZpZywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1ZiwgQlVGU0laLCBjb25mcCkpIHsKKwkJY2hhciAqY3AgPSBidWY7CisKKwkJd2hpbGUgKCpjcCAhPSAnXHInICYmICpjcCAhPSAnXG4nICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKwkJKmNwID0gJ1wwJzsKKworCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlmY2xvc2UoY29uZnApOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIb3N0bmFtZSBjb25maWd1cmF0aW9uICovCitERUZVTihjb25maWdfaG9zdG5hbWUsCisgICAgICBob3N0bmFtZV9jbWQsCisgICAgICAiaG9zdG5hbWUgV09SRCIsCisgICAgICAiU2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiVGhpcyBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIpCit7CisJaWYgKCFpc2FscGhhKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFiZXQlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCisJaG9zdC5uYW1lID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19ub19ob3N0bmFtZSwKKyAgICAgIG5vX2hvc3RuYW1lX2NtZCwKKyAgICAgICJubyBob3N0bmFtZSBbSE9TVE5BTUVdIiwKKyAgICAgIE5PX1NUUiAiUmVzZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXJcbiIpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKKwlob3N0Lm5hbWUgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogVlRZIGludGVyZmFjZSBwYXNzd29yZCBzZXQuICovCitERUZVTihjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX2NtZCwKKyAgICAgICJwYXNzd29yZCAoOHwpIFdPUkQiLAorICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgorICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgorICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gbGluZSBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKKwkJCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCQkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QucGFzc3dvcmQpCisJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5wYXNzd29yZCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfdGV4dF9jbWQsCisgICAgICAicGFzc3dvcmQgTElORSIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpIGxpbmUgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgc2V0LiAqLworICAgIERFRlVOKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsIGVuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAiZW5hYmxlIHBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiAnZW5hYmxlJyBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogQ3J5cHQgdHlwZSBpcyBzcGVjaWZpZWQuICovCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5lbmFibGUpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCQkJaG9zdC5lbmFibGUgPSBOVUxMOworCisJCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCisJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQorCisJaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LAorCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmVuYWJsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCS8qIFBsYWluIHBhc3N3b3JkIGlucHV0LiAqLworI2lmZGVmIFZUWV9DUllQVF9QVworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOworCX0gZWxzZQorI2VuZGlmCisJCWhvc3QuZW5hYmxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX2VuYWJsZV9wYXNzd29yZCwKKyAgICAgIGVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgTElORSIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpICdlbmFibGUnIHBhc3N3b3JkXG4iKQorCisvKiBWVFkgZW5hYmxlIHBhc3N3b3JkIGRlbGV0ZS4gKi8KKyAgICBERUZVTihub19jb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBub19lbmFibGVfcGFzc3dvcmRfY21kLAorICAgICAgIm5vIGVuYWJsZSBwYXNzd29yZCIsCisgICAgICBOT19TVFIKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIpCit7CisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitERUZVTihzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJaG9zdC5lbmNyeXB0ID0gMTsKKworCWlmIChob3N0LnBhc3N3b3JkKSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QucGFzc3dvcmQpKTsKKwl9CisJaWYgKGhvc3QuZW5hYmxlKSB7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QuZW5hYmxlKSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgIm5vIHNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICBOT19TVFIgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQoreworCWlmICghaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAwOworCisJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGNvbmZpZ190ZXJtaW5hbF9sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInRlcm1pbmFsIGxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvbiBzY3JlZW4gKDAgZm9yIG5vIHBhdXNpbmcpXG4iKQoreworCWludCBsaW5lczsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOworCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7CisJCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eS0+bGluZXMgPSBsaW5lczsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbm8gbGVuZ3RoIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIpCit7CisJdnR5LT5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaG9zdC5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgIm5vIHNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIFs8MC01MTI+XSIsCisgICAgICBOT19TVFIKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaG9zdC5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fSElEREVOKGRvX2VjaG8sCisJICAgICBlY2hvX2NtZCwKKwkgICAgICJlY2hvIC5NRVNTQUdFIiwKKwkgICAgICJFY2hvIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB2dHlcbiIgIlRoZSBtZXNzYWdlIHRvIGVjaG9cbiIpCit7CisJY2hhciAqbWVzc2FnZTsKKworCXZ0eV9vdXQodnR5LCAiJXMlcyIsCisJCSgobWVzc2FnZSA9CisJCSAgYXJndl9jb25jYXQoYXJndiwgYXJnYywgMCkpID8gbWVzc2FnZSA6ICIiKSwgVlRZX05FV0xJTkUpOworCWlmIChtZXNzYWdlKQorCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZiAwCitERUZVTihjb25maWdfbG9nbXNnLAorICAgICAgY29uZmlnX2xvZ21zZ19jbWQsCisgICAgICAibG9nbXNnICIgTE9HX0xFVkVMUyAiIC5NRVNTQUdFIiwKKyAgICAgICJTZW5kIGEgbWVzc2FnZSB0byBlbmFibGVkIGxvZ2dpbmcgZGVzdGluYXRpb25zXG4iCisgICAgICBMT0dfTEVWRUxfREVTQyAiVGhlIG1lc3NhZ2UgdG8gc2VuZFxuIikKK3sKKwlpbnQgbGV2ZWw7CisJY2hhciAqbWVzc2FnZTsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nKE5VTEwsIGxldmVsLAorCSAgICAgKChtZXNzYWdlID0gYXJndl9jb25jYXQoYXJndiwgYXJnYywgMSkpID8gbWVzc2FnZSA6ICIiKSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19sb2dnaW5nLAorICAgICAgc2hvd19sb2dnaW5nX2NtZCwKKyAgICAgICJzaG93IGxvZ2dpbmciLCBTSE9XX1NUUiAiU2hvdyBjdXJyZW50IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuIikKK3sKKwlzdHJ1Y3QgemxvZyAqemwgPSB6bG9nX2RlZmF1bHQ7CisKKwl2dHlfb3V0KHZ0eSwgIlN5c2xvZyBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmYWNpbGl0eSAlcywgaWRlbnQgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSwKKwkJCWZhY2lsaXR5X25hbWUoemwtPmZhY2lsaXR5KSwgemwtPmlkZW50KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJTdGRvdXQgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJNb25pdG9yIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJGaWxlIGxvZ2dpbmc6ICIpOworCWlmICgoemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gPT0gWkxPR19ESVNBQkxFRCkgfHwgIXpsLT5mcCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmlsZW5hbWUgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXV0sCisJCQl6bC0+ZmlsZW5hbWUpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlByb3RvY29sIG5hbWU6ICVzJXMiLAorCQl6bG9nX3Byb3RvX25hbWVzW3psLT5wcm90b2NvbF0sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJlY29yZCBwcmlvcml0eTogJXMlcyIsCisJCSh6bC0+cmVjb3JkX3ByaW9yaXR5ID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibG9nIHN0ZG91dCIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWxfY21kLAorICAgICAgImxvZyBzdGRvdXQgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBub19jb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibm8gbG9nIHN0ZG91dCBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzdGRvdXRcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX21vbml0b3IsCisgICAgICBjb25maWdfbG9nX21vbml0b3JfY21kLAorICAgICAgImxvZyBtb25pdG9yIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbF9jbWQsCisgICAgICAibG9nIG1vbml0b3IgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIG5vX2NvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibm8gbG9nIG1vbml0b3IgW0xFVkVMXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJEaXNhYmxlIHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmdcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZXRfbG9nX2ZpbGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxvZ2xldmVsKQoreworCWludCByZXQ7CisJY2hhciAqcCA9IE5VTEw7CisJY29uc3QgY2hhciAqZnVsbHBhdGg7CisKKwkvKiBQYXRoIGRldGVjdGlvbi4gKi8KKwlpZiAoIUlTX0RJUkVDVE9SWV9TRVAoKmZuYW1lKSkgeworCQljaGFyIGN3ZFtNQVhQQVRITEVOICsgMV07CisJCWN3ZFtNQVhQQVRITEVOXSA9ICdcMCc7CisKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKworCQlpZiAoKHAgPSBfdGFsbG9jX3plcm8odGFsbF92Y21kX2N0eCwKKwkJCQkgICAgICBzdHJsZW4oY3dkKSArIHN0cmxlbihmbmFtZSkgKyAyKSwKKwkJCQkgICAgICAic2V0X2xvZ19maWxlIikKKwkJICAgID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJc3ByaW50ZihwLCAiJXMvJXMiLCBjd2QsIGZuYW1lKTsKKwkJZnVsbHBhdGggPSBwOworCX0gZWxzZQorCQlmdWxscGF0aCA9IGZuYW1lOworCisJcmV0ID0gemxvZ19zZXRfZmlsZShOVUxMLCBmdWxscGF0aCwgbG9nbGV2ZWwpOworCisJaWYgKHApCisJCXRhbGxvY19mcmVlKHApOworCisJaWYgKCFyZXQpIHsKKwkJdnR5X291dCh2dHksICJjYW4ndCBvcGVuIGxvZ2ZpbGUgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZuYW1lKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19maWxlLAorICAgICAgY29uZmlnX2xvZ19maWxlX2NtZCwKKyAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIpCit7CisJcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGVfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMV0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgbGV2ZWwpOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIFtGSUxFTkFNRV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIikKK3sKKwl6bG9nX3Jlc2V0X2ZpbGUoTlVMTCk7CisKKwlpZiAoaG9zdC5sb2dmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOworCisJaG9zdC5sb2dmaWxlID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19maWxlLAorICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKKyAgICAgICJubyBsb2cgZmlsZSBGSUxFTkFNRSBMRVZFTCIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIiAiTG9nZ2luZyBsZXZlbFxuIikKKworICAgIERFRlVOKGNvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgImxvZyBzeXNsb2ciLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N5c2xvZ19sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsX2NtZCwKKyAgICAgICJsb2cgc3lzbG9nICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHksCisJCSBjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisJCSAibG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKKwkJICIoRGVwcmVjYXRlZCkgRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIKKwkJIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgIm5vIGxvZyBzeXNsb2cgW0xFVkVMXSIsCisgICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3lzbG9nXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19mYWNpbGl0eSwKKyAgICAgIGNvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAorICAgICAgImxvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIGZhY2lsaXR5IFtGQUNJTElUWV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiUmVzZXQgc3lzbG9nIGZhY2lsaXR5IHRvIGRlZmF1bHQgKGRhZW1vbilcbiIgIlN5c2xvZyBmYWNpbGl0eVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ190cmFwLAorCQkgY29uZmlnX2xvZ190cmFwX2NtZCwKKwkJICJsb2cgdHJhcCAiIExPR19MRVZFTFMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiKERlcHJlY2F0ZWQpIFNldCBsb2dnaW5nIGxldmVsIGFuZCBkZWZhdWx0IGZvciBhbGwgZGVzdGluYXRpb25zXG4iCisJCSBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbmV3X2xldmVsOworCWludCBpOworCisJaWYgKChuZXdfbGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gbmV3X2xldmVsOworCWZvciAoaSA9IDA7IGkgPCBaTE9HX05VTV9ERVNUUzsgaSsrKQorCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gIT0gWkxPR19ESVNBQkxFRCkKKwkJCXpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldID0gbmV3X2xldmVsOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChub19jb25maWdfbG9nX3RyYXAsCisJCSBub19jb25maWdfbG9nX3RyYXBfY21kLAorCQkgIm5vIGxvZyB0cmFwIFtMRVZFTF0iLAorCQkgTk9fU1RSCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiUGVybWl0IGFsbCBsb2dnaW5nIGluZm9ybWF0aW9uXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBMT0dfREVCVUc7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJubyBsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRvIG5vdCBsb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGJhbm5lcl9tb3RkX2ZpbGUsCisgICAgICBiYW5uZXJfbW90ZF9maWxlX2NtZCwKKyAgICAgICJiYW5uZXIgbW90ZCBmaWxlIFtGSUxFXSIsCisgICAgICAiU2V0IGJhbm5lclxuIiAiQmFubmVyIGZvciBtb3RkXG4iICJCYW5uZXIgZnJvbSBhIGZpbGVcbiIgIkZpbGVuYW1lXG4iKQoreworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oYmFubmVyX21vdGRfZGVmYXVsdCwKKyAgICAgIGJhbm5lcl9tb3RkX2RlZmF1bHRfY21kLAorICAgICAgImJhbm5lciBtb3RkIGRlZmF1bHQiLAorICAgICAgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iICJEZWZhdWx0IHN0cmluZ1xuIikKK3sKKwlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19iYW5uZXJfbW90ZCwKKyAgICAgIG5vX2Jhbm5lcl9tb3RkX2NtZCwKKyAgICAgICJubyBiYW5uZXIgbW90ZCIsIE5PX1NUUiAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIpCit7CisJaG9zdC5tb3RkID0gTlVMTDsKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7CisJaG9zdC5tb3RkZmlsZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTZXQgY29uZmlnIGZpbGVuYW1lLiAgQ2FsbGVkIGZyb20gdnR5LmMgKi8KK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWhvc3QuY29uZmlnID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmaWxlbmFtZSk7Cit9CisKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3F1aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfbGlzdF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfdGVybWluYWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9maWxlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfbWVtb3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJnNob3dfcnVubmluZ19jb25maWdfY21kKTsKK30KKworLyogSW5pdGlhbGl6ZSBjb21tYW5kIGludGVyZmFjZS4gSW5zdGFsbCBiYXNpYyBub2RlcyBhbmQgY29tbWFuZHMuICovCit2b2lkIGNtZF9pbml0KGludCB0ZXJtaW5hbCkKK3sKKwkvKiBBbGxvY2F0ZSBpbml0aWFsIHRvcCB2ZWN0b3Igb2YgY29tbWFuZHMuICovCisJY21kdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIERlZmF1bHQgaG9zdCB2YWx1ZSBzZXR0aW5ncy4gKi8KKwlob3N0Lm5hbWUgPSBOVUxMOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCWhvc3QuY29uZmlnID0gTlVMTDsKKwlob3N0LmxpbmVzID0gLTE7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCisJLyogSW5zdGFsbCB0b3Agbm9kZXMuICovCisJaW5zdGFsbF9ub2RlKCZ2aWV3X25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmY29uZmlnX25vZGUsIGNvbmZpZ193cml0ZV9ob3N0KTsKKworCS8qIEVhY2ggbm9kZSdzIGJhc2ljIGNvbW1hbmRzLiAqLworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19saXN0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZXhpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3F1aXRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZW5hYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlY2hvX2NtZCk7CisJfQorCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZGVmYXVsdChFTkFCTEVfTk9ERSk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ19kaXNhYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kKTsKKwl9CisJaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJnNob3dfc3RhcnR1cF9jb25maWdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZWNob19jbWQpOworCisJCWluc3RhbGxfZGVmYXVsdChDT05GSUdfTk9ERSk7CisJfQorCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmaG9zdG5hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19ob3N0bmFtZV9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2VuYWJsZV9wYXNzd29yZF9jbWQpOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKKyNlbmRpZgorCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2ZpbGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fYmFubmVyX21vdGRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKworCX0KKwlzcmFuZCh0aW1lKE5VTEwpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQ3YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3ZlY3Rvci5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKwordm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworLyogSW5pdGlhbGl6ZSB2ZWN0b3IgOiBhbGxvY2F0ZSBtZW1vcnkgYW5kIHJldHVybiB2ZWN0b3IuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpCit7CisJdmVjdG9yIHYgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCF2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBzbG90ICovCisJaWYgKHNpemUgPT0gMCkKKwkJc2l6ZSA9IDE7CisKKwl2LT5hbGxvY2VkID0gc2l6ZTsKKwl2LT5hY3RpdmUgPSAwOworCXYtPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemVvZih2b2lkICopICogc2l6ZSwKKwkJCQkidmVjdG9yX2luaXQ6aW5kZXgiKTsKKwlpZiAoIXYtPmluZGV4KSB7CisJCXRhbGxvY19mcmVlKHYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYpOworfQorCit2b2lkIHZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUodm9pZCAqaW5kZXgpCit7CisJdGFsbG9jX2ZyZWUoaW5kZXgpOworfQorCit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYtPmluZGV4KTsKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXZlY3RvciBuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5hY3RpdmUgPSB2LT5hY3RpdmU7CisJbmV3LT5hbGxvY2VkID0gdi0+YWxsb2NlZDsKKworCXNpemUgPSBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkKTsKKwluZXctPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemUsICJ2ZWN0b3JfY29weTppbmRleCIpOworCWlmICghbmV3LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KG5ldy0+aW5kZXgsIHYtPmluZGV4LCBzaXplKTsKKworCXJldHVybiBuZXc7Cit9CisKKy8qIENoZWNrIGFzc2lnbmVkIGluZGV4LCBhbmQgaWYgaXQgcnVucyBzaG9ydCBkb3VibGUgaW5kZXggcG9pbnRlciAqLwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKQoreworCWlmICh2LT5hbGxvY2VkID4gbnVtKQorCQlyZXR1cm47CisKKwl2LT5pbmRleCA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfdmVjX2N0eCwgdi0+aW5kZXgsCisJCQkJICAgICAgIHNpemVvZih2b2lkICopICogKHYtPmFsbG9jZWQgKiAyKSk7CisJbWVtc2V0KCZ2LT5pbmRleFt2LT5hbGxvY2VkXSwgMCwgc2l6ZW9mKHZvaWQgKikgKiB2LT5hbGxvY2VkKTsKKwl2LT5hbGxvY2VkICo9IDI7CisKKwlpZiAodi0+YWxsb2NlZCA8PSBudW0pCisJCXZlY3Rvcl9lbnN1cmUodiwgbnVtKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgbmV4dCBlbXB0eSBzbG90IGluZGV4LiAgSXQgZG9zZSBub3QgbWVhbgorICAgdGhlIHNsb3QncyBpbmRleCBtZW1vcnkgaXMgYXNzaWduZWQsIHBsZWFzZSBjYWxsIHZlY3Rvcl9lbnN1cmUoKQorICAgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAqLworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHYtPmFjdGl2ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2LT5hY3RpdmU7IGkrKykKKwkJaWYgKHYtPmluZGV4W2ldID09IDApCisJCQlyZXR1cm4gaTsKKworCXJldHVybiBpOworfQorCisvKiBTZXQgdmFsdWUgdG8gdGhlIHNtYWxsZXN0IGVtcHR5IHNsb3QuICovCitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJaSA9IHZlY3Rvcl9lbXB0eV9zbG90KHYpOworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHNwZWNpZmllZCBpbmRleCBzbG90LiAqLworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpCit7CisJdmVjdG9yX2Vuc3VyZSh2LCBpKTsKKworCXYtPmluZGV4W2ldID0gdmFsOworCisJaWYgKHYtPmFjdGl2ZSA8PSBpKQorCQl2LT5hY3RpdmUgPSBpICsgMTsKKworCXJldHVybiBpOworfQorCisvKiBMb29rIHVwIHZlY3Rvci4gICovCit2b2lkICp2ZWN0b3JfbG9va3VwKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hY3RpdmUpCisJCXJldHVybiBOVUxMOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogTG9va3VwIHZlY3RvciwgZW5zdXJlIGl0LiAqLwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisJcmV0dXJuIHYtPmluZGV4W2ldOworfQorCisvKiBVbnNldCB2YWx1ZSBhdCBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hbGxvY2VkKQorCQlyZXR1cm47CisKKwl2LT5pbmRleFtpXSA9IE5VTEw7CisKKwlpZiAoaSArIDEgPT0gdi0+YWN0aXZlKSB7CisJCXYtPmFjdGl2ZS0tOworCQl3aGlsZSAoaSAmJiB2LT5pbmRleFstLWldID09IE5VTEwgJiYgdi0+YWN0aXZlLS0pIDsJLyogSXMgdGhpcyB1Z2x5ID8gKi8KKwl9Cit9CisKKy8qIENvdW50IHRoZSBudW1iZXIgb2Ygbm90IGVtcGx0eSBzbG90LiAqLwordW5zaWduZWQgaW50IHZlY3Rvcl9jb3VudCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSAhPSBOVUxMKQorCQkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92dHkuYyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYwZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jCkBAIC0wLDAgKzEsMTY3OCBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPGFycGEvdGVsbmV0Lmg+CisKKyNpbmNsdWRlICJjYXJkc2hlbGwuaCIKKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKy8qIG91ciBjYWxsYmFjaywgbG9jYXRlZCBpbiB0ZWxuZXRfaW50ZXJmYWNlLmMgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpOworCitleHRlcm4gc3RydWN0IGhvc3QgaG9zdDsKKworLyogVmVjdG9yIHdoaWNoIHN0b3JlIGVhY2ggdnR5IHN0cnVjdHVyZS4gKi8KK3N0YXRpYyB2ZWN0b3IgdnR5dmVjOworCit2ZWN0b3IgVnZ0eV9zZXJ2X3RocmVhZDsKKworY2hhciAqdnR5X2N3ZCA9IE5VTEw7CisKKy8qIENvbmZpZ3VyZSBsb2NrLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnOworCitzdGF0aWMgaW50IG5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworCitzdGF0aWMgdm9pZCB2dHlfY2xlYXJfYnVmKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwltZW1zZXQodnR5LT5idWYsIDAsIHZ0eS0+bWF4KTsKK30KKworLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3QuICovCitzdHJ1Y3QgdnR5ICp2dHlfbmV3KCkKK3sKKwlzdHJ1Y3QgdnR5ICpuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCB2dHkpOworCisJaWYgKCFuZXcpCisJCWdvdG8gb3V0OworCisJbmV3LT5vYnVmID0gYnVmZmVyX25ldygwKTsJLyogVXNlIGRlZmF1bHQgYnVmZmVyIHNpemUuICovCisJaWYgKCFuZXctPm9idWYpCisJCWdvdG8gb3V0X25ldzsKKwluZXctPmJ1ZiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIFZUWV9CVUZTSVosICJ2dHlfbmV3LT5idWYiKTsKKwlpZiAoIW5ldy0+YnVmKQorCQlnb3RvIG91dF9vYnVmOworCisJbmV3LT5tYXggPSBWVFlfQlVGU0laOworCisJcmV0dXJuIG5ldzsKKworb3V0X29idWY6CisJYnVmZmVyX2ZyZWUobmV3LT5vYnVmKTsKK291dF9uZXc6CisJdGFsbG9jX2ZyZWUobmV3KTsKKwluZXcgPSBOVUxMOworb3V0OgorCXJldHVybiBuZXc7Cit9CisKKy8qIEF1dGhlbnRpY2F0aW9uIG9mIHZ0eSAqLworc3RhdGljIHZvaWQgdnR5X2F1dGgoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpidWYpCit7CisJY2hhciAqcGFzc3dkID0gTlVMTDsKKwllbnVtIG5vZGVfdHlwZSBuZXh0X25vZGUgPSAwOworCWludCBmYWlsOworCWNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBBVVRIX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LnBhc3N3b3JkX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZDsKKwkJaWYgKGhvc3QuYWR2YW5jZWQpCisJCQluZXh0X25vZGUgPSBob3N0LmVuYWJsZSA/IFZJRVdfTk9ERSA6IEVOQUJMRV9OT0RFOworCQllbHNlCisJCQluZXh0X25vZGUgPSBWSUVXX05PREU7CisJCWJyZWFrOworCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaWYgKGhvc3QuZW5jcnlwdCkKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5lbmFibGU7CisJCW5leHRfbm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwl9CisKKwlpZiAocGFzc3dkKSB7CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlmYWlsID0gc3RyY21wKGNyeXB0KGJ1ZiwgcGFzc3dkKSwgcGFzc3dkKTsKKwkJZWxzZQorI2VuZGlmCisJCQlmYWlsID0gc3RyY21wKGJ1ZiwgcGFzc3dkKTsKKwl9IGVsc2UKKwkJZmFpbCA9IDE7CisKKwlpZiAoIWZhaWwpIHsKKwkJdnR5LT5mYWlsID0gMDsKKwkJdnR5LT5ub2RlID0gbmV4dF9ub2RlOwkvKiBTdWNjZXNzICEgKi8KKwl9IGVsc2UgeworCQl2dHktPmZhaWwrKzsKKwkJaWYgKHZ0eS0+ZmFpbCA+PSAzKSB7CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgeworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIHBhc3N3b3JkcywgdG9vIG1hbnkgZmFpbHVyZXMhJXMiLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCQl9IGVsc2UgeworCQkJCS8qIEFVVEhfRU5BQkxFX05PREUgKi8KKwkJCQl2dHktPmZhaWwgPSAwOworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIGVuYWJsZSBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogQ2xvc2UgdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2Nsb3NlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKworCWlmICh2dHktPm9idWYpICB7CisJCS8qIEZsdXNoIGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZsdXNoX2FsbCh2dHktPm9idWYsIHZ0eS0+ZmQpOworCisJCS8qIEZyZWUgaW5wdXQgYnVmZmVyLiAqLworCQlidWZmZXJfZnJlZSh2dHktPm9idWYpOworCQl2dHktPm9idWYgPSBOVUxMOworCX0KKworCS8qIEZyZWUgY29tbWFuZCBoaXN0b3J5LiAqLworCWZvciAoaSA9IDA7IGkgPCBWVFlfTUFYSElTVDsgaSsrKQorCQlpZiAodnR5LT5oaXN0W2ldKQorCQkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W2ldKTsKKworCS8qIFVuc2V0IHZlY3Rvci4gKi8KKwl2ZWN0b3JfdW5zZXQodnR5dmVjLCB2dHktPmZkKTsKKworCS8qIENsb3NlIHNvY2tldC4gKi8KKwlpZiAodnR5LT5mZCA+IDApCisJCWNsb3NlKHZ0eS0+ZmQpOworCisJaWYgKHZ0eS0+YnVmKSB7CisJCXRhbGxvY19mcmVlKHZ0eS0+YnVmKTsKKwkJdnR5LT5idWYgPSBOVUxMOworCX0KKworCS8qIENoZWNrIGNvbmZpZ3VyZS4gKi8KKwl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCisJLyogRklYTUU6IG1lbW9yeSBsZWFrLiBXZSBuZWVkIHRvIGNhbGwgdGVsbmV0X2Nsb3NlX2NsaWVudCgpIGJ1dCBkb24ndAorCSAqIGhhdmUgYmZkICovCisJdnR5X2V2ZW50KFZUWV9DTE9TRUQsIHZ0eS0+ZmQsIHZ0eSk7CisKKwkvKiBPSyBmcmVlIHZ0eS4gKi8KKwl0YWxsb2NfZnJlZSh2dHkpOworfQorCitpbnQgdnR5X3NoZWxsKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gdnR5LT50eXBlID09IFZUWV9TSEVMTCA/IDEgOiAwOworfQorCisKKy8qIFZUWSBzdGFuZGFyZCBvdXRwdXQgZnVuY3Rpb24uICovCitpbnQgdnR5X291dChzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc2l6ZSA9IDEwMjQ7CisJY2hhciBidWZbMTAyNF07CisJY2hhciAqcCA9IE5VTEw7CisKKwlpZiAodnR5X3NoZWxsKHZ0eSkpIHsKKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfSBlbHNlIHsKKwkJLyogVHJ5IHRvIHdyaXRlIHRvIGluaXRpYWwgYnVmZmVyLiAgKi8KKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCisJCS8qIEluaXRpYWwgYnVmZmVyIGlzIG5vdCBlbm91Z2guICAqLworCQlpZiAobGVuIDwgMCB8fCBsZW4gPj0gc2l6ZSkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAobGVuID4gLTEpCisJCQkJCXNpemUgPSBsZW4gKyAxOworCQkJCWVsc2UKKwkJCQkJc2l6ZSA9IHNpemUgKiAyOworCisJCQkJcCA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfY3R4LCBwLCBzaXplKTsKKwkJCQlpZiAoIXApCisJCQkJCXJldHVybiAtMTsKKworCQkJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCQkJbGVuID0gdnNucHJpbnRmKHAsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJCQkJdmFfZW5kKGFyZ3MpOworCisJCQkJaWYgKGxlbiA+IC0xICYmIGxlbiA8IHNpemUpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV2hlbiBpbml0aWFsIGJ1ZmZlciBpcyBlbm91Z2ggdG8gc3RvcmUgYWxsIG91dHB1dC4gICovCisJCWlmICghcCkKKwkJCXAgPSBidWY7CisKKwkJLyogUG9pbnRlciBwIG11c3QgcG9pbnQgb3V0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX3B1dCh2dHktPm9idWYsICh1X2NoYXIgKikgcCwgbGVuKTsKKworCQkvKiBJZiBwIGlzIG5vdCBkaWZmZXJlbnQgd2l0aCBidWYsIGl0IGlzIGFsbG9jYXRlZCBidWZmZXIuICAqLworCQlpZiAocCAhPSBidWYpCisJCQl0YWxsb2NfZnJlZShwKTsKKwl9CisKKwl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHktPmZkLCB2dHkpOworCisJcmV0dXJuIGxlbjsKK30KKworaW50IHZ0eV9vdXRfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJY2hhciAqcCA9IHZ0eV9uZXdsaW5lKHZ0eSk7CisJYnVmZmVyX3B1dCh2dHktPm9idWYsIHAsIHN0cmxlbihwKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2dHlfY29uZmlnX2xvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDApIHsKKwkJdnR5LT5jb25maWcgPSAxOworCQl2dHlfY29uZmlnID0gMTsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCitpbnQgdnR5X2NvbmZpZ191bmxvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDEgJiYgdnR5LT5jb25maWcgPT0gMSkgeworCQl2dHktPmNvbmZpZyA9IDA7CisJCXZ0eV9jb25maWcgPSAwOworCX0KKwlyZXR1cm4gdnR5LT5jb25maWc7Cit9CisKKy8qIFNheSBoZWxsbyB0byB2dHkgaW50ZXJmYWNlLiAqLwordm9pZCB2dHlfaGVsbG8oc3RydWN0IHZ0eSAqdnR5KQoreworCWlmIChob3N0Lm1vdGRmaWxlKSB7CisJCUZJTEUgKmY7CisJCWNoYXIgYnVmWzQwOTZdOworCisJCWYgPSBmb3Blbihob3N0Lm1vdGRmaWxlLCAiciIpOworCQlpZiAoZikgeworCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisJCQkJY2hhciAqczsKKwkJCQkvKiB3b3JrIGJhY2t3YXJkcyB0byBpZ25vcmUgdHJhaWxsaW5nIGlzc3BhY2UoKSAqLworCQkJCWZvciAocyA9IGJ1ZiArIHN0cmxlbihidWYpOworCQkJCSAgICAgKHMgPiBidWYpICYmIGlzc3BhY2UoKihzIC0gMSkpOyBzLS0pIDsKKwkJCQkqcyA9ICdcMCc7CisJCQkJdnR5X291dCh2dHksICIlcyVzIiwgYnVmLCBWVFlfTkVXTElORSk7CisJCQl9CisJCQlmY2xvc2UoZik7CisJCX0gZWxzZQorCQkJdnR5X291dCh2dHksICJNT1REIGZpbGUgbm90IGZvdW5kJXMiLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIGlmIChob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAiJXMiLCBob3N0Lm1vdGQpOworfQorCisvKiBQdXQgb3V0IHByb21wdCBhbmQgd2FpdCBpbnB1dCBmcm9tIHVzZXIuICovCitzdGF0aWMgdm9pZCB2dHlfcHJvbXB0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSBuYW1lczsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKworCWlmICh2dHktPnR5cGUgPT0gVlRZX1RFUk0pIHsKKwkJaG9zdG5hbWUgPSBob3N0Lm5hbWU7CisJCWlmICghaG9zdG5hbWUpIHsKKwkJCXVuYW1lKCZuYW1lcyk7CisJCQlob3N0bmFtZSA9IG5hbWVzLm5vZGVuYW1lOworCQl9CisJCXZ0eV9vdXQodnR5LCBjbWRfcHJvbXB0KHZ0eS0+bm9kZSksIGhvc3RuYW1lKTsKKwl9Cit9CisKKy8qIENvbW1hbmQgZXhlY3V0aW9uIG92ZXIgdGhlIHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IHZ0eV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJLyogU3BsaXQgcmVhZGxpbmUgc3RyaW5nIHVwIGludG8gdGhlIHZlY3RvciAqLworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKGJ1Zik7CisKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZCh2bGluZSwgdnR5LCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKQorCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9XQVJOSU5HOgorCQkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfRklMRSkKKwkJCQl2dHlfb3V0KHZ0eSwgIldhcm5pbmcuLi4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIFVua25vd24gY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfSU5DT01QTEVURToKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQ29tbWFuZCBpbmNvbXBsZXRlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCX0KKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X2JhY2t3YXJkX2NoYXIgPSAweDA4Oworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X3NwYWNlX2NoYXIgPSAnICc7CisKKy8qIEJhc2ljIGZ1bmN0aW9uIHRvIHdyaXRlIGJ1ZmZlciB0byB2dHkuICovCitzdGF0aWMgdm9pZCB2dHlfd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMpCit7CisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwkvKiBTaG91bGQgd2UgZG8gYnVmZmVyaW5nIGhlcmUgPyAgQW5kIG1ha2UgdnR5X2ZsdXNoICh2dHkpID8gKi8KKwlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgYnVmLCBuYnl0ZXMpOworfQorCisvKiBFbnN1cmUgbGVuZ3RoIG9mIGlucHV0IGJ1ZmZlci4gIElzIGJ1ZmZlciBpcyBzaG9ydCwgZG91YmxlIGl0LiAqLworc3RhdGljIHZvaWQgdnR5X2Vuc3VyZShzdHJ1Y3QgdnR5ICp2dHksIGludCBsZW5ndGgpCit7CisJaWYgKHZ0eS0+bWF4IDw9IGxlbmd0aCkgeworCQl2dHktPm1heCAqPSAyOworCQl2dHktPmJ1ZiA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfY3R4LCB2dHktPmJ1ZiwgdnR5LT5tYXgpOworCQkvLyBGSVhNRTogY2hlY2sgcmV0dXJuCisJfQorfQorCisvKiBCYXNpYyBmdW5jdGlvbiB0byBpbnNlcnQgY2hhcmFjdGVyIGludG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3NlbGZfaW5zZXJ0KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCWludCBpOworCWludCBsZW5ndGg7CisKKwl2dHlfZW5zdXJlKHZ0eSwgdnR5LT5sZW5ndGggKyAxKTsKKwlsZW5ndGggPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcCArIDFdLCAmdnR5LT5idWZbdnR5LT5jcF0sIGxlbmd0aCk7CisJdnR5LT5idWZbdnR5LT5jcF0gPSBjOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGggKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwl2dHktPmNwKys7CisJdnR5LT5sZW5ndGgrKzsKK30KKworLyogU2VsZiBpbnNlcnQgY2hhcmFjdGVyICdjJyBpbiBvdmVyd3JpdGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGMpCit7CisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJdnR5LT5idWZbdnR5LT5jcCsrXSA9IGM7CisKKwlpZiAodnR5LT5jcCA+IHZ0eS0+bGVuZ3RoKQorCQl2dHktPmxlbmd0aCsrOworCisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwl2dHlfd3JpdGUodnR5LCAmYywgMSk7Cit9CisKKy8qIEluc2VydCBhIHdvcmQgaW50byB2dHkgaW50ZXJmYWNlIHdpdGggb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqc3RyKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwl2dHlfd3JpdGUodnR5LCBzdHIsIGxlbik7CisJc3RyY3B5KCZ2dHktPmJ1Zlt2dHktPmNwXSwgc3RyKTsKKwl2dHktPmNwICs9IGxlbjsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEZvcndhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkgeworCQl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIDEpOworCQl2dHktPmNwKys7CisJfQorfQorCisvKiBCYWNrd2FyZCBjaGFyYWN0ZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPiAwKSB7CisJCXZ0eS0+Y3AtLTsKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKKwl9Cit9CisKKy8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iZWdpbm5pbmdfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3ApCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworfQorCisvKiBBZGQgY3VycmVudCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RfYWRkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkKKwkJcmV0dXJuOworCisJaW5kZXggPSB2dHktPmhpbmRleCA/IHZ0eS0+aGluZGV4IC0gMSA6IFZUWV9NQVhISVNUIC0gMTsKKworCS8qIElnbm9yZSB0aGUgc2FtZSBzdHJpbmcgYXMgcHJldmlvdXMgb25lLiAqLworCWlmICh2dHktPmhpc3RbaW5kZXhdKQorCQlpZiAoc3RyY21wKHZ0eS0+YnVmLCB2dHktPmhpc3RbaW5kZXhdKSA9PSAwKSB7CisJCQl2dHktPmhwID0gdnR5LT5oaW5kZXg7CisJCQlyZXR1cm47CisJCX0KKworCS8qIEluc2VydCBoaXN0b3J5IGVudHJ5LiAqLworCWlmICh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKQorCQl0YWxsb2NfZnJlZSh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKTsKKwl2dHktPmhpc3RbdnR5LT5oaW5kZXhdID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jdHgsIHZ0eS0+YnVmKTsKKworCS8qIEhpc3RvcnkgaW5kZXggcm90YXRpb24uICovCisJdnR5LT5oaW5kZXgrKzsKKwlpZiAodnR5LT5oaW5kZXggPT0gVlRZX01BWEhJU1QpCisJCXZ0eS0+aGluZGV4ID0gMDsKKworCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKK30KKworLyogR2V0IHRlbG5ldCB3aW5kb3cgc2l6ZS4gKi8KK3N0YXRpYyBpbnQKK3Z0eV90ZWxuZXRfb3B0aW9uIChzdHJ1Y3QgdnR5ICp2dHksIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKyNpZmRlZiBURUxORVRfT1BUSU9OX0RFQlVHCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGJ1ZltpXSkKKwl7CisJY2FzZSBJQUM6CisJICB2dHlfb3V0ICh2dHksICJJQUMgIik7CisJICBicmVhazsKKwljYXNlIFdJTEw6CisJICB2dHlfb3V0ICh2dHksICJXSUxMICIpOworCSAgYnJlYWs7CisJY2FzZSBXT05UOgorCSAgdnR5X291dCAodnR5LCAiV09OVCAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE86CisJICB2dHlfb3V0ICh2dHksICJETyAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE9OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIkRPTlQgIik7CisJICBicmVhazsKKwljYXNlIFNCOgorCSAgdnR5X291dCAodnR5LCAiU0IgIik7CisJICBicmVhazsKKwljYXNlIFNFOgorCSAgdnR5X291dCAodnR5LCAiU0UgIik7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9FQ0hPOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX0VDSE8gJXMiLCBWVFlfTkVXTElORSk7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9TR0E6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfU0dBICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfTkFXUzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9OQVdTICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIiV4ICIsIGJ1ZltpXSk7CisJICBicmVhazsKKwl9CisgICAgfQorICB2dHlfb3V0ICh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworI2VuZGlmIC8qIFRFTE5FVF9PUFRJT05fREVCVUcgKi8KKworICBzd2l0Y2ggKGJ1ZlswXSkKKyAgICB7CisgICAgY2FzZSBTQjoKKyAgICAgIHZ0eS0+c2JfbGVuID0gMDsKKyAgICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMTsKKyAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRTogCisgICAgICB7CisJaWYgKCF2dHktPmlhY19zYl9pbl9wcm9ncmVzcykKKwkgIHJldHVybiAwOworCisJaWYgKCh2dHktPnNiX2xlbiA9PSAwKSB8fCAodnR5LT5zYl9idWZbMF0gPT0gJ1wwJykpCisJICB7CisJICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMDsKKwkgICAgcmV0dXJuIDA7CisJICB9CisJc3dpdGNoICh2dHktPnNiX2J1ZlswXSkKKwkgIHsKKwkgIGNhc2UgVEVMT1BUX05BV1M6CisJICAgIGlmICh2dHktPnNiX2xlbiAhPSBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksIlJGQyAxMDczIHZpb2xhdGlvbiBkZXRlY3RlZDogdGVsbmV0IE5BV1Mgb3B0aW9uICIKKwkJCSJzaG91bGQgc2VuZCAlZCBjaGFyYWN0ZXJzLCBidXQgd2UgcmVjZWl2ZWQgJWx1IiwKKwkJCVRFTE5FVF9OQVdTX1NCX0xFTiwgKHVfbG9uZyl2dHktPnNiX2xlbik7CisJICAgIGVsc2UgaWYgKHNpemVvZih2dHktPnNiX2J1ZikgPCBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksICJCdWcgZGV0ZWN0ZWQ6IHNpemVvZih2dHktPnNiX2J1ZikgJWx1IDwgJWQsICIKKwkJICAgICAgICJ0b28gc21hbGwgdG8gaGFuZGxlIHRoZSB0ZWxuZXQgTkFXUyBvcHRpb24iLAorCQkgICAgICAgKHVfbG9uZylzaXplb2YodnR5LT5zYl9idWYpLCBURUxORVRfTkFXU19TQl9MRU4pOworCSAgICBlbHNlCisJICAgICAgeworCQl2dHktPndpZHRoID0gKCh2dHktPnNiX2J1ZlsxXSA8PCA4KXx2dHktPnNiX2J1ZlsyXSk7CisJCXZ0eS0+aGVpZ2h0ID0gKCh2dHktPnNiX2J1ZlszXSA8PCA4KXx2dHktPnNiX2J1Zls0XSk7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworCQl2dHlfb3V0KHZ0eSwgIlRFTE5FVCBOQVdTIHdpbmRvdyBzaXplIG5lZ290aWF0aW9uIGNvbXBsZXRlZDogIgorCQkJICAgICAgIndpZHRoICVkLCBoZWlnaHQgJWQlcyIsCisJCQl2dHktPndpZHRoLCB2dHktPmhlaWdodCwgVlRZX05FV0xJTkUpOworI2VuZGlmCisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwl2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJcmV0dXJuIDA7CisJYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIEV4ZWN1dGUgY3VycmVudCBjb21tYW5kIGxpbmUuICovCitzdGF0aWMgaW50IHZ0eV9leGVjdXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gQ01EX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKwkJdnR5X2F1dGgodnR5LCB2dHktPmJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IHZ0eV9jb21tYW5kKHZ0eSwgdnR5LT5idWYpOworCQlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKQorCQkJdnR5X2hpc3RfYWRkKHZ0eSk7CisJCWJyZWFrOworCX0KKworCS8qIENsZWFyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisKKwlpZiAodnR5LT5zdGF0dXMgIT0gVlRZX0NMT1NFKQorCQl2dHlfcHJvbXB0KHZ0eSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZW5kIFdJTEwgVEVMT1BUX0VDSE8gdG8gcmVtb3RlIHNlcnZlci4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9lY2hvIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfRUNITywgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBzdXBwcmVzcyBHby1BaGVhZCB0ZWxuZXQgb3B0aW9uLiAqLworc3RhdGljIHZvaWQKK3Z0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfU0dBLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBNYWtlIGRvbid0IHVzZSBsaW5lbW9kZSBvdmVyIHRlbG5ldC4gKi8KK3N0YXRpYyB2b2lkCit2dHlfZG9udF9saW5lbW9kZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE9OVCwgVEVMT1BUX0xJTkVNT0RFLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBVc2Ugd2luZG93IHNpemUuICovCitzdGF0aWMgdm9pZAordnR5X2RvX3dpbmRvd19zaXplIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBETywgVEVMT1BUX05BV1MsICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcoc3RydWN0IHZ0eSAqKTsKK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICopOworCisvKiBQcmludCBjb21tYW5kIGxpbmUgaGlzdG9yeS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KKyAgIHZ0eV9uZXh0X2xpbmUgYW5kIHZ0eV9wcmV2aW91c19saW5lLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RvcnlfcHJpbnQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBsZW5ndGg7CisKKwl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7CisKKwkvKiBHZXQgcHJldmlvdXMgbGluZSBmcm9tIGhpc3RvcnkgYnVmZmVyICovCisJbGVuZ3RoID0gc3RybGVuKHZ0eS0+aGlzdFt2dHktPmhwXSk7CisJbWVtY3B5KHZ0eS0+YnVmLCB2dHktPmhpc3RbdnR5LT5ocF0sIGxlbmd0aCk7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gbGVuZ3RoOworCisJLyogUmVkcmF3IGN1cnJlbnQgbGluZSAqLworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBTaG93IG5leHQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfbmV4dF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgdHJ5X2luZGV4OworCisJaWYgKHZ0eS0+aHAgPT0gdnR5LT5oaW5kZXgpCisJCXJldHVybjsKKworCS8qIFRyeSBpcyB0aGVyZSBoaXN0b3J5IGV4aXN0IG9yIG5vdC4gKi8KKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gKFZUWV9NQVhISVNUIC0gMSkpCisJCXRyeV9pbmRleCA9IDA7CisJZWxzZQorCQl0cnlfaW5kZXgrKzsKKworCS8qIElmIHRoZXJlIGlzIG5vdCBoaXN0b3J5IHJldHVybi4gKi8KKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFNob3cgcHJldmlvdXMgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfcHJldmlvdXNfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCXRyeV9pbmRleCA9IHZ0eS0+aHA7CisJaWYgKHRyeV9pbmRleCA9PSAwKQorCQl0cnlfaW5kZXggPSBWVFlfTUFYSElTVCAtIDE7CisJZWxzZQorCQl0cnlfaW5kZXgtLTsKKworCWlmICh2dHktPmhpc3RbdHJ5X2luZGV4XSA9PSBOVUxMKQorCQlyZXR1cm47CisJZWxzZQorCQl2dHktPmhwID0gdHJ5X2luZGV4OworCisJdnR5X2hpc3RvcnlfcHJpbnQodnR5KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWRyYXcgYWxsIG9mIHRoZSBjb21tYW5kIGxpbmUgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X3JlZHJhd19saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfd3JpdGUodnR5LCB2dHktPmJ1ZiwgdnR5LT5sZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aDsKK30KKworLyogRm9yd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSA9PSAnICcpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQmFja3dhcmQgd29yZCB3aXRob3V0IHNraXBwaW5nIHRyYWluaW5nIHNwYWNlLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3B1cmVfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogV2hlbiAnXkQnIGlzIHR5cGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgd2UgbW92ZSB0byB0aGUgZG93bgorICAgbGV2ZWwuICovCitzdGF0aWMgdm9pZCB2dHlfZG93bl9sZXZlbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkoKmNvbmZpZ19leGl0X2NtZC5mdW5jKSAoTlVMTCwgdnR5LCAwLCBOVUxMKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIFdoZW4gJ15aJyBpcyByZWNlaXZlZCBmcm9tIHZ0eSwgbW92ZSBkb3duIHRvIHRoZSBlbmFibGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfY29uZmlnKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJjdGVyIGF0IHRoZSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQlyZXR1cm47CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkgeworCQl2dHlfZG93bl9sZXZlbCh2dHkpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpCisJCXJldHVybjsJCS8qIGNvbXBsZXRpb24gbmVlZCBoZXJlPyAqLworCisJc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKworCXZ0eS0+bGVuZ3RoLS07CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcF0sICZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sIHNpemUgLSAxKTsKKwl2dHktPmJ1Zlt2dHktPmxlbmd0aF0gPSAnXDAnOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzaXplIC0gMSk7CisJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA9PSAwKQorCQlyZXR1cm47CisKKwl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBLaWxsIHJlc3Qgb2YgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwltZW1zZXQoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAwLCBzaXplKTsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEtpbGwgbGluZSBmcm9tIHRoZSBiZWdpbm5pbmcuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwl2dHlfa2lsbF9saW5lKHZ0eSk7Cit9CisKKy8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBUcmFuc3Bvc2UgY2hhcnMgYmVmb3JlIG9yIGF0IHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV90cmFuc3Bvc2VfY2hhcnMoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgYzEsIGMyOworCisJLyogSWYgbGVuZ3RoIGlzIHNob3J0IG9yIHBvaW50IGlzIG5lYXIgYnkgdGhlIGJlZ2lubmluZyBvZiBsaW5lIHRoZW4KKwkgICByZXR1cm4uICovCisJaWYgKHZ0eS0+bGVuZ3RoIDwgMiB8fCB2dHktPmNwIDwgMSkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiBwb2ludCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDJdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfSBlbHNlIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwXTsKKwkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKKwl9Cit9CisKKy8qIERvIGNvbXBsZXRpb24gYXQgdnR5IGludGVyZmFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWNoYXIgKiptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgdmxpbmU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCWlmICh2bGluZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBJbiBjYXNlIG9mICdoZWxwIFx0Jy4gKi8KKwlpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCW1hdGNoZWQgPSBjbWRfY29tcGxldGVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkvKiB2dHlfb3V0ICh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7ICovCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl2dHlfc2VsZl9pbnNlcnQodnR5LCAnICcpOworCQkvL3RhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9NQVRDSDoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJdnR5X2JhY2t3YXJkX3B1cmVfd29yZCh2dHkpOworCQl2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHZ0eSwgbWF0Y2hlZFswXSk7CisJCXRhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQl2ZWN0b3Jfb25seV9pbmRleF9mcmVlKG1hdGNoZWQpOworCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0g6CisJCWZvciAoaSA9IDA7IG1hdGNoZWRbaV0gIT0gTlVMTDsgaSsrKSB7CisJCQlpZiAoaSAhPSAwICYmICgoaSAlIDYpID09IDApKQorCQkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiUtMTBzICIsIG1hdGNoZWRbaV0pOworCQkJdGFsbG9jX2ZyZWUobWF0Y2hlZFtpXSk7CisJCX0KKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9USElOR19UT0RPOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaWYgKG1hdGNoZWQpCisJCXZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUobWF0Y2hlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit2dHlfZGVzY3JpYmVfZm9sZChzdHJ1Y3QgdnR5ICp2dHksIGludCBjbWRfd2lkdGgsCisJCSAgdW5zaWduZWQgaW50IGRlc2Nfd2lkdGgsIHN0cnVjdCBkZXNjICpkZXNjKQoreworCWNoYXIgKmJ1ZjsKKwljb25zdCBjaGFyICpjbWQsICpwOworCWludCBwb3M7CisKKwljbWQgPSBkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZDsKKworCWlmIChkZXNjX3dpZHRoIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgZGVzYy0+c3RyLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm47CisJfQorCisJYnVmID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGRlc2MtPnN0cikgKyAxLCAiZGVzY3JpYmVfZm9sZCIpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBkZXNjLT5zdHI7IHN0cmxlbihwKSA+IGRlc2Nfd2lkdGg7IHAgKz0gcG9zICsgMSkgeworCQlmb3IgKHBvcyA9IGRlc2Nfd2lkdGg7IHBvcyA+IDA7IHBvcy0tKQorCQkJaWYgKCoocCArIHBvcykgPT0gJyAnKQorCQkJCWJyZWFrOworCisJCWlmIChwb3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXN0cm5jcHkoYnVmLCBwLCBwb3MpOworCQlidWZbcG9zXSA9ICdcMCc7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGJ1ZiwgVlRZX05FV0xJTkUpOworCisJCWNtZCA9ICIiOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIHAsIFZUWV9ORVdMSU5FKTsKKworCXRhbGxvY19mcmVlKGJ1Zik7Cit9CisKKy8qIERlc2NyaWJlIG1hdGNoZWQgY29tbWFuZCBmdW5jdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZXNjcmliZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKwl2ZWN0b3IgZGVzY3JpYmU7CisJdW5zaWduZWQgaW50IGksIHdpZHRoLCBkZXNjX3dpZHRoOworCXN0cnVjdCBkZXNjICpkZXNjLCAqZGVzY19jciA9IE5VTEw7CisKKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7CisKKwkvKiBJbiBjYXNlIG9mICc+ID8nLiAqLworCWlmICh2bGluZSA9PSBOVUxMKSB7CisJCXZsaW5lID0gdmVjdG9yX2luaXQoMSk7CisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCX0gZWxzZSBpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCWRlc2NyaWJlID0gY21kX2Rlc2NyaWJlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJLyogQW1iaWd1b3VzIGVycm9yLiAqLworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlyZXR1cm47CisJCWJyZWFrOworCX0KKworCS8qIEdldCB3aWR0aCBvZiBjb21tYW5kIHN0cmluZy4gKi8KKwl3aWR0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgaW50IGxlbjsKKworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSBzdHJsZW4oZGVzYy0+Y21kKTsKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJy4nKQorCQkJCWxlbi0tOworCisJCQlpZiAod2lkdGggPCBsZW4pCisJCQkJd2lkdGggPSBsZW47CisJCX0KKworCS8qIEdldCB3aWR0aCBvZiBkZXNjcmlwdGlvbiBzdHJpbmcuICovCisJZGVzY193aWR0aCA9IHZ0eS0+d2lkdGggLSAod2lkdGggKyA2KTsKKworCS8qIFByaW50IG91dCBkZXNjcmlwdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCAiPGNyPiIpID09IDApIHsKKwkJCQlkZXNjX2NyID0gZGVzYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFkZXNjLT5zdHIpCisJCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOworCisjaWYgMAorCQkJdnR5X291dCh2dHksICIgICUtKnMgJXMlcyIsIHdpZHRoCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJZGVzYy0+c3RyID8gZGVzYy0+c3RyIDogIiIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgkJCQkvKiAwICovCisJCX0KKworCWlmICgoZGVzYyA9IGRlc2NfY3IpKSB7CisJCWlmICghZGVzYy0+c3RyKQorCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQllbHNlCisJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKwl9CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCXZlY3Rvcl9mcmVlKGRlc2NyaWJlKTsKKworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogXkMgc3RvcCBjdXJyZW50IGlucHV0IGFuZCBkbyBub3QgYWRkIGNvbW1hbmQgbGluZSB0byB0aGUgaGlzdG9yeS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zdG9wX2lucHV0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHktPmNwID0gdnR5LT5sZW5ndGggPSAwOworCXZ0eV9jbGVhcl9idWYodnR5KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisJdnR5X3Byb21wdCh2dHkpOworCisJLyogU2V0IGhpc3RvcnkgcG9pbnRlciB0byB0aGUgbGF0ZXN0IG9uZS4gKi8KKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKyNkZWZpbmUgQ09OVFJPTChYKSAgKChYKSAtICdAJykKKyNkZWZpbmUgVlRZX05PUk1BTCAgICAgMAorI2RlZmluZSBWVFlfUFJFX0VTQ0FQRSAxCisjZGVmaW5lIFZUWV9FU0NBUEUgICAgIDIKKworLyogRXNjYXBlIGNoYXJhY3RlciBjb21tYW5kIG1hcC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lc2NhcGVfbWFwKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN3aXRjaCAoYykgeworCWNhc2UgKCdBJyk6CisJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdCJyk6CisJCXZ0eV9uZXh0X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0MnKToKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwljYXNlICgnRCcpOgorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlLiAqLworCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKK30KKworLyogUXVpdCBwcmludCBvdXQgdG8gdGhlIGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9idWZmZXJfcmVzZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogUmVhZCBkYXRhIHZpYSB2dHkgc29ja2V0LiAqLworaW50IHZ0eV9yZWFkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgbmJ5dGVzOworCXVuc2lnbmVkIGNoYXIgYnVmW1ZUWV9SRUFEX0JVRlNJWl07CisKKwlpbnQgdnR5X3NvY2sgPSB2dHktPmZkOworCisJLyogUmVhZCByYXcgZGF0YSBmcm9tIHNvY2tldCAqLworCWlmICgobmJ5dGVzID0gcmVhZCh2dHktPmZkLCBidWYsIFZUWV9SRUFEX0JVRlNJWikpIDw9IDApIHsKKwkJaWYgKG5ieXRlcyA8IDApIHsKKwkJCWlmIChFUlJOT19JT19SRVRSWShlcnJubykpIHsKKwkJCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspIHsKKwkJaWYgKGJ1ZltpXSA9PSBJQUMpIHsKKwkJCWlmICghdnR5LT5pYWMpIHsKKwkJCQl2dHktPmlhYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXZ0eS0+aWFjID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICh2dHktPmlhY19zYl9pbl9wcm9ncmVzcyAmJiAhdnR5LT5pYWMpIHsKKwkJCWlmICh2dHktPnNiX2xlbiA8IHNpemVvZih2dHktPnNiX2J1ZikpCisJCQkJdnR5LT5zYl9idWZbdnR5LT5zYl9sZW5dID0gYnVmW2ldOworCQkJdnR5LT5zYl9sZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aWFjKSB7CisJCQkvKiBJbiBjYXNlIG9mIHRlbG5ldCBjb21tYW5kICovCisJCQlpbnQgcmV0ID0gMDsKKwkJCXJldCA9IHZ0eV90ZWxuZXRfb3B0aW9uKHZ0eSwgYnVmICsgaSwgbmJ5dGVzIC0gaSk7CisJCQl2dHktPmlhYyA9IDA7CisJCQlpICs9IHJldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9NT1JFKSB7CisJCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQljYXNlICdxJzoKKwkJCWNhc2UgJ1EnOgorCQkJCXZ0eV9idWZmZXJfcmVzZXQodnR5KTsKKwkJCQlicmVhazsKKyNpZiAwCQkJCS8qIE1vcmUgbGluZSBkb2VzIG5vdCB3b3JrIGZvciAic2hvdyBpcCBiZ3AiLiAgKi8KKwkJCWNhc2UgJ1xuJzoKKwkJCWNhc2UgJ1xyJzoKKwkJCQl2dHktPnN0YXR1cyA9IFZUWV9NT1JFTElORTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRXNjYXBlIGNoYXJhY3Rlci4gKi8KKwkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9FU0NBUEUpIHsKKwkJCXZ0eV9lc2NhcGVfbWFwKGJ1ZltpXSwgdnR5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJlLWVzY2FwZSBzdGF0dXMuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfUFJFX0VTQ0FQRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgJ1snOgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCXZ0eV9iYWNrd2FyZF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnZic6CisJCQkJdnR5X2ZvcndhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgorCQkJCXZ0eV9mb3J3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ09OVFJPTCgnSCcpOgorCQkJY2FzZSAweDdmOgorCQkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChidWZbaV0pIHsKKwkJY2FzZSBDT05UUk9MKCdBJyk6CisJCQl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0InKToKKwkJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQl2dHlfc3RvcF9pbnB1dCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRCcpOgorCQkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdFJyk6CisJCQl2dHlfZW5kX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0YnKToKKwkJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0gnKToKKwkJY2FzZSAweDdmOgorCQkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdLJyk6CisJCQl2dHlfa2lsbF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdOJyk6CisJCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdQJyk6CisJCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVCcpOgorCQkJdnR5X3RyYW5zcG9zZV9jaGFycyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVScpOgorCQkJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVycpOgorCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnWicpOgorCQkJdnR5X2VuZF9jb25maWcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfZXhlY3V0ZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1x0JzoKKwkJCXZ0eV9jb21wbGV0ZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERQorCQkJICAgIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQllbHNlCisJCQkJdnR5X2Rlc2NyaWJlX2NvbW1hbmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcMDMzJzoKKwkJCWlmIChpICsgMSA8IG5ieXRlcyAmJiBidWZbaSArIDFdID09ICdbJykgeworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlpKys7CisJCQl9IGVsc2UKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9QUkVfRVNDQVBFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoYnVmW2ldID4gMzEgJiYgYnVmW2ldIDwgMTI3KQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENoZWNrIHN0YXR1cy4gKi8KKwlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX0NMT1NFKQorCQl2dHlfY2xvc2UodnR5KTsKKwllbHNlIHsKKwkJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZWFkIHVwIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworc3RhdGljIGludAordnR5X3JlYWRfZmlsZShGSUxFICpjb25mcCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2dHkgKnZ0eTsKKworCXZ0eSA9IHZ0eV9uZXcoKTsKKwl2dHktPmZkID0gMDsKKwl2dHktPnR5cGUgPSBWVFlfRklMRTsKKwl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKworCXJldCA9IGNvbmZpZ19mcm9tX2ZpbGUodnR5LCBjb25mcCk7CisKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFtYmlndW91cyBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBpcyBubyBzdWNoIGNvbW1hbmQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHJlYWRpbmcgYmVsb3cgIgorCQkJImxpbmU6XG4lc1xuIiwgdnR5LT5idWYpOworCQl2dHlfY2xvc2UodnR5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdnR5X2Nsb3NlKHZ0eSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBuZXcgdnR5IHN0cnVjdHVyZS4gKi8KK3N0cnVjdCB2dHkgKgordnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KQoreworICBzdHJ1Y3QgdnR5ICp2dHk7CisKKwlzdHJ1Y3QgdGVybWlvcyB0OworCisJdGNnZXRhdHRyKHZ0eV9zb2NrLCAmdCk7CisJY2ZtYWtlcmF3KCZ0KTsKKwl0Y3NldGF0dHIodnR5X3NvY2ssIFRDU0FOT1csICZ0KTsKKworICAvKiBBbGxvY2F0ZSBuZXcgdnR5IHN0cnVjdHVyZSBhbmQgc2V0IHVwIGRlZmF1bHQgdmFsdWVzLiAqLworICB2dHkgPSB2dHlfbmV3ICgpOworICB2dHktPmZkID0gdnR5X3NvY2s7CisgIHZ0eS0+cHJpdiA9IHByaXY7CisgIHZ0eS0+dHlwZSA9IFZUWV9URVJNOworICBpZiAobm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgaWYgKGhvc3QuYWR2YW5jZWQpCisJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisgICAgICBlbHNlCisJdnR5LT5ub2RlID0gVklFV19OT0RFOworICAgIH0KKyAgZWxzZQorICAgIHZ0eS0+bm9kZSA9IEFVVEhfTk9ERTsKKyAgdnR5LT5mYWlsID0gMDsKKyAgdnR5LT5jcCA9IDA7CisgIHZ0eV9jbGVhcl9idWYgKHZ0eSk7CisgIHZ0eS0+bGVuZ3RoID0gMDsKKyAgbWVtc2V0ICh2dHktPmhpc3QsIDAsIHNpemVvZiAodnR5LT5oaXN0KSk7CisgIHZ0eS0+aHAgPSAwOworICB2dHktPmhpbmRleCA9IDA7CisgIHZlY3Rvcl9zZXRfaW5kZXggKHZ0eXZlYywgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eS0+c3RhdHVzID0gVlRZX05PUk1BTDsKKyAgaWYgKGhvc3QubGluZXMgPj0gMCkKKyAgICB2dHktPmxpbmVzID0gaG9zdC5saW5lczsKKyAgZWxzZQorICAgIHZ0eS0+bGluZXMgPSAtMTsKKworICBpZiAoISBub19wYXNzd29yZF9jaGVjaykKKyAgICB7CisgICAgICAvKiBWdHkgaXMgbm90IGF2YWlsYWJsZSBpZiBwYXNzd29yZCBpc24ndCBzZXQuICovCisgICAgICBpZiAoaG9zdC5wYXNzd29yZCA9PSBOVUxMICYmIGhvc3QucGFzc3dvcmRfZW5jcnlwdCA9PSBOVUxMKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIlZ0eSBwYXNzd29yZCBpcyBub3Qgc2V0LiVzIiwgVlRZX05FV0xJTkUpOworCSAgdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJICB2dHlfY2xvc2UgKHZ0eSk7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgIC8qIFNheSBoZWxsbyB0byB0aGUgd29ybGQuICovCisgIHZ0eV9oZWxsbyAodnR5KTsKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgdnR5X291dCAodnR5LCAiJXNVc2VyIEFjY2VzcyBWZXJpZmljYXRpb24lcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSk7CisKKyAgLyogU2V0dGluZyB1cCB0ZXJtaW5hbC4gKi8KKyAgdnR5X3dpbGxfZWNobyAodnR5KTsKKyAgdnR5X3dpbGxfc3VwcHJlc3NfZ29fYWhlYWQgKHZ0eSk7CisKKyAgdnR5X2RvbnRfbGluZW1vZGUgKHZ0eSk7CisgIHZ0eV9kb193aW5kb3dfc2l6ZSAodnR5KTsKKyAgLyogdnR5X2RvbnRfbGZsb3dfYWhlYWQgKHZ0eSk7ICovCisKKyAgdnR5X3Byb21wdCAodnR5KTsKKworICAvKiBBZGQgcmVhZC93cml0ZSB0aHJlYWQuICovCisgIHZ0eV9ldmVudCAoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKKyAgdnR5X2V2ZW50IChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisKKyAgcmV0dXJuIHZ0eTsKK30KKworREVGVU4oY29uZmlnX3dobywgY29uZmlnX3dob19jbWQsICJ3aG8iLCAiRGlzcGxheSB3aG8gaXMgb24gdnR5XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodiA9IHZlY3Rvcl9zbG90KHZ0eXZlYywgaSkpICE9IE5VTEwpCisJCQl2dHlfb3V0KHZ0eSwgIiVzdnR5WyVkXSAlcyIsCisJCQkJdi0+Y29uZmlnID8gIioiIDogIiAiLCBpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBNb3ZlIHRvIHZ0eSBjb25maWd1cmF0aW9uIG1vZGUuICovCitERUZVTihsaW5lX3Z0eSwKKyAgICAgIGxpbmVfdnR5X2NtZCwKKyAgICAgICJsaW5lIHZ0eSIsICJDb25maWd1cmUgYSB0ZXJtaW5hbCBsaW5lXG4iICJWaXJ0dWFsIHRlcm1pbmFsXG4iKQoreworCXZ0eS0+bm9kZSA9IFZUWV9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdnR5IGxvZ2luLiAqLworREVGVU4odnR5X2xvZ2luLCB2dHlfbG9naW5fY21kLCAibG9naW4iLCAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3Z0eV9sb2dpbiwKKyAgICAgIG5vX3Z0eV9sb2dpbl9jbWQsICJubyBsb2dpbiIsIE5PX1NUUiAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgInNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgYWR2YW5jZWQgbW9kZSB2dHkgaW50ZXJmYWNlXG4iKQoreworCWhvc3QuYWR2YW5jZWQgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV9hZHZhbmNlZF92dHksCisgICAgICBub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQsCisgICAgICAibm8gc2VydmljZSBhZHZhbmNlZC12dHkiLAorICAgICAgTk9fU1RSCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4odGVybWluYWxfbm9fbW9uaXRvciwKKyAgICAgIHRlcm1pbmFsX25vX21vbml0b3JfY21kLAorICAgICAgInRlcm1pbmFsIG5vIG1vbml0b3IiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19oaXN0b3J5LAorICAgICAgc2hvd19oaXN0b3J5X2NtZCwKKyAgICAgICJzaG93IGhpc3RvcnkiLCBTSE9XX1NUUiAiRGlzcGxheSB0aGUgc2Vzc2lvbiBjb21tYW5kIGhpc3RvcnlcbiIpCit7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IHZ0eS0+aGluZGV4ICsgMTsgaW5kZXggIT0gdnR5LT5oaW5kZXg7KSB7CisJCWlmIChpbmRleCA9PSBWVFlfTUFYSElTVCkgeworCQkJaW5kZXggPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5oaXN0W2luZGV4XSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIgICVzJXMiLCB2dHktPmhpc3RbaW5kZXhdLCBWVFlfTkVXTElORSk7CisKKwkJaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc3BsYXkgY3VycmVudCBjb25maWd1cmF0aW9uLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgImxpbmUgdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwkvKiBsb2dpbiAqLworCWlmIChub19wYXNzd29yZF9jaGVjaykKKwkJdnR5X291dCh2dHksICIgbm8gbG9naW4lcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdHJ1Y3QgY21kX25vZGUgdnR5X25vZGUgPSB7CisJVlRZX05PREUsCisJIiVzKGNvbmZpZy1saW5lKSMgIiwKKwkxLAorfTsKKworLyogUmVzZXQgYWxsIFZUWSBzdGF0dXMuICovCit2b2lkIHZ0eV9yZXNldCgpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZ0eSAqdnR5OworCXN0cnVjdCB0aHJlYWQgKnZ0eV9zZXJ2X3RocmVhZDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZ0eXZlYyk7IGkrKykKKwkJaWYgKCh2dHkgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJdnR5X2Nsb3NlKHZ0eSk7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKFZ2dHlfc2Vydl90aHJlYWQpOyBpKyspCisJCWlmICgodnR5X3NlcnZfdGhyZWFkID0KKwkJICAgICB2ZWN0b3Jfc2xvdChWdnR5X3NlcnZfdGhyZWFkLCBpKSkgIT0gTlVMTCkgeworCQkJLy90aHJlYWRfY2FuY2VsICh2dHlfc2Vydl90aHJlYWQpOworCQkJdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkgPSBOVUxMOworCQkJY2xvc2UoaSk7CisJCX0KK30KKworc3RhdGljIHZvaWQgdnR5X3NhdmVfY3dkKHZvaWQpCit7CisJY2hhciBjd2RbTUFYUEFUSExFTl07CisJY2hhciAqYyA7CisKKwljID0gZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTik7CisKKwlpZiAoIWMpIHsKKwkJaWYgKGNoZGlyKFNZU0NPTkZESVIpICE9IDApCisJCSAgICBwZXJyb3IoImNoZGlyIGZhaWxlZCIpOworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkKKwkJICAgIHBlcnJvcigiZ2V0Y3dkIGZhaWxlZCIpOworCX0KKworCXZ0eV9jd2QgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJsZW4oY3dkKSArIDEsICJzYXZlX2N3ZCIpOworCXN0cmNweSh2dHlfY3dkLCBjd2QpOworfQorCitjaGFyICp2dHlfZ2V0X2N3ZCgpCit7CisJcmV0dXJuIHZ0eV9jd2Q7Cit9CisKK2ludCB2dHlfc2hlbGxfc2VydihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSViA/IDEgOiAwOworfQorCit2b2lkIHZ0eV9pbml0X3Z0eXNoKCkKK3sKKwl2dHl2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworfQorCitleHRlcm4gdm9pZCAqdGFsbF9ic2NfY3R4OworLyogSW5zdGFsbCB2dHkncyBvd24gY29tbWFuZHMgbGlrZSBgd2hvJyBjb21tYW5kLiAqLwordm9pZCB2dHlfaW5pdCgpCit7CisJdGFsbF92dHlfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJ2dHkiKTsKKwl0YWxsX3Z0eV92ZWNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV92ZWN0b3IiKTsKKwl0YWxsX3Z0eV9jbWRfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV9jb21tYW5kIik7CisKKwkvKiBGb3IgZnVydGhlciBjb25maWd1cmF0aW9uIHJlYWQsIHByZXNlcnZlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLworCXZ0eV9zYXZlX2N3ZCgpOworCisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIEluc3RhbGwgYmdwIHRvcCBub2RlLiAqLworCWluc3RhbGxfbm9kZSgmdnR5X25vZGUsIHZ0eV9jb25maWdfd3JpdGUpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3dob19jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmxpbmVfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX21vbml0b3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisKKwlpbnN0YWxsX2RlZmF1bHQoVlRZX05PREUpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJnZ0eV9sb2dpbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJm5vX3Z0eV9sb2dpbl9jbWQpOworfQorCitpbnQgdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworCUZJTEUgKmNmaWxlOworCWludCByYzsKKworCWNmaWxlID0gZm9wZW4oZmlsZV9uYW1lLCAiciIpOworCWlmICghY2ZpbGUpCisJCXJldHVybiAtRU5PRU5UOworCisJcmMgPSB2dHlfcmVhZF9maWxlKGNmaWxlKTsKKwlmY2xvc2UoY2ZpbGUpOworCisJaG9zdF9jb25maWdfc2V0KGZpbGVfbmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5NDg2OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIwNTEgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdHJ1Y3QgY21kX25vZGUgbmV0X25vZGUgPSB7CisJR1NNTkVUX05PREUsCisJIiVzKG5ldHdvcmspIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBidHNfbm9kZSA9IHsKKwlCVFNfTk9ERSwKKwkiJXMoYnRzKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdHJ4X25vZGUgPSB7CisJVFJYX05PREUsCisJIiVzKHRyeCkjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRzX25vZGUgPSB7CisJVFNfTk9ERSwKKwkiJXModHMpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBuZXRfZHVtcF9ubXN0YXRlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1zKQoreworCXZ0eV9vdXQodnR5LCJPcGVyICclcycsIEFkbWluICV1LCBBdmFpbCAnJXMnJXMiLAorCQlubV9vcHN0YXRlX25hbWUobm1zLT5vcGVyYXRpb25hbCksIG5tcy0+YWRtaW5pc3RyYXRpdmUsCisJCW5tX2F2YWlsX25hbWUobm1zLT5hdmFpbGFiaWxpdHkpLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcGNoYW5fbG9hZF92dHkoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpwcmVmaXgsCisJCQkJY29uc3Qgc3RydWN0IHBjaGFuX2xvYWQgKnBsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGwtPnBjaGFuKTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsb2FkX2NvdW50ZXIgKmxjID0gJnBsLT5wY2hhbltpXTsKKwkJdW5zaWduZWQgaW50IHBlcmNlbnQ7CisKKwkJaWYgKGxjLT50b3RhbCA9PSAwKQorCQkJY29udGludWU7CisKKwkJcGVyY2VudCA9IChsYy0+dXNlZCAqIDEwMCkgLyBsYy0+dG90YWw7CisKKwkJdnR5X291dCh2dHksICIlcyUyMHM6ICUzdSUlICgldS8ldSklcyIsIHByZWZpeCwKKwkJCWdzbV9wY2hhbl9uYW1lKGkpLCBwZXJjZW50LCBsYy0+dXNlZCwgbGMtPnRvdGFsLAorCQkJVlRZX05FV0xJTkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IHBjaGFuX2xvYWQgcGw7CisKKwl2dHlfb3V0KHZ0eSwgIkJTQyBpcyBvbiBDb3VudHJ5IENvZGUgJXUsIE5ldHdvcmsgQ29kZSAldSAiCisJCSJhbmQgaGFzICV1IEJUUyVzIiwgbmV0LT5jb3VudHJ5X2NvZGUsIG5ldC0+bmV0d29ya19jb2RlLAorCQluZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTG9uZyBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFNob3J0IG5ldHdvcmsgbmFtZTogJyVzJyVzIiwKKwkJbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEF1dGhlbnRpY2F0aW9uIHBvbGljeTogJXMlcyIsCisJCWdzbV9hdXRoX3BvbGljeV9uYW1lKG5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZTogJXUlcyIsCisJCW5ldC0+cmVqZWN0X2NhdXNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEVuY3J5cHRpb246IEE1LyV1JXMiLCBuZXQtPmE1X2VuY3J5cHRpb24sCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTkVDSSAoVENIL0gpOiAldSVzIiwgbmV0LT5uZWNpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFJSTFAgTW9kZTogJXMlcyIsIHJybHBfbW9kZV9uYW1lKG5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBNTSBJbmZvOiAlcyVzIiwgbmV0LT5zZW5kX21tX2luZm8gPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgSGFuZG92ZXI6ICVzJXMiLCBuZXQtPmhhbmRvdmVyLmFjdGl2ZSA/ICJPbiIgOiAiT2ZmIiwKKwkJVlRZX05FV0xJTkUpOworCW5ldHdvcmtfY2hhbl9sb2FkKCZwbCwgbmV0KTsKKwl2dHlfb3V0KHZ0eSwgIiAgQ3VycmVudCBDaGFubmVsIExvYWQ6JXMiLCBWVFlfTkVXTElORSk7CisJZHVtcF9wY2hhbl9sb2FkX3Z0eSh2dHksICIgICAgIiwgJnBsKTsKK30KKworREVGVU4oc2hvd19uZXQsIHNob3dfbmV0X2NtZCwgInNob3cgbmV0d29yayIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBHU00gTkVUV09SS1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwluZXRfZHVtcF92dHkodnR5LCBuZXQpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWlzbF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmUxbCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmICghZTFsKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgTm9uZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm47CisJfQorCisJbGluZSA9IGUxbC0+dHMtPmxpbmU7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBFMSBMaW5lICV1LCBUeXBlICVzOiBUaW1lc2xvdCAldSwgTW9kZSAlcyVzIiwKKwkJbGluZS0+bnVtLCBsaW5lLT5kcml2ZXItPm5hbWUsIGUxbC0+dHMtPm51bSwKKwkJZTFpbnBfc2lnbnR5cGVfbmFtZShlMWwtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICAgRTEgVEVJICV1LCBTQVBJICV1JXMiLAorCQllMWwtPnRlaSwgZTFsLT5zYXBpLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IHBjaGFuX2xvYWQgcGw7CisKKwl2dHlfb3V0KHZ0eSwgIkJUUyAldSBpcyBvZiAlcyB0eXBlIGluIGJhbmQgJXMsIGhhcyBDSSAldSBMQUMgJXUsICIKKwkJIkJTSUMgJXUsIFRTQyAldSBhbmQgJXUgVFJYJXMiLAorCQlidHMtPm5yLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBnc21fYmFuZF9uYW1lKGJ0cy0+YmFuZCksCisJCWJ0cy0+Y2VsbF9pZGVudGl0eSwKKwkJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsIGJ0cy0+YnNpYywgYnRzLT50c2MsIAorCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1TIE1heCBwb3dlcjogJXUgZEJtJXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTWluaW11bSBSeCBMZXZlbCBmb3IgQWNjZXNzOiAlaSBkQm0lcyIsCisJCXJ4bGV2MmRibShidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNlbGwgUmVzZWxlY3Rpb24gSHlzdGVyZXNpczogJXUgZEJtJXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJBQ0ggVFgtSW50ZWdlcjogJXUlcyIsIGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIE1heCB0cmFuc21pc3Npb25zOiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCXZ0eV9vdXQodnR5LCAiICBDRUxMIElTIEJBUlJFRCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJdnR5X291dCh2dHksICIgIFVuaXQgSUQ6ICV1LyV1LzAsIE9NTCBTdHJlYW0gSUQgMHglMDJ4JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLAorCQkJYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJmJ0cy0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBTaXRlIE1nciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUGFnaW5nOiBGSVhNRSBwZW5kaW5nIHJlcXVlc3RzLCAldSBmcmVlIHNsb3RzJXMiLAorCQlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgYnRzLT5vbWxfbGluayk7CisJfQorCS8qIEZJWE1FOiBvbWxfbGluaywgY2hhbl9kZXNjICovCisJbWVtc2V0KCZwbCwgMCwgc2l6ZW9mKHBsKSk7CisJYnRzX2NoYW5fbG9hZCgmcGwsIGJ0cyk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfYnRzLCBzaG93X2J0c19jbWQsICJzaG93IGJ0cyBbbnVtYmVyXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBCVFNcbiIKKwkJIkJUUyBudW1iZXIiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyAhPSAwKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHNfZHVtcF92dHkodnR5LCBnc21fYnRzX251bShuZXQsIGJ0c19ucikpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCS8qIHByaW50IGFsbCBCVFMncyAqLworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykKKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2UxX2xpbmsoc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLCBjb25zdCBjaGFyICpsaW5lLAorCQkJICBjb25zdCBjaGFyICp0cywgY29uc3QgY2hhciAqc3MpCit7CisJZTFfbGluay0+ZTFfbnIgPSBhdG9pKGxpbmUpOworCWUxX2xpbmstPmUxX3RzID0gYXRvaSh0cyk7CisJaWYgKCFzdHJjbXAoc3MsICJmdWxsIikpCisJCWUxX2xpbmstPmUxX3RzX3NzID0gMjU1OworCWVsc2UKKwkJZTFfbGluay0+ZTFfdHNfc3MgPSBhdG9pKHNzKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2UxX2xpbmsoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmssCisJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm47CisKKwlpZiAoZTFfbGluay0+ZTFfdHNfc3MgPT0gMjU1KQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCBmdWxsJXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsIFZUWV9ORVdMSU5FKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAiJXNlMSBsaW5lICV1IHRpbWVzbG90ICV1IHN1Yi1zbG90ICV1JXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsCisJCQllMV9saW5rLT5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiICAgIHRpbWVzbG90ICV1JXMiLCB0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQl2dHlfb3V0KHZ0eSwgIiAgICAgcGh5c19jaGFuX2NvbmZpZyAlcyVzIiwKKwkJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cy0+ZTFfbGluaywgIiAgICAgIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgdHJ4ICV1JXMiLCB0cngtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBhcmZjbiAldSVzIiwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbm9taW5hbCBwb3dlciAldSVzIiwgdHJ4LT5ub21pbmFsX3Bvd2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBtYXhfcG93ZXJfcmVkICV1JXMiLCB0cngtPm1heF9wb3dlcl9yZWQsIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cngtPnJzbF9lMV9saW5rLCAiICAgcnNsICIpOworCXZ0eV9vdXQodnR5LCAiICAgcnNsIGUxIHRlaSAldSVzIiwgdHJ4LT5yc2xfdGVpLCBWVFlfTkVXTElORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWNvbmZpZ193cml0ZV90c19zaW5nbGUodnR5LCAmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiIGJ0cyAldSVzIiwgYnRzLT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0eXBlICVzJXMiLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhbmQgJXMlcyIsIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsX2lkZW50aXR5ICV1JXMiLCBidHMtPmNlbGxfaWRlbnRpdHksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9jYXRpb25fYXJlYV9jb2RlICV1JXMiLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlICV1JXMiLCBidHMtPnRzYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYXNlX3N0YXRpb25faWRfY29kZSAldSVzIiwgYnRzLT5ic2ljLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG1zIG1heCBwb3dlciAldSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnhsZXYgYWNjZXNzIG1pbiAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4sIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyKQorCQl2dHlfb3V0KHZ0eSwgIiAgcGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlICV1JXMiLAorCQkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyICogMTAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2hhbm5lbCBhbGxvY2F0b3IgJXMlcyIsCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID8gImRlc2NlbmRpbmciIDogImFzY2VuZGluZyIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCB0eCBpbnRlZ2VyICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIG1heCB0cmFuc21pc3Npb24gJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgY2VsbCBiYXJyZWQgMSVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgaXAuYWNjZXNzIHVuaXRfaWQgJXUgJXUlcyIsCisJCQlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkLCBidHMtPmlwX2FjY2Vzcy5idHNfaWQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZidHMtPm9tbF9lMV9saW5rLCAiICBvbWwgIik7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgZTEgdGVpICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9CisJdnR5X291dCh2dHksICIgIGdwcnMgZW5hYmxlZCAldSVzIiwgYnRzLT5ncHJzLmVuYWJsZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgcm91dGluZyBhcmVhICV1JXMiLCBidHMtPmdwcnMucmFjLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBjZWxsIGJ2Y2kgJXUlcyIsIGJ0cy0+Z3Bycy5jZWxsLmJ2Y2ksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zZWkgJXUlcyIsIGJ0cy0+Z3Bycy5uc2UubnNlaSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YyA9CisJCQkJCQkmYnRzLT5ncHJzLm5zdmNbaV07CisJCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQkJaWEuc19hZGRyID0gaHRvbmwobnN2Yy0+cmVtb3RlX2lwKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgbnN2Y2kgJXUlcyIsIGksCisJCQkJbnN2Yy0+bnN2Y2ksIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgbG9jYWwgdWRwIHBvcnQgJXUlcyIsIGksCisJCQkJbnN2Yy0+bG9jYWxfcG9ydCwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgdWRwIHBvcnQgJXUlcyIsIGksCisJCQkJbnN2Yy0+cmVtb3RlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgcmVtb3RlIGlwICVzJXMiLCBpLAorCQkJCWluZXRfbnRvYShpYSksIFZUWV9ORVdMSU5FKTsKKwkJfQorCX0KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHZ0eSwgdHJ4KTsKK30KKworc3RhdGljIGludCBjb25maWdfd3JpdGVfYnRzKHN0cnVjdCB2dHkgKnYpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmdzbW5ldC0+YnRzX2xpc3QsIGxpc3QpCisJCWNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHYsIGJ0cyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX25ldChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJuZXR3b3JrJXMiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbmV0d29yayBjb3VudHJ5IGNvZGUgJXUlcyIsIGdzbW5ldC0+Y291bnRyeV9jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW9iaWxlIG5ldHdvcmsgY29kZSAldSVzIiwgZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBzaG9ydCBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfc2hvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBsb25nIG5hbWUgJXMlcyIsIGdzbW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgYXV0aCBwb2xpY3kgJXMlcyIsIGdzbV9hdXRoX3BvbGljeV9uYW1lKGdzbW5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlICV1JXMiLAorCQlnc21uZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGVuY3J5cHRpb24gYTUgJXUlcyIsIGdzbW5ldC0+YTVfZW5jcnlwdGlvbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5lY2kgJXUlcyIsIGdzbW5ldC0+bmVjaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHJybHAgbW9kZSAlcyVzIiwgcnJscF9tb2RlX25hbWUoZ3NtbmV0LT5ycmxwLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW0gaW5mbyAldSVzIiwgZ3NtbmV0LT5zZW5kX21tX2luZm8sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciAldSVzIiwgZ3NtbmV0LT5oYW5kb3Zlci5hY3RpdmUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDEgJXUlcyIsIGdzbW5ldC0+VDMxMDEsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwMyAldSVzIiwgZ3NtbmV0LT5UMzEwMywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA1ICV1JXMiLCBnc21uZXQtPlQzMTA1LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDcgJXUlcyIsIGdzbW5ldC0+VDMxMDcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwOSAldSVzIiwgZ3NtbmV0LT5UMzEwOSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTExICV1JXMiLCBnc21uZXQtPlQzMTExLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTMgJXUlcyIsIGdzbW5ldC0+VDMxMTMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNSAldSVzIiwgZ3NtbmV0LT5UMzExNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE3ICV1JXMiLCBnc21uZXQtPlQzMTE3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTkgJXUlcyIsIGdzbW5ldC0+VDMxMTksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzE0MSAldSVzIiwgZ3NtbmV0LT5UMzE0MSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCB0cnhfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIlRSWCAldSBvZiBCVFMgJXUgaXMgb24gQVJGQ04gJXUlcyIsCisJCXRyeC0+bnIsIHRyeC0+YnRzLT5uciwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSRiBOb21pbmFsIFBvd2VyOiAlZCBkQm0sIHJlZHVjZWQgYnkgJXUgZEIsICIKKwkJInJlc3VsdGluZyBCUyBwb3dlcjogJWQgZEJtJXMiLAorCQl0cngtPm5vbWluYWxfcG93ZXIsIHRyeC0+bWF4X3Bvd2VyX3JlZCwKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyIC0gdHJ4LT5tYXhfcG93ZXJfcmVkLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRyeC0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBCYXNlYmFuZCBUcmFuc2NlaXZlciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyBzdHJlYW0gSUQ6IDB4JTAyeCVzIiwKKwkJCXRyeC0+cnNsX3RlaSwgVlRZX05FV0xJTkUpOworCX0gZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgdHJ4LT5yc2xfbGluayk7CisJfQorfQorCitERUZVTihzaG93X3RyeCwKKyAgICAgIHNob3dfdHJ4X2NtZCwKKyAgICAgICJzaG93IHRyeCBbYnRzX25yXSBbdHJ4X25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUUlhcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IGJ0c19uciwgdHJ4X25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICclcyclcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAnJXMnJXMiLCBhcmd2WzFdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChidHMpIHsKKwkJLyogcHJpbnQgYWxsIFRSWCBpbiB0aGlzIEJUUyAqLworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK3N0YXRpYyB2b2lkIHRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIlRpbWVzbG90ICV1IG9mIFRSWCAldSBpbiBCVFMgJXUsIHBoeXMgY2ZnICVzJXMiLAorCQl0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+dHJ4LT5idHMtPm5yLAorCQlnc21fcGNoYW5fbmFtZSh0cy0+cGNoYW4pLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRzLT5ubV9zdGF0ZSk7CisJaWYgKCFpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkKKwkJdnR5X291dCh2dHksICIgIEUxIExpbmUgJXUsIFRpbWVzbG90ICV1LCBTdWJzbG90ICV1JXMiLAorCQkJdHMtPmUxX2xpbmsuZTFfbnIsIHRzLT5lMV9saW5rLmUxX3RzLAorCQkJdHMtPmUxX2xpbmsuZTFfdHNfc3MsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd190cywKKyAgICAgIHNob3dfdHNfY21kLAorICAgICAgInNob3cgdGltZXNsb3QgW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJyVzJyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAnJXMnJXMiLCBhcmd2WzJdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgVFJYX05SX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCQkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBtZWFzX3JlcF9kdW1wX3VuaV92dHkoc3RydWN0IHZ0eSAqdnR5LAorCQkJCSAgc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQkgIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgIGNvbnN0IGNoYXIgKmRpcikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICBSWEwtRlVMTC0lczogJTRkIGRCbSwgUlhMLVNVQi0lczogJTRkIGRCbSAiLAorCQlwcmVmaXgsIGRpciwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQkJZGlyLCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJdnR5X291dCh2dHksICJSWFEtRlVMTC0lczogJWQsIFJYUS1TVUItJXM6ICVkJXMiLAorCQlkaXIsIG1ydS0+ZnVsbC5yeF9xdWFsLCBkaXIsIG1ydS0+c3ViLnJ4X3F1YWwsCisJCVZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTWVhc3VyZW1lbnQgUmVwb3J0OiVzIiwgcHJlZml4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgRmxhZ3M6ICVzJXMlcyVzJXMiLCBwcmVmaXgsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCA/ICJEVFh1ICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYID8gIkRUWGQgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAiRlBDICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQgPyAiICIgOiAiRExpbnZhbCAiLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQl2dHlfb3V0KHZ0eSwgIiVzICBNUyBUaW1pbmcgT2Zmc2V0OiAldSVzIiwgcHJlZml4LAorCQkJbXItPm1zX3RpbWluZ19vZmZzZXQsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkKKwkJdnR5X291dCh2dHksICIlcyAgTDEgTVMgUG93ZXI6ICV1IGRCbSwgVGltaW5nIEFkdmFuY2U6ICV1JXMiLAorCQkJcHJlZml4LCBtci0+bXNfbDEucHdyLCBtci0+bXNfbDEudGEsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkKKwkJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT5kbCwgcHJlZml4LCAiZGwiKTsKKwltZWFzX3JlcF9kdW1wX3VuaV92dHkodnR5LCAmbXItPnVsLCBwcmVmaXgsICJ1bCIpOworfQorCitzdGF0aWMgdm9pZCBsY2hhbl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBpZHg7CisKKwl2dHlfb3V0KHZ0eSwgIkxjaGFuICV1IGluIFRpbWVzbG90ICV1IG9mIFRSWCAldSBpbiBCVFMgJXUsIFR5cGUgJXMlcyIsCisJCWxjaGFuLT5uciwgbGNoYW4tPnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLCAKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgVXNlIENvdW50OiAldSwgU3RhdGU6ICVzJXMiLCBsY2hhbi0+dXNlX2NvdW50LAorCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBCUyBQb3dlcjogJXUgZEJtLCBNUyBQb3dlcjogJXUgZEJtJXMiLAorCQlsY2hhbi0+dHMtPnRyeC0+bm9taW5hbF9wb3dlciAtIGxjaGFuLT50cy0+dHJ4LT5tYXhfcG93ZXJfcmVkCisJCS0gbGNoYW4tPmJzX3Bvd2VyKjIsCisJCW1zX3B3cl9kYm0obGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgbGNoYW4tPm1zX3Bvd2VyKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChsY2hhbi0+c3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiICBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBsY2hhbi0+c3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICIgIE5vIFN1YnNjcmliZXIlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGxjaGFuLT50cy0+dHJ4LT5idHMpKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCQlpYS5zX2FkZHIgPSBsY2hhbi0+YWJpc19pcC5ib3VuZF9pcDsKKwkJdnR5X291dCh2dHksICIgIEJvdW5kIElQOiAlcyBQb3J0ICV1IFJUUF9UWVBFMj0ldSBDT05OX0lEPSV1JXMiLAorCQkJaW5ldF9udG9hKGlhKSwgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwkvKiB3ZSB3YW50IHRvIHJlcG9ydCB0aGUgbGFzdCBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCSAgICAgICBsY2hhbi0+bWVhc19yZXBfaWR4LCAxKTsKKwltZWFzX3JlcF9kdW1wX3Z0eSh2dHksICZsY2hhbi0+bWVhc19yZXBbaWR4XSwgIiAgIik7Cit9CisKKyNpZiAwCitUT0RPOiBjYWxscmVmIGFuZCByZW1vdGUgY2FsbHJlZiBvZiBjYWxsIG11c3QgYmUgcmVzb2x2ZWQgdG8gZ2V0IGdzbV90cmFucyBvYmplY3QKK3N0YXRpYyB2b2lkIGNhbGxfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwpCit7CisJdnR5X291dCh2dHksICJDYWxsIFR5cGUgJXUsIFN0YXRlICV1LCBUcmFuc2FjdGlvbiBJRCAldSVzIiwKKwkJY2FsbC0+dHlwZSwgY2FsbC0+c3RhdGUsIGNhbGwtPnRyYW5zYWN0aW9uX2lkLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+bG9jYWxfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIExvY2FsIENoYW5uZWw6JXMiLCBWVFlfTkVXTElORSk7CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgY2FsbC0+bG9jYWxfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIExvY2FsIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5yZW1vdGVfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIFJlbW90ZSBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPnJlbW90ZV9sY2hhbik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gUmVtb3RlIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5jYWxsZWRfc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbGVkIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGNhbGwtPmNhbGxlZF9zdWJzY3IpOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIENhbGxlZCBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7Cit9CisjZW5kaWYKKworREVGVU4oc2hvd19sY2hhbiwKKyAgICAgIHNob3dfbGNoYW5fY21kLAorICAgICAgInNob3cgbGNoYW4gW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSBbbGNoYW5fbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgY2hhbm5lbFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19uciwgbGNoYW5fbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAlcyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAlcyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJfQorCWlmIChhcmdjID49IDQpIHsKKwkJbGNoYW5fbnIgPSBhdG9pKGFyZ3ZbM10pOworCQlpZiAobGNoYW5fbnIgPj0gVFNfTUFYX0xDSEFOKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgTENIQU4gJXMlcyIsIGFyZ3ZbM10sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IFRSWF9OUl9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQkJCWZvciAobGNoYW5fbnIgPSAwOyBsY2hhbl9uciA8IFRTX01BWF9MQ0hBTjsKKwkJCQkgICAgIGxjaGFuX25yKyspIHsKKwkJCQkJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaGFuX25yXTsKKwkJCQkJaWYgKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9OT05FKQorCQkJCQkJY29udGludWU7CisJCQkJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFkcnZfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpCit7CisJdnR5X291dCh2dHksICJFMSBJbnB1dCBEcml2ZXIgJXMlcyIsIGRydi0+bmFtZSwgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxZHJ2LAorICAgICAgc2hvd19lMWRydl9jbWQsCisgICAgICAic2hvdyBlMV9kcml2ZXIiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBFMSBkcml2ZXJzXG4iKQoreworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmRydjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmUxaW5wX2RyaXZlcl9saXN0LCBsaXN0KQorCQllMWRydl9kdW1wX3Z0eSh2dHksIGRydik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxbGluZV9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXZ0eV9vdXQodnR5LCAiRTEgTGluZSBOdW1iZXIgJXUsIE5hbWUgJXMsIERyaXZlciAlcyVzIiwKKwkJbGluZS0+bnVtLCBsaW5lLT5uYW1lID8gbGluZS0+bmFtZSA6ICIiLAorCQlsaW5lLT5kcml2ZXItPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWxpbmUsCisgICAgICBzaG93X2UxbGluZV9jbWQsCisgICAgICAic2hvdyBlMV9saW5lIFtsaW5lX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBFMSBsaW5lXG4iKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbnQgbnVtID0gYXRvaShhcmd2WzBdKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJaWYgKGxpbmUtPm51bSA9PSBudW0pIHsKKwkJCQllMWxpbmVfZHVtcF92dHkodnR5LCBsaW5lKTsKKwkJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0JCisJCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkKKwkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfdHMgKnRzKQoreworCWlmICh0cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX05PTkUpCisJCXJldHVybjsKKwl2dHlfb3V0KHZ0eSwgIkUxIFRpbWVzbG90ICUydSBvZiBMaW5lICV1IGlzIFR5cGUgJXMlcyIsCisJCXRzLT5udW0sIHRzLT5saW5lLT5udW0sIGUxaW5wX3RzdHlwZV9uYW1lKHRzLT50eXBlKSwKKwkJVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxdHMsCisgICAgICBzaG93X2UxdHNfY21kLAorICAgICAgInNob3cgZTFfdGltZXNsb3QgW2xpbmVfbnJdIFt0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgdGltZXNsb3RcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBOVUxMOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJaW50IHRzX25yOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghbGluZSB8fCBsaW5lLT5udW0gIT0gbnVtKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIGxpbmUgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CQorCWlmIChhcmdjID49IDIpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHNfbnIgPiBOVU1fRTFfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgdGltZXNsb3QgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWcpCit7CisJdnR5X291dCh2dHksICJQYWdpbmcgb24gQlRTICV1JXMiLCBwYWctPmJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlzdWJzY3JfZHVtcF92dHkodnR5LCBwYWctPnN1YnNjcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19wYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZywgJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KQorCQlwYWdpbmdfZHVtcF92dHkodnR5LCBwYWcpOworfQorCitERUZVTihzaG93X3BhZ2luZywKKyAgICAgIHNob3dfcGFnaW5nX2NtZCwKKyAgICAgICJzaG93IHBhZ2luZyBbYnRzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IGJ0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAlcyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlidHNfcGFnaW5nX2R1bXBfdnR5KHZ0eSwgYnRzKTsKKwkJCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBfdnR5X291dHB1dChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0Z3QsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJc3RydWN0IHZ0eSAqdnR5ID0gdGd0LT50Z3RfdnR5LnZ0eTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgbGluZSk7CisJLyogVGhpcyBpcyBhbiB1Z2x5IGhhY2ssIGJ1dCB0aGVyZSBpcyBubyBlYXN5IHdheS4uLiAqLworCWlmIChzdHJjaHIobGluZSwgJ1xuJykpCisJCXZ0eV9vdXQodnR5LCAiXHIiKTsKK30KKworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZV92dHkoc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF92dHkudnR5ID0gdnR5OworCXRhcmdldC0+b3V0cHV0ID0gX3Z0eV9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKworREVGVU4oZW5hYmxlX2xvZ2dpbmcsCisgICAgICBlbmFibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBlbmFibGUiLAorICAgICAgIkVuYWJsZXMgbG9nZ2luZyB0byB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKGNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgYWxyZWFkeSBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV92dHkodnR5KTsKKwlpZiAoIWNvbm4tPmRiZykKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJZGVidWdfYWRkX3RhcmdldChjb25uLT5kYmcpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2ltc2ksCisgICAgICBsb2dnaW5nX2ZsdHJfaW1zaV9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgaW1zaSBJTVNJIiwKKyAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byBhIElNU0lcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgPDAtMT4iLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3NldF9hbGxfZmlsdGVyKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3VzZV9jbHIsCisgICAgICBsb2dnaW5nX3VzZV9jbHJfY21kLAorICAgICAgImxvZ2dpbmcgY29sb3IgPDAtMT4iLAorICAgICAgIlVzZSBjb2xvciBmb3IgcHJpbnRpbmcgbWVzc2FnZXNcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfdXNlX2NvbG9yKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3BybnRfdGltZXN0YW1wLAorICAgICAgbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQsCisgICAgICAibG9nZ2luZyB0aW1lc3RhbXAgPDAtMT4iLAorICAgICAgIlByaW50IHRoZSB0aW1lc3RhbXAgb2YgZWFjaCBtZXNzYWdlXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRklYTUU6IHRob3NlIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxvZyBsZXZlbHMgYW5kIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIihybGx8Y2N8bW18cnJ8cnNsfG5tfHNtc3xwYWd8bW5jY3xpbnB8bWl8bWlifG11eHxtZWFzfHNjY3B8bXNjfG1nY3B8aG98ZGJ8cmVmKSIKKyNkZWZpbmUgVlRZX0RFQlVHX0xFVkVMUyAiKGV2ZXJ5dGhpbmd8ZGVidWd8aW5mb3xub3RpY2V8ZXJyb3J8ZmF0YWwpIgorREVGVU4obG9nZ2luZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgbGV2ZWwgIiBWVFlfREVCVUdfQ0FURUdPUklFUyAiICIgVlRZX0RFQlVHX0xFVkVMUywKKyAgICAgICJTZXQgdGhlIGxvZyBsZXZlbCBmb3IgYSBzcGVjaWZpZWQgY2F0ZWdvcnlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCWludCBjYXRlZ29yeSA9IGRlYnVnX3BhcnNlX2NhdGVnb3J5KGFyZ3ZbMF0pOworCWludCBsZXZlbCA9IGRlYnVnX3BhcnNlX2xldmVsKGFyZ3ZbMV0pOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoY2F0ZWdvcnkgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBjYXRlZ29yeSBgJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGV2ZWwgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBsZXZlbCBgJXMnJXMiLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmVuYWJsZWQgPSAxOworCWNvbm4tPmRiZy0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFzaywKKyAgICAgIGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2tfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGRlYnVnIG1hc2sgTUFTSyIsCisgICAgICAiRGVjaWRlIHdoaWNoIGNhdGVnb3JpZXMgdG8gb3V0cHV0LlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2xvZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQsCisgICAgICAibG9nZ2luZyBzZXQgbG9nIGxldmVsIDwwLTg+IiwKKyAgICAgICJTZXQgdGhlIGdsb2JhbCBsb2cgbGV2ZWwuIFRoZSB2YWx1ZSAwIGltcGxpZXMgbm8gZmlsdGVyaW5nLlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3NldF9sb2dfbGV2ZWwoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGRpYWJsZV9sb2dnaW5nLAorICAgICAgZGlzYWJsZV9sb2dnaW5nX2NtZCwKKyAgICAgICJsb2dnaW5nIGRpc2FibGUiLAorICAgICAgIkRpc2FibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJdGFsbG9jX2ZyZWUoY29ubi0+ZGJnKTsKKwljb25uLT5kYmcgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdGF0cywKKyAgICAgIHNob3dfc3RhdHNfY21kLAorICAgICAgInNob3cgc3RhdGlzdGljcyIsCisJU0hPV19TVFIgIkRpc3BsYXkgbmV0d29yayBzdGF0aXN0aWNzXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCisJdnR5X291dCh2dHksICJDaGFubmVsIFJlcXVlc3RzICAgICAgICA6ICVsdSB0b3RhbCwgJWx1IG5vIGNoYW5uZWwlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEudG90YWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgICAgICAgICA6ICVsdSBhdHRhY2gsICVsdSBub3JtYWwsICVsdSBwZXJpb2RpYyVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJJTVNJIERldGFjaCBJbmRpY2F0aW9ucyA6ICVsdSVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlIFJlc3BvbnNlOiAlbHUgYWNjZXB0LCAlbHUgcmVqZWN0JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJQYWdpbmcgICAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBjb21wbGV0ZSwgJWx1IGV4cGlyZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJIYW5kb3ZlciAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBub19jaGFubmVsLCAlbHUgdGltZW91dCwgIgorCQkiJWx1IGNvbXBsZXRlZCwgJWx1IGZhaWxlZCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1PICAgICAgICAgICAgICAgICAgOiAlbHUgc3VibWl0dGVkLCAlbHUgbm8gcmVjZWl2ZXIlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1UICAgICAgICAgICAgICAgICAgOiAlbHUgZGVsaXZlcmVkLCAlbHUgbm8gbWVtb3J5LCAlbHUgb3RoZXIgZXJyb3IlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLmRlbGl2ZXJlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0LAorICAgICAgY2ZnX25ldF9jbWQsCisgICAgICAibmV0d29yayIsCisgICAgICAiQ29uZmlndXJlIHRoZSBHU00gbmV0d29yayIpCit7CisJdnR5LT5pbmRleCA9IGdzbW5ldDsKKwl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfbmV0X25jYywKKyAgICAgIGNmZ19uZXRfbmNjX2NtZCwKKyAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCit7CisJZ3NtbmV0LT5jb3VudHJ5X2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21uYywKKyAgICAgIGNmZ19uZXRfbW5jX2NtZCwKKyAgICAgICJtb2JpbGUgbmV0d29yayBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG1vYmlsZSBuZXR3b3JrIGNvZGUiKQoreworCWdzbW5ldC0+bmV0d29ya19jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX3Nob3J0LAorICAgICAgY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCwKKyAgICAgICJzaG9ydCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgc2hvcnQgR1NNIG5ldHdvcmsgbmFtZSIpCit7CisJaWYgKGdzbW5ldC0+bmFtZV9zaG9ydCkKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX3Nob3J0KTsKKworCWdzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX2xvbmcsCisgICAgICBjZmdfbmV0X25hbWVfbG9uZ19jbWQsCisgICAgICAibG9uZyBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX2xvbmcpCisJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9sb25nKTsKKworCWdzbW5ldC0+bmFtZV9sb25nID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2F1dGhfcG9saWN5LAorICAgICAgY2ZnX25ldF9hdXRoX3BvbGljeV9jbWQsCisgICAgICAiYXV0aCBwb2xpY3kgKGNsb3NlZHxhY2NlcHQtYWxsfHRva2VuKSIsCisgICAgICAiU2V0IHRoZSBHU00gbmV0d29yayBhdXRoZW50aWNhdGlvbiBwb2xpY3lcbiIpCit7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCisJZ3NtbmV0LT5hdXRoX3BvbGljeSA9IHBvbGljeTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9yZWplY3RfY2F1c2UsCisgICAgICBjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQsCisgICAgICAibG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDwyLTExMT4iLAorICAgICAgIlNldCB0aGUgcmVqZWN0IGNhdXNlIG9mIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdFxuIikKK3sKKwlnc21uZXQtPnJlamVjdF9jYXVzZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfZW5jcnlwdGlvbiwKKyAgICAgIGNmZ19uZXRfZW5jcnlwdGlvbl9jbWQsCisgICAgICAiZW5jcnlwdGlvbiBhNSAoMHwxfDIpIiwKKyAgICAgICJFbmFibGUgb3IgZGlzYWJsZSBlbmNyeXB0aW9uIChBNSkgZm9yIHRoaXMgbmV0d29ya1xuIikKK3sKKwlnc21uZXQtPmE1X2VuY3J5cHRpb249IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmVjaSwKKyAgICAgIGNmZ19uZXRfbmVjaV9jbWQsCisgICAgICAibmVjaSAoMHwxKSIsCisgICAgICAiU2V0IGlmIE5FQ0kgb2YgY2VsbCBzZWxlY3Rpb24gaXMgdG8gYmUgc2V0IikKK3sKKwlnc21uZXQtPm5lY2kgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ycmxwX21vZGUsIGNmZ19uZXRfcnJscF9tb2RlX2NtZCwKKyAgICAgICJycmxwIG1vZGUgKG5vbmV8bXMtYmFzZWR8bXMtcHJlZmVycmVkfGFzcy1wcmVmZXJyZWQpIiwKKwkiU2V0IHRoZSBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCBNb2RlIikKK3sKKwlnc21uZXQtPnJybHAubW9kZSA9IHJybHBfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbV9pbmZvLCBjZmdfbmV0X21tX2luZm9fY21kLAorICAgICAgIm1tIGluZm8gKDB8MSkiLAorCSJXaGV0aGVyIHRvIHNlbmQgTU0gSU5GTyBhZnRlciBMT0MgVVBEIEFDQ0VQVCIpCit7CisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJIldoZXRoZXIgb3Igbm90IHRvIHVzZSBpbi1jYWxsIGhhbmRvdmVyIikKK3sKKwlpbnQgZW5hYmxlID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChlbmFibGUgJiYgaXBhY2NfcnRwX2RpcmVjdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENhbm5vdCBlbmFibGUgaGFuZG92ZXIgdW5sZXNzIFJUUCBQcm94eSBtb2RlICIKKwkJCSJpcyBlbmFibGVkIGJ5IHVzaW5nIHRoZSAtUCBjb21tYW5kIGxpbmUgb3B0aW9uJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlID0gZW5hYmxlOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9uZWlnaF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCSJIb3cgb2Z0ZW4gdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIGJldHRlciBjZWxsIChTQUNDSCBmcmFtZXMpIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzLCBjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyA8MC05OTk+IiwKKwkiSG93IG1hbnkgZEIgZG9lcyBhIG5laWdoYm9yIHRvIGJlIHN0cm9uZ2VyIHRvIGJlY29tZSBhIEhPIGNhbmRpZGF0ZSIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX21heF9kaXN0YW5jZSwgY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kLAorICAgICAgImhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgPDAtOTk5OT4iLAorCSJIb3cgYmlnIGlzIHRoZSBtYXhpbXVtIHRpbWluZyBhZHZhbmNlIGJlZm9yZSBITyBpcyBmb3JjZWQiKQoreworCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9USU1FUihudW1iZXIsIGRvYykgXAorICAgIERFRlVOKGNmZ19uZXRfVCMjbnVtYmVyLAkJCQkJXAorICAgICAgY2ZnX25ldF9UIyNudW1iZXIjI19jbWQsCQkJCQlcCisgICAgICAidGltZXIgdCIgI251bWJlciAgIiA8MC02NTUzNT4iLAkJCQlcCisgICAgICBkb2MpCQkJCQkJCVwKK3sJCQkJCQkJCVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIpCit7CisJaW50IGJ0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChidHNfbnIgPiBnc21uZXQtPm51bV9idHMpIHsKKwkJdnR5X291dCh2dHksICIlJSBUaGUgbmV4dCB1bnVzZWQgQlRTIG51bWJlciBpcyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfSBlbHNlIGlmIChidHNfbnIgPT0gZ3NtbmV0LT5udW1fYnRzKSB7CisJCS8qIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX1VOS05PV04sCisJCQkJICAgIEhBUkRDT0RFRF9UU0MsIEhBUkRDT0RFRF9CU0lDKTsKKwl9IGVsc2UgCisJCWJ0cyA9IGdzbV9idHNfbnVtKGdzbW5ldCwgYnRzX25yKTsKKworCWlmICghYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVW5hYmxlIHRvIGFsbG9jYXRlIEJUUyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5LT5pbmRleCA9IGJ0czsKKwl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c190eXBlLAorICAgICAgY2ZnX2J0c190eXBlX2NtZCwKKyAgICAgICJ0eXBlIFRZUEUiLAorICAgICAgIlNldCB0aGUgQlRTIHR5cGVcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHJjOworCisJcmMgPSBnc21fc2V0X2J0c190eXBlKGJ0cywgcGFyc2VfYnRzdHlwZShhcmd2WzBdKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JhbmQsCisgICAgICBjZmdfYnRzX2JhbmRfY21kLAorICAgICAgImJhbmQgQkFORCIsCisgICAgICAiU2V0IHRoZSBmcmVxdWVuY3kgYmFuZCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYmFuZCA9IGdzbV9iYW5kX3BhcnNlKGFyZ3ZbMF0pOworCisJaWYgKGJhbmQgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQkFORCAlZCBpcyBub3QgYSB2YWxpZCBHU00gYmFuZCVzIiwKKwkJCWJhbmQsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+YmFuZCA9IGJhbmQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2ksCisgICAgICBjZmdfYnRzX2NpX2NtZCwKKyAgICAgICJjZWxsX2lkZW50aXR5IDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBDZWxsIGlkZW50aXR5IG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBjaSA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoY2kgPCAwIHx8IGNpID4gMHhmZmZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQ0kgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQljaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+Y2VsbF9pZGVudGl0eSA9IGNpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2xhYywKKyAgICAgIGNmZ19idHNfbGFjX2NtZCwKKyAgICAgICJsb2NhdGlvbl9hcmVhX2NvZGUgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIExvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgbGFjID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChsYWMgPCAwIHx8IGxhYyA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIExBQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTY1NTM1KSVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEIHx8IGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgcmVzZXJ2ZWQgYnkgR1NNIDA0LjA4JXMiLAorCQkJbGFjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IGxhYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3RzYywKKyAgICAgIGNmZ19idHNfdHNjX2NtZCwKKyAgICAgICJ0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSAoVFNDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgdHNjID0gYXRvaShhcmd2WzBdKTsKKworCWlmICh0c2MgPCAwIHx8IHRzYyA+IDB4ZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBUU0MgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC0yNTUpJXMiLAorCQkJdHNjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT50c2MgPSB0c2M7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfYnNpYywKKyAgICAgIGNmZ19idHNfYnNpY19jbWQsCisgICAgICAiYmFzZV9zdGF0aW9uX2lkX2NvZGUgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIEJhc2UgU3RhdGlvbiBJZGVudGl0eSBDb2RlIChCU0lDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYnNpYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoYnNpYyA8IDAgfHwgYnNpYyA+IDB4M2YpIHsKKwkJdnR5X291dCh2dHksICIlJSBCU0lDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCWJzaWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmJzaWMgPSBic2ljOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfdW5pdF9pZCwKKyAgICAgIGNmZ19idHNfdW5pdF9pZF9jbWQsCisgICAgICAiaXAuYWNjZXNzIHVuaXRfaWQgPDAtNjU1MzQ+IDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIEJUUyBVbml0IElEIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBzaXRlX2lkID0gYXRvaShhcmd2WzBdKTsKKwlpbnQgYnRzX2lkID0gYXRvaShhcmd2WzFdKTsKKworCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIlJSBCVFMgaXMgbm90IG9mIGlwLmFjY2VzcyB0eXBlJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID0gc2l0ZV9pZDsKKwlidHMtPmlwX2FjY2Vzcy5idHNfaWQgPSBidHNfaWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfc3RyZWFtX2lkLAorICAgICAgY2ZnX2J0c19zdHJlYW1faWRfY21kLAorICAgICAgIm9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIFN0cmVhbSBJRCBvZiB0aGUgT01MIGxpbmsgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHN0cmVhbV9pZCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxLAorICAgICAgY2ZnX2J0c19vbWxfZTFfY21kLAorICAgICAgIm9tbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBpbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgT01MXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmYnRzLT5vbWxfZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c19vbWxfZTFfdGVpLAorICAgICAgY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCwKKyAgICAgICJvbWwgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgT01MIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+b21sX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2hhbGxvYywgY2ZnX2J0c19jaGFsbG9jX2NtZCwKKyAgICAgICJjaGFubmVsIGFsbG9jYXRvciAoYXNjZW5kaW5nfGRlc2NlbmRpbmcpIiwKKyAgICAgICJTaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGluIHJldmVyc2UgVFJYIG9yZGVyPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAiYXNjZW5kaW5nIikpCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMDsKKwllbHNlCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX3R4X2ludGVnZXIsCisgICAgICBjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQsCisgICAgICAicmFjaCB0eCBpbnRlZ2VyIDwwLTE1PiIsCisgICAgICAiU2V0IHRoZSByYXcgdHggaW50ZWdlciB2YWx1ZSBpbiBSQUNIIENvbnRyb2wgcGFyYW1ldGVycyBJRSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSBhdG9pKGFyZ3ZbMF0pICYgMHhmOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX21heF90cmFucywKKyAgICAgIGNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kLAorICAgICAgInJhY2ggbWF4IHRyYW5zbWlzc2lvbiAoMXwyfDR8NykiLAorICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUkFDSCBidXJzdCB0cmFuc21pc3Npb25zIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zID0gcmFjaF9tYXhfdHJhbnNfdmFsMnJhdyhhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9iYXJyZWQsIGNmZ19idHNfY2VsbF9iYXJyZWRfY21kLAorICAgICAgImNlbGwgYmFycmVkICgwfDEpIiwKKyAgICAgICJTaG91bGQgdGhpcyBjZWxsIGJlIGJhcnJlZCBmcm9tIGFjY2Vzcz8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19tc19tYXhfcG93ZXIsIGNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCwKKyAgICAgICJtcyBtYXggcG93ZXIgPDAtNDA+IiwKKyAgICAgICJNYXhpbXVtIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSBNUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm1zX21heF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0LCBjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQsCisgICAgICAiY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDwwLTE0PiIsCisgICAgICAiQ2VsbCBSZS1TZWxlY3Rpb24gSHlzdGVyZXNpcyBpbiBkQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gYXRvaShhcmd2WzBdKS8yOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3J4bGV2X2FjY19taW4sIGNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQsCisgICAgICAicnhsZXYgYWNjZXNzIG1pbiA8MC02Mz4iLAorICAgICAgIk1pbmltdW0gUnhMZXYgbmVlZGVkIGZvciBjZWxsIGFjY2VzcyAoYmV0dGVyIHRoYW4gLTExMGRCbSkiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Blcl9sb2NfdXBkLCBjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCwKKyAgICAgICJwZXJpb2RpYyBsb2NhdGlvbiB1cGRhdGUgPDAtMTUzMD4iLAorICAgICAgIlBlcmlvZGljIExvY2F0aW9uIFVwZGF0aW5nIEludGVydmFsIGluIE1pbnV0ZXMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyID0gYXRvaShhcmd2WzBdKSAvIDEwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Byc19idmNpLCBjZmdfYnRzX2dwcnNfYnZjaV9jbWQsCisJImdwcnMgY2VsbCBidmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgQlNTR1AgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLmNlbGwuYnZjaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc2VpLCBjZmdfYnRzX2dwcnNfbnNlaV9jbWQsCisJImdwcnMgbnNlaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIEVudGl0eSBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnNlLm5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjaSwgY2ZnX2J0c19ncHJzX25zdmNpX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IG5zdmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5uc3ZjaSA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBsb2NhbCB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIExvY2FsIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLmxvY2FsX3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgUmVtb3RlIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcmlwLCBjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIGlwIEEuQi5DLkQiLAorCSJHUFJTIE5TIFJlbW90ZSBJUCBBZGRyZXNzIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmlhKTsKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLnJhYyA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19lbmFibGVkLCBjZmdfYnRzX2dwcnNfZW5hYmxlZF9jbWQsCisJImdwcnMgZW5hYmxlZCA8MC0xPiIsCisJIkdQUlMgRW5hYmxlZCBvbiB0aGlzIEJUUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPmdwcnMuZW5hYmxlZCA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworLyogcGVyIFRSWCBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfdHJ4LAorICAgICAgY2ZnX3RyeF9jbWQsCisgICAgICAidHJ4IFRSWF9OUiIsCisgICAgICAiU2VsZWN0IGEgVFJYIHRvIGNvbmZpZ3VyZSIpCit7CisJaW50IHRyeF9uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAodHJ4X25yID4gYnRzLT5udW1fdHJ4KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlIG5leHQgdW51c2VkIFRSWCBudW1iZXIgaW4gdGhpcyBCVFMgaXMgJXUlcyIsCisJCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0gZWxzZSBpZiAodHJ4X25yID09IGJ0cy0+bnVtX3RyeCkgeworCQkvKiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQl0cnggPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCX0gZWxzZSAKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdnR5LT5pbmRleCA9IHRyeDsKKwl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9hcmZjbiwKKyAgICAgIGNmZ190cnhfYXJmY25fY21kLAorICAgICAgImFyZmNuIDwxLTEwMjQ+IiwKKyAgICAgICJTZXQgdGhlIEFSRkNOIGZvciB0aGlzIFRSWFxuIikKK3sKKwlpbnQgYXJmY24gPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCS8qIEZJWE1FOiBjaGVjayBpZiB0aGlzIEFSRkNOIGlzIHN1cHBvcnRlZCBieSB0aGlzIFRSWCAqLworCisJdHJ4LT5hcmZjbiA9IGFyZmNuOworCisJLyogRklYTUU6IHBhdGNoIEFSRkNOIGludG8gU1lTVEVNIElORk9STUFUSU9OICovCisJLyogRklYTUU6IHVzZSBPTUwgbGF5ZXIgdG8gdXBkYXRlIHRoZSBBUkZDTiAqLworCS8qIEZJWE1FOiB1c2UgUlNMIGxheWVyIHRvIHVwZGF0ZSBTWVNURU0gSU5GT1JNQVRJT04gKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9ub21pbmFsX3Bvd2VyLAorICAgICAgY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCwKKyAgICAgICJub21pbmFsIHBvd2VyIDwwLTEwMD4iLAorICAgICAgIk5vbWluYWwgVFJYIFJGIFBvd2VyIGluIGRCXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+bm9taW5hbF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbWF4X3Bvd2VyX3JlZCwKKyAgICAgIGNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQsCisgICAgICAibWF4X3Bvd2VyX3JlZCA8MC0xMDA+IiwKKyAgICAgICJSZWR1Y3Rpb24gb2YgbWF4aW11bSBCUyBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlpbnQgbWF4cHdyX3IgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlpbnQgdXBwZXJfbGltaXQgPSAyNDsJLyogZGVmYXVsdCAxMi4yMSBtYXggcG93ZXIgcmVkLiAqLworCisJLyogRklYTUU6IGNoZWNrIGlmIG91ciBCVFMgdHlwZSBzdXBwb3J0cyBtb3JlIHRoYW4gMTIgKi8KKwlpZiAobWF4cHdyX3IgPCAwIHx8IG1heHB3cl9yID4gdXBwZXJfbGltaXQpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobWF4cHdyX3IgJiAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGFuIGV2ZW4gdmFsdWUlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHJ4LT5tYXhfcG93ZXJfcmVkID0gbWF4cHdyX3I7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGlzIHVzaW5nIE9NTCAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX2NtZCwKKyAgICAgICJyc2wgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIFJTTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cngtPnJzbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTFfdGVpLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCwKKyAgICAgICJyc2wgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgUlNMIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPnJzbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JmX2xvY2tlZCwKKyAgICAgIGNmZ190cnhfcmZfbG9ja2VkX2NtZCwKKyAgICAgICJyZl9sb2NrZWQgKDB8MSkiLAorICAgICAgIlR1cm4gb2ZmIFJGIG9mIHRoZSBUUlguXG4iKQoreworCWludCBsb2NrZWQgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCWdzbV90cnhfbG9ja19yZih0cngsIGxvY2tlZCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBwZXIgVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RzLAorICAgICAgY2ZnX3RzX2NtZCwKKyAgICAgICJ0aW1lc2xvdCA8MC03PiIsCisgICAgICAiU2VsZWN0IGEgVGltZXNsb3QgdG8gY29uZmlndXJlIikKK3sKKwlpbnQgdHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCisJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEEgR1NNIFRSWCBvbmx5IGhhcyAldSBUaW1lc2xvdHMgcGVyIFRSWCVzIiwKKwkJCVRSWF9OUl9UUywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwl2dHktPmluZGV4ID0gdHM7CisJdnR5LT5ub2RlID0gVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX3BjaGFuLAorICAgICAgY2ZnX3RzX3BjaGFuX2NtZCwKKyAgICAgICJwaHlzX2NoYW5fY29uZmlnIFBDSEFOIiwKKyAgICAgICJQaHlzaWNhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKFRDSC9TRENDSC8uLi4pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcGNoYW5jOworCisJcGNoYW5jID0gZ3NtX3BjaGFuX3BhcnNlKGFyZ3ZbMF0pOworCWlmIChwY2hhbmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl0cy0+cGNoYW4gPSBwY2hhbmM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19lMV9zdWJzbG90LAorICAgICAgY2ZnX3RzX2UxX3N1YnNsb3RfY21kLAorICAgICAgImUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIHN1Yi1zbG90IGNvbm5lY3RlZCB0byB0aGlzIG9uLWFpciB0aW1lc2xvdCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cy0+ZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X25ldF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2J0c19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RyeF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbGNoYW5fY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxZHJ2X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTFsaW5lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTF0c19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfcGFnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3RhdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlbmFibGVfbG9nZ2luZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2FsbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3VzZV9jbHJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfbGV2ZWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfbG9nX2xldmVsX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbmV0X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZuZXRfbm9kZSwgY29uZmlnX3dyaXRlX25ldCk7CisJaW5zdGFsbF9kZWZhdWx0KEdTTU5FVF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX2xvbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2VuY3J5cHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25lY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JybHBfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW1faW5mb19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaGFuZG92ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTEzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzE0MV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX2J0c19jbWQpOworCWluc3RhbGxfbm9kZSgmYnRzX25vZGUsIGNvbmZpZ193cml0ZV9idHMpOworCWluc3RhbGxfZGVmYXVsdChCVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190eXBlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19iYW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbGFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190c2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JzaWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3VuaXRfaWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3N0cmVhbV9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfb21sX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaGFsbG9jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfcmFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2J2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ190cnhfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRyeF9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUUlhfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9hcmZjbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yZl9sb2NrZWRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190c19jbWQpOworCWluc3RhbGxfbm9kZSgmdHNfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfcGNoYW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19lMV9zdWJzbG90X2NtZCk7CisKKwlic2NfdnR5X2luaXRfZXh0cmEobmV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNGMzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0cnVjdCBjbWRfbm9kZSBzdWJzY3Jfbm9kZSA9IHsKKwlTVUJTQ1JfTk9ERSwKKwkiJXMoc3Vic2NyaWJlcikjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKK3sKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICphcmd2X3RvX2J1ZmZlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBpbnQgYmFzZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiID0gYnVmZmVyX25ldygxMDI0KTsKKwlpbnQgaTsKKworCWlmICghYikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSBiYXNlOyBpIDwgYXJnYzsgaSsrKSB7CisJCWJ1ZmZlcl9wdXRzdHIoYiwgYXJndltpXSk7CisJCWJ1ZmZlcl9wdXRjKGIsICcgJyk7CisJfQorCWJ1ZmZlcl9wdXRjKGIsICdcMCcpOworCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaGV4cGFyc2UoY29uc3QgY2hhciAqc3RyLCB1X2ludDhfdCAqYiwgaW50IG1heF9sZW4pCisKK3sKKwlpbnQgaSwgbCwgdjsKKworCWwgPSBzdHJsZW4oc3RyKTsKKwlpZiAoKGwmMSkgfHwgKChsPj4xKSA+IG1heF9sZW4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoYiwgMHgwMCwgbWF4X2xlbik7CisKKwlmb3IgKGk9MDsgaTxsOyBpKyspIHsKKwkJY2hhciBjID0gc3RyW2ldOworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl2ID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQl2ID0gMTAgKyAoYyAtICdhJyk7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWJbaT4+MV0gfD0gdiA8PCAoaSYxID8gMCA6IDQpOworCX0KKworCXJldHVybiBpPj4xOworfQorCisvKiBwZXItc3Vic2NyaWJlciBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfc3Vic2NyLAorICAgICAgY2ZnX3N1YnNjcl9jbWQsCisgICAgICAic3Vic2NyaWJlciBJTVNJIiwKKyAgICAgICJTZWxlY3QgYSBTdWJzY3JpYmVyIHRvIGNvbmZpZ3VyZVxuIikKK3sKKwljb25zdCBjaGFyICppbXNpID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3IgSU1TSSAlcyVzIiwKKwkJCWltc2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIHZ0eV9nb19wYXJlbnQgc2hvdWxkIHB1dCB0aGlzIHN1YnNjcmliZXIgKi8KKwl2dHktPmluZGV4ID0gc3Vic2NyOworCXZ0eS0+bm9kZSA9IFNVQlNDUl9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF9mdWxsX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAorCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggS2k6ICVzJXMiLAorCQkJaGV4ZHVtcChhaW5mby5hM2E4X2tpLCBhaW5mby5hM2E4X2tpX2xlbiksCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBsYXN0IHR1cGxlICh1c2VkICVkIHRpbWVzKTolcyIsCisJCQlhdHVwbGUudXNlX2NvdW50LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBzZXEgIyA6ICVkJXMiLAorCQkJYXR1cGxlLmtleV9zZXEsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFJBTkQgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5yYW5kLCBzaXplb2YoYXR1cGxlLnJhbmQpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFNSRVMgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5zcmVzLCBzaXplb2YoYXR1cGxlLnNyZXMpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIEtjICAgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5rYywgc2l6ZW9mKGF0dXBsZS5rYykpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKKworLyogU3Vic2NyaWJlciAqLworREVGVU4oc2hvd19zdWJzY3IsCisgICAgICBzaG93X3N1YnNjcl9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIFtJTVNJXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpYmVyXG4iKQoreworCWNvbnN0IGNoYXIgKmltc2k7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCWltc2kgPSBhcmd2WzBdOworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgdW5rbm93biBzdWJzY3JpYmVyJXMiLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBhbGwgc3Vic2NyaWJlcnMgPyAqLworCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdWJzY3JfY2FjaGUsCisgICAgICBzaG93X3N1YnNjcl9jYWNoZV9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIGNhY2hlIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBjb250ZW50cyBvZiBzdWJzY3JpYmVyIGNhY2hlXG4iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCAmYWN0aXZlX3N1YnNjcmliZXJzLCBlbnRyeSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc21zX3NlbmRfcGVuZCwKKyAgICAgIHNtc19zZW5kX3BlbmRfY21kLAorICAgICAgInNtcyBzZW5kIHBlbmRpbmciLAorICAgICAgIlNlbmQgYWxsIHBlbmRpbmcgU01TIikKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCBpZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3IoZ3NtbmV0LCBpZCk7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisKKwkJZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzbXMtPnJlY2VpdmVyLCBzbXMpOworCisJCWlkID0gc21zLT5yZWNlaXZlci0+aWQgKyAxOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXJlY2VpdmVyLT5sYWMpIHsKKwkJLyogc3Vic2NyaWJlciBjdXJyZW50bHkgbm90IGF0dGFjaGVkLCBzdG9yZSBpbiBkYXRhYmFzZT8gKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXQocmVjZWl2ZXIpOworCXN0cm5jcHkoc21zLT50ZXh0LCB0ZXh0LCBzaXplb2Yoc21zLT50ZXh0KS0xKTsKKworCS8qIEZJWE1FOiBkb24ndCB1c2UgSUQgMSBzdGF0aWMgKi8KKwlzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCAxKTsKKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gMDsKKwlzbXMtPnN0YXR1c19yZXBfcmVxID0gMDsKKwlzbXMtPnVkX2hkcl9pbmQgPSAwOworCXNtcy0+cHJvdG9jb2xfaWQgPSAwOyAvKiBpbXBsaWNpdCAqLworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gMDsgLyogZGVmYXVsdCA3Yml0ICovCisJc3RybmNweShzbXMtPmRlc3RfYWRkciwgcmVjZWl2ZXItPmV4dGVuc2lvbiwgc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xKTsKKwkvKiBHZW5lcmF0ZSB1c2VyX2RhdGEgKi8KKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBnc21fN2JpdF9lbmNvZGUoc21zLT51c2VyX2RhdGEsIHNtcy0+dGV4dCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdGF0aWMgaW50IF9zZW5kX3Ntc19idWZmZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlciAqYiwgdV9pbnQ4X3QgdHBfcGlkKQoreworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzbXMgPSBzbXNfZnJvbV90ZXh0KHJlY2VpdmVyLCBidWZmZXJfZ2V0c3RyKGIpKTsKKwlzbXMtPnByb3RvY29sX2lkID0gdHBfcGlkOworCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3IocmVjZWl2ZXIsIHNtcyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmdldF9zdWJzY3JfYnlfYXJndihjb25zdCBjaGFyICp0eXBlLAorCQkJCQkJIGNvbnN0IGNoYXIgKmlkKQoreworCWlmICghc3RyY21wKHR5cGUsICJleHRlbnNpb24iKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGdzbW5ldCwgaWQpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImltc2kiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJ0bXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X3Rtc2koZ3NtbmV0LCBhdG9pKGlkKSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaWQiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCBhdG9pKGlkKSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKyNkZWZpbmUgU1VCU0NSX1RZUEVTICIoZXh0ZW5zaW9ufGltc2l8dG1zaXxpZCkiCisKK0RFRlVOKHN1YnNjcmliZXJfc2VuZF9zbXMsCisgICAgICBzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc21zIHNlbmQgLkxJTkUiLAorICAgICAgIlNlbGVjdCBzdWJzY3JpYmVyIGJhc2VkIG9uIGV4dGVuc2lvbiIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoYXJndlswXSwgYXJndlsxXSk7CisJc3RydWN0IGJ1ZmZlciAqYjsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCAwKTsKKwlidWZmZXJfZnJlZShiKTsKKworCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCXJldHVybiByYzsKK30KKworREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCA2NCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnQsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IGNhbGwgc3RhcnQgKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIsCisgICAgICAiU3RhcnQgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYywgdHlwZTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2YiKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9UQ0hfRjsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0Y2gvYW55IikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Zvckg7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2RjY2giKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9TRENDSDsKKwllbHNlCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfQU5ZOwkvKiBEZWZhdWx0cyB0byBBTlkgKi8KKworCXJjID0gZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN1YnNjciwgdnR5LCB0eXBlKTsKKwlpZiAocmMgPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFN1YnNjcmliZXIgbm90IGF0dGFjaGVkJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcCwKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0b3AiLAorICAgICAgIlN0b3AgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfbmFtZSwKKyAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCisgICAgICAibmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5uYW1lKSk7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3N1YnNjcl9leHRlbnNpb24sCisgICAgICBjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQsCisgICAgICAiZXh0ZW5zaW9uIEVYVEVOU0lPTiIsCisgICAgICAiU2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPmV4dGVuc2lvbikpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfYXV0aG9yaXplZCwKKyAgICAgIGNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQsCisgICAgICAiYXV0aCA8MC0xPiIsCisgICAgICAiU2V0IHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciIpCit7CisJaW50IGF1dGggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCWlmIChhdXRoKQorCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAxOworCWVsc2UKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEEzQThfQUxHX1RZUEVTICIobm9uZXxjb21wMTI4djEpIgorCitERUZVTihjZmdfc3Vic2NyX2EzYTgsCisgICAgICBjZmdfc3Vic2NyX2EzYThfY21kLAorICAgICAgImEzYTggIiBBM0E4X0FMR19UWVBFUyAiIFtLSV0iLAorICAgICAgIlNldCBhM2E4IHBhcmFtZXRlcnMgZm9yIHRoZSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisJY29uc3QgY2hhciAqYWxnX3N0ciA9IGFyZ3ZbMF07CisJY29uc3QgY2hhciAqa2lfc3RyID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgcmM7CisKKwlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgeworCQkvKiBKdXN0IGVyYXNlICovCisJCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgeworCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCisJCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOworCQlpZiAocmMgIT0gMTYpCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwkJLyogU2V0IHRoZSBpbmZvcyAqLworCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOworCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG1ldGhvZCAqLworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmV0dXJuIHJjID8gQ01EX1dBUk5JTkcgOiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY2FsbF9jYmZuKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSAqc2lnZGF0YSA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCB2dHkgKnZ0eSA9IHNpZ2RhdGEtPmRhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TQ0FMTF9TVUNDRVNTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIHNpbGVudCBjYWxsIG9uIEFSRkNOICV1IHRpbWVzbG90ICV1JXMiLAorCQkJc2lnZGF0YS0+bGNoYW4tPnRzLT50cngtPmFyZmNuLCBzaWdkYXRhLT5sY2hhbi0+dHMtPm5yLAorCQkJVlRZX05FV0xJTkUpOworCQlicmVhazsKKwljYXNlIFNfU0NBTExfRVhQSVJFRDoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBleHBpcmVkIHBhZ2luZyVzIiwgVlRZX05FV0xJTkUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU0NBTEwsIHNjYWxsX2NiZm4sIE5VTEwpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NhY2hlX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc21zX3NlbmRfcGVuZF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2VuZF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdG9wX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzdWJzY3Jfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZGVmYXVsdChTVUJTQ1JfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2EzYThfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxYjkzMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUyA9IGRlYnVnIGdzbTA0MDggZGIgY2hhbm5lbCBzY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTY1OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gY2hhbm5lbF90ZXN0CisKK2NoYW5uZWxfdGVzdF9TT1VSQ0VTID0gY2hhbm5lbF90ZXN0LmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RiLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX3N1YnNjcmliZXIuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX2RhdGEuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCitjaGFubmVsX3Rlc3RfTERBREQgPSAtbGRsIC1sZGJpICQoTElCT1NNT0NPUkVfTElCUykKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworLyogb3VyIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX2NiKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWFzc2VydChob29rID09IDEwMSk7CisJYXNzZXJ0KGV2ZW50ID09IDIwMCk7CisJYXNzZXJ0KG1zZyA9PSAodm9pZCopMHgxMzIzTCk7CisJYXNzZXJ0KGRhdGEgPT0gKHZvaWQqKTB4NDI0MkwpOworCWFzc2VydChwYXJhbSA9PSAodm9pZCopMHgyMzQyTCk7CisJcHJpbnRmKCJSZWFjaGVkLCBkaWRuJ3QgY3Jhc2gsIHRlc3QgcGFzc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogbW9jayBvYmplY3QgZm9yIHRlc3RpbmcsIGRpcmVjdGx5IGludm9rZSB0aGUgY2IuLi4gbWF5YmUgbGF0ZXIgdGhyb3VnaCB0aGUgdGltZXIgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJY2JmbigxMDEsIDIwMCwgKHZvaWQqKTB4MTMyM0wsICh2b2lkKikweDQyNDJMLCBkYXRhKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlwcmludGYoIlRlc3RpbmcgdGhlIGdzbV9zdWJzY3JpYmVyIGNoYW4gbG9naWNcbiIpOworCisJLyogQ3JlYXRlIGEgZHVtbXkgbmV0d29yayAqLworCW5ldHdvcmsgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghbmV0d29yaykKKwkJZXhpdCgxKTsKKwlidHMgPSBnc21fYnRzX2FsbG9jKG5ldHdvcmssIEdTTV9CVFNfVFlQRV9CUzExLCAwLCAwKTsKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IDIzOworCisJLyogQ3JlYXRlIGEgZHVtbXkgc3Vic2NyaWJlciAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5sYWMgPSAyMzsKKwlzdWJzY3ItPm5ldCA9IG5ldHdvcms7CisKKwkvKiBBc2sgZm9yIGEgY2hhbm5lbC4uLiAqLworCXN1YnNjcl9nZXRfY2hhbm5lbChzdWJzY3IsIFJTTF9DSEFOTkVFRF9UQ0hfRiwgc3Vic2NyX2NiLCAodm9pZCopMHgyMzQyTCk7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQorCit2b2lkIG5tX3N0YXRlX2V2ZW50KCkge30KK3ZvaWQgaW5wdXRfZXZlbnQoKSB7fQordm9pZCBzbXNfYWxsb2MoKSB7fQorCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViOTE4MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gZGJfdGVzdAorCitkYl90ZXN0X1NPVVJDRVMgPSBkYl90ZXN0LmMKK2RiX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGwgLWxkYmkKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4YWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT01QQVJFKG9yaWdpbmFsLCBjb3B5KSBcCisJaWYgKG9yaWdpbmFsLT5pZCAhPSBjb3B5LT5pZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIklkcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWxsdSAlbGx1XG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aWQsIGNvcHktPmlkKTsgXAorCWlmIChvcmlnaW5hbC0+bGFjICE9IGNvcHktPmxhYykgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkxBQyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5sYWMsIGNvcHktPmxhYyk7IFwKKwlpZiAob3JpZ2luYWwtPmF1dGhvcml6ZWQgIT0gY29weS0+YXV0aG9yaXplZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkF1dGhvcml6ZSBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5hdXRob3JpemVkLCBcCisJCQljb3B5LT5hdXRob3JpemVkKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJJTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aW1zaSwgY29weS0+aW1zaSk7IFwKKwlpZiAob3JpZ2luYWwtPnRtc2kgIT0gY29weS0+dG1zaSkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIlRNU0lzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXUnICcldSdcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT50bXNpLCBjb3B5LT50bXNpKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bmFtZSwgY29weS0+bmFtZSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbikgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIm5hbWVzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbik7IFwKKworaW50IG1haW4oKSB7CisKKwlpZiAoZGJfaW5pdCgiaGxyLnNxbGl0ZTMiKSkgeworCQlwcmludGYoIkRCOiBGYWlsZWQgdG8gaW5pdCBkYXRhYmFzZS4gUGxlYXNlIGNoZWNrIHRoZSBvcHRpb24gc2V0dGluZ3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQkgCisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIHByZXBhcmVkLlxuIik7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlX2RiOworCisJY2hhciAqYWxpY2VfaW1zaSA9ICIzMjQzMjQ1NDMyMzQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZS0+aW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCisJYWxpY2VfaW1zaSA9ICIzNjkzMjQ1NDIzNDQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjEyMzQ1Njc4OTAiKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWFsaWNlX2ltc2kgPSAiOTk5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiNjU0MzU2MDkyMCIpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2VfaW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCisJZGJfZmluaSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0dWJzICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIzZmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitub2luc3RfUFJPR1JBTVMgPSBkZWJ1Z190ZXN0CisKK2RlYnVnX3Rlc3RfU09VUkNFUyA9IGRlYnVnX3Rlc3QuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jIAorZGVidWdfdGVzdF9MREFERCA9ICQoTElCT1NNT0NPUkVfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwYzI4NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHNpbXBsZSB0ZXN0IGZvciB0aGUgZGVidWcgaW50ZXJmYWNlICovCisvKgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEwiKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworCisJZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRFJMTDpEQ0MiKTsKKwlERUJVR1AoRFJMTCwgIllvdSBzaG91bGQgc2VlIHRoaXNcbiIpOworCURFQlVHUChEQ0MsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRE1NLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZ3NtMDQwOF90ZXN0CisKK2dzbTA0MDhfdGVzdF9TT1VSQ0VTID0gZ3NtMDQwOF90ZXN0LmMKK2dzbTA0MDhfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJtc2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQoTElCT1NNT0NPUkVfTElCUykgLWxkYmkKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkNGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGdzbTA0MDggZm9ybWF0dGluZyBmdW5jdGlvbnMgKi8KKy8qCisgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBDT01QQVJFKHJlc3VsdCwgb3AsIHZhbHVlKSBcCisgICAgaWYgKCEoKHJlc3VsdCkgb3AgKHZhbHVlKSkpIHtcCisJZnByaW50ZihzdGRlcnIsICJDb21wYXJlIGZhaWxlZC4gV2FzICV4IHNob3VsZCBiZSAleCBpbiAlczolZFxuIixyZXN1bHQsIHZhbHVlLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJZXhpdCgtMSk7IFwKKyAgICB9CisKKyNkZWZpbmUgQ09NUEFSRV9TVFIocmVzdWx0LCB2YWx1ZSkgXAorCWlmIChzdHJjbXAocmVzdWx0LCB2YWx1ZSkgIT0gMCkgeyBcCisJCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAlcyBzaG91bGQgYmUgJXMgaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQlleGl0KC0xKTsgXAorCX0KKworLyoKKyAqIFRlc3QgTG9jYXRpb24gQXJlYSBJZGVudGlmaWVyIGZvcm1hdHRpbmcuIFRhYmxlIDEwLjUuMyBvZiAwNC4wOAorICovCitzdGF0aWMgdm9pZCB0ZXN0X2xvY2F0aW9uX2FyZWFfaWRlbnRpZmllcih2b2lkKQoreworICAgIHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk0ODsKKworICAgIHByaW50ZigiVGVzdGluZyB0ZXN0IGxvY2F0aW9uIGFyZWEgaWRlbnRpZmllclxuIik7CisKKyAgICAvKgorICAgICAqIFRlc3QgdGhlIGRlZmF1bHQvdGVzdCBzZXR1cC4gQ29taW5nIGZyb20KKyAgICAgKiBic2NfaGFjay5jIGR1bXBzCisgICAgICovCisgICAgZ3NtNDhfZ2VuZXJhdGVfbGFpKCZsYWk0OCwgMSwgMSwgMSk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMF0sID09LCAweDAwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1sxXSwgPT0sIDB4RjEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzJdLCA9PSwgMHgxMCk7CisgICAgQ09NUEFSRShsYWk0OC5sYWMsID09LCBodG9ucygweDAwMDEpKTsKKworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDYwMiwgMSwgMTUpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwNik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYyKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDBmKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWlfZnVuY3Rpb25hbGl0eSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmltc2lfb2RkICA9ICI5ODc2NTQzMjEwOTg3NjMiOworCWNvbnN0IGNoYXIgKmltc2lfZXZlbiA9ICI5ODc2NTQzMjEwOTg3NjU0IjsKKwljb25zdCB1X2ludDMyX3QgdG1zaSA9IDB4ZmFiZWFjZDA7CisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCWNoYXIgbWlfcGFyc2VkW0dTTTQ4X01JX1NJWkVdOworCisJcHJpbnRmKCJUZXN0aW5nIHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgVE1TSS9JTVNJXG4iKTsKKworCS8qIHRtc2kgY29kZSAqLworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWksIHRtc2kpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtIDIpOworCUNPTVBBUkUoKHVfaW50MzJfdClzdHJ0b3VsKG1pX3BhcnNlZCwgTlVMTCwgMTApLCA9PSwgdG1zaSk7CisKKwkvKiBpbXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCBpbXNpX29kZCk7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9vZGQpOworCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9ldmVuKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLTIpOworCXByaW50ZigiaGV4OiAlc1xuIiwgaGV4ZHVtcChtaSwgbWlfbGVuKSk7CisJQ09NUEFSRV9TVFIobWlfcGFyc2VkLCBpbXNpX2V2ZW4pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIoKTsKKwl0ZXN0X21pX2Z1bmN0aW9uYWxpdHkoKTsKKworCWV4aXQoMCk7Cit9CisKKworCisvKgorICogU3R1YnMgdG8gY29tcGlsZSBhbmQgbGluaworICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NjkzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgLWdnZGIzICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorCitub2luc3RfUFJPR1JBTVMgPSBzY2NwX3Rlc3QKKworc2NjcF90ZXN0X1NPVVJDRVMgPSBzY2NwX3Rlc3QuYworc2NjcF90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJzY2NwLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQxZDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zY2NwL3NjY3BfdGVzdC5jCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogU0NDUCB0ZXN0aW5nIGNvZGUKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxzY2NwL3NjY3AuaD4KKworI2RlZmluZSBNSU4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKworLyogQlNDIC0+IE1TQyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZXNldFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgzMCwgMHgwNCwKKwkweDAxLCAweDIwLAorfTsKKworLyogTVNDIC0+IEJTQyByZXNldCBhY2sgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRfYWNrW10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNywgMHgwYiwgMHgwNCwgMHg0MywgMHgwMSwKKwkweDAwLCAweGZlLCAweDA0LCAweDQzLCAweDVjLCAweDAwLCAweGZlLCAweDAzLAorCTB4MDAsIDB4MDEsIDB4MzEsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgY29ubmVjdGlvbiBsZXNzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3BhZ2luZ1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgxMCwKKwkweDAwLCAweDBlLCAweDUyLCAweDA4LCAweDA4LCAweDI5LCAweDQ3LCAweDEwLAorCTB4MDIsIDB4MDEsIDB4MzEsIDB4OTcsIDB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgVURUIHdpdGhvdXQgUEMgICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3VkdFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgxMCwgMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwKKwkweDA4LCAweDI5LCAweDQ3LCAweDEwLCAweDAyLCAweDAxLCAweDMxLCAweDk3LAorCTB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBCU0MgLT4gTVNDIGNvbm5lY3Rpb24gb3BlbiAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jcltdID0geworCTB4MDEsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDQsIDB4MDIsCisJMHg0MiwgMHhmZSwgMHgwZiwgMHgxZiwgMHgwMCwgMHgxZCwgMHg1NywgMHgwNSwKKwkweDA4LCAweDAwLCAweDcyLCAweGY0LCAweDgwLCAweDIwLCAweDEyLCAweGMzLAorCTB4NTAsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MjQsIDB4MTEsIDB4MDMsIDB4MzMsCisJMHgxOSwgMHhhMiwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwKKwkweDMxLCAweDk3LCAweDYxLCAweDAwCit9OworCisvKiBNU0MgLT4gQlNDIGNvbm5lY3Rpb24gY29uZmlybSAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jY1tdID0geworCTB4MDIsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDAsCit9OworCisvKiBNU0MgLT4gQlNDIERUQVAKKyAqCisgKiB3ZSBmYWtlIGEgYml0IGFuZCBtYWtlIGl0IEJTQyAtPiBNU0MuLi4gc28gdGhlCisgKiBwYXlsb2FkIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLi4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9kdGFwW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwgMHgwMSwgMHgwMCwgMHgwYywKKwkweDAzLCAweDA1LCAweDVjLCAweDA4LCAweDExLCAweDgxLCAweDMzLCAweDY2LCAweDAyLCAweDEzLAorCTB4NDUsIDB4ZjQsCit9OworCisvKiBNU0MgLT4gQlNDIGNsZWFyIGNvbW1hbmQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2xlYXJbXSA9IHsKKwkweDA2LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDA2LCAweDAwLCAweDA0LCAweDIwLAorCTB4MDQsIDB4MDEsIDB4MDksCit9OworCisvKiBNU0MgLT4gQlNDIHJlbGVhc2VkICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3JlbGVhc2VkW10gPSB7CisJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwKKwkweDAyLCAweDIzLCAweDQyLCAweDAwLAorfTsKKworLyogQlNDIC0+IE1TQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlX2NvbXBsZXRlW10gPSB7CisJMHgwNSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMworfTsKKworc3RydWN0IHRlc3RfZGF0YSB7CisJaW50IGxlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZGF0YTsKKwlpbnQgcGF5bG9hZF9zdGFydDsKKwlpbnQgcGF5bG9hZF9sZW5ndGg7CisJdV9pbnQ4X3QgZmlyc3RfYnl0ZTsKKworICAgICAgICAvKiBpbiBjYXNlIGl0IHNob3VsZCB0cmlnZ2VyIGEgc2NjcCByZXNwb25zZSAqLworCWludCB3cml0ZTsKKwljb25zdCB1X2ludDhfdCAgKnJlc3BvbnNlOworCWludCByZXNwb25zZV9sZW5ndGg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3RfZGF0YSB0ZXN0X2RhdGFbXSA9IHsKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3Jlc2V0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCkgLSAxMiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXRfYWNrKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldF9hY2tbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjaykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcGFnaW5nKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9wYWdpbmdbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY3IpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkvKiAweDAwIGlzIGVuZCBvZiBvcHRpb25hbCBkYXRhLCBzdWJ0cmFjdCB0aGlzIGJ5dGUgKi8KKwkJLnBheWxvYWRfbGVuZ3RoID0gMzEsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCisJCS8qIHRoZSBjb25uZWN0aW9uIHJlcXVlc3Qgc2hvdWxkIHRyaWdnZXIgYSBjb25uZWN0aW9uIGNvbmZpcm0gKi8KKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfY2NbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX2NjKSwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9kdGFwKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9kdGFwWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDE1LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDEsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY2xlYXIpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NsZWFyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDYsCisJCS5maXJzdF9ieXRlCT0gMHgwMCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZWxlYXNlZCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVsZWFzZWRbMF0sCisJCS5wYXlsb2FkX2xlbmd0aCA9IDIsCisJCS5wYXlsb2FkX3N0YXJ0ICA9IDExLAorCQkuZmlyc3RfYnl0ZQk9IDB4MjMsCisKKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVswXSwKKwkJLnJlc3BvbnNlX2xlbmd0aD0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZV9jb21wbGV0ZSksCisJfSwKK307CisKKy8qIHdlIHdpbGwgc2VuZCBVRFRzIGFuZCB2ZXJpZnkgdGhleSBsb29rIGxpa2UgdGhpcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgc2VuZF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3VkdCksCisJCS5kYXRhCQk9ICZic3NtYXBfdWR0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCit9OworCitzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IHsKKwkvKiBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcmVmdXNlZD8gKi8KKwlpbnQgcmVmdXNlOworCisJaW50IHdpdGhfZGF0YTsKKworCS8qIG9uIHdoaWNoIHNpZGUgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24/ICovCisJaW50IGNsb3NlX3NpZGU7CisJaW50IGNsb3NlX2NhdXNlOworfTsKKworLyogc2NjcCBjb25uZWN0aW9uIGhhbmRsaW5nIHdlIHdhbnQgdG8gdGVzdCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgY29ubmVjdGlvbl90ZXN0c1tdID0geworCXsKKwkJLnJlZnVzZQk9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UJPSAxLAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCit9OworCitzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHsKKwkvKiByZXN1bHRzICovCisJaW50IG1zZ190eXBlOworCWludCB3YW50ZWRfbGVuOworCWludCBzcmNfc3NuOworCWludCBkc3Rfc3NuOworCisJaW50IGhhc19zcmNfcmVmLCBoYXNfZHN0X3JlZjsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNyY19yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBkc3RfcmVmOworCisJLyogdGhlIGlucHV0ICovCisJY29uc3QgdV9pbnQ4X3QgKmlucHV0OworCWludCBpbnB1dF9sZW47Cit9OworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaXRfdGVzdFtdID0geworMHgxMCwgMHgwMSwgMHgwNywgCisweDk0LCAweDAxLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHBhcnNlX3Jlc3VsdFtdID0geworCXsKKwkJLm1zZ190eXBlCT0gU0NDUF9NU0dfVFlQRV9JVCwKKwkJLndhbnRlZF9sZW4JPSAwLAorCQkuc3JjX3Nzbgk9IC0xLAorCQkuZHN0X3Nzbgk9IC0xLAorCQkuaGFzX3NyY19yZWYJPSAxLAorCQkuaGFzX2RzdF9yZWYJPSAxLAorCisJCS5zcmNfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNCwKKwkJCS5vY3RldDMgPSAweDAwCisJCX0sCisJCS5kc3RfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNywKKwkJCS5vY3RldDMgPSAweDk0LAorCQl9LAorCisJCS5pbnB1dAkJPSBpdF90ZXN0LAorCQkuaW5wdXRfbGVuCT0gc2l6ZW9mKGl0X3Rlc3QpLAorCX0sCit9OworCisKKy8qIHRlc3RpbmcgcHJvY2VkdXJlOgorICoJLSB3ZSB3aWxsIHVzZSBzY2NwX3dyaXRlIGFuZCBzZWUgd2hhdCB3aWxsIGJlIHNldCBpbiB0aGUKKyAqCSAgb3V0Z29pbmcgY2FsbGJhY2sKKyAqCS0gd2Ugd2lsbCBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGFuZCBzZWUgd2hpY2ggY2FsbHMKKyAqCSAgYXJlIG1hZGUuIEFuZCB0aGVuIGNvbXBhcmUgaXQgdG8gdGhlIG9uZXMgd2UgZXhwZWN0LiBXZQorICoJICB3YW50IHRoZSBwYXlsb2FkIHRvIGFycml2ZSwgb3IgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZC4KKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF9jb25uZWN0aW9uX3NvY2tldCBhbmQgc2NjcF9jb25uZWN0aW9uX3dyaXRlCisgKgkgIGFuZCB2ZXJpZnkgc3RhdGUgaGFuZGxpbmcgb2YgY29ubmVjdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGN1cnJlbnRfdGVzdDsKKworLyoKKyAqIHRlc3Qgc3RhdGUuLi4KKyAqLworc3RhdGljIGludCBjYWxsZWQgID0gMDsKK3N0YXRpYyBpbnQgbWF0Y2hlZCA9IDA7CitzdGF0aWMgaW50IHdyaXRlX2NhbGxlZCA9IDA7CisKKyNkZWZpbmUgRkFJTCh4LCBhcmdzLi4uKSBwcmludGYoIkZBSUxVUkUgaW4gJXM6JWQ6ICIgeCwgX19GSUxFX18sIF9fTElORV9fLCAjIyBhcmdzKQorCisvKgorICogd3JpdGluZyB0aGVzZSBwYWNrZXRzIGFuZCBleHBlY3RpbmcgYSByZXN1bHQKKyAqLworaW50IHNjY3BfcmVhZF9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVfaW50MTZfdCBwYXlsb2FkX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfbGVuZ3RoOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwljYWxsZWQgPSAxOworCisJaWYgKG1zZ2JfbDNsZW4oZGF0YSkgPCBsZW4pIHsKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworCQlGQUlMKCJTb21ldGhpbmcgaG9ycmlibGUgaGFwcGVuZWQuLiBpbnZhbGlkIHBhY2tldC4uXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGxlbiA9PSAwIHx8IGxlbiAhPSBwYXlsb2FkX2xlbmd0aCkgeworCQlGQUlMKCJsZW5ndGggbWlzbWF0Y2g6IGdvdDogJWQgd2FudGVkOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSwgcGF5bG9hZF9sZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRhdGEtPmwzaFswXSAhPSAgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZmlyc3RfYnl0ZSkgeworCQlGQUlMKCJUaGUgZmlyc3QgYnl0ZXMgb2YgbDMgZG8gbm90IG1hdGNoOiAweCV4IDB4JXhcbiIsCisJCQlkYXRhLT5sM2hbMF0sIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ290ID0gJmRhdGEtPmwzaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhICsgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucGF5bG9hZF9zdGFydDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpCit7CisJaW50IGkgPSAwOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisKKwlpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2UgPT0gTlVMTCkgeworCQlGQUlMKCJEaWRuJ3QgZXhwZWN0IHdyaXRlIGNhbGxiYWNrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2VfbGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCk7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXdyaXRlX2NhbGxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NjcF9jX3JlYWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc2NjcF9yZWFkX2NiKG1zZ2IsIGxlbiwgY29ubmVjdGlvbi0+ZGF0YV9jdHgpOworfQorCit2b2lkIHNjY3BfY19zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgb2xkX3N0YXRlKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKQorCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uZWN0aW9uKTsKK30KKworaW50IHNjY3BfYWNjZXB0X2NiKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwljYWxsZWQgPSAxOworCXVuc2lnbmVkIGludCByZWYgPSAwOworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQxIDw8IDI0OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQyIDw8IDE2OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQzIDw8ICA4OworCXJlZiA9IG50b2hsKHJlZik7CisKKwljb25uZWN0aW9uLT5kYXRhX2NiID0gc2NjcF9jX3JlYWQ7CisJY29ubmVjdGlvbi0+c3RhdGVfY2IgPSBzY2NwX2Nfc3RhdGU7CisKKwkvKiBhY2NlcHQgdGhpcyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjY3BfdWR0X3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCisJaWYgKHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5kYXRhOworCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDJsZW4oZGF0YSk7ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW0odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCisJCWNhbGxlZCA9IG1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKworCQlpZiAoIWNhbGxlZCB8fCAhbWF0Y2hlZCB8fCAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ud3JpdGUgIT0gd3JpdGVfY2FsbGVkKSkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgY2FsbGVkOiAlZCBtYXRjaGVkOiAlZCB3cml0ZTogJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfdGVzdCwgY2FsbGVkLCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogdGVzdCBzZW5kaW5nIG9mIHVkdCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3NlbmRfdWR0KHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3VkdF93cml0ZV9jYiwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHNlbmRfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgKnRlc3QgPSAmc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF07CisKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2ModGVzdC0+cGF5bG9hZF9sZW5ndGgsIF9fZnVuY19fKTsKKwkJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDNoLCB0ZXN0LT5kYXRhICsgdGVzdC0+cGF5bG9hZF9zdGFydCwgdGVzdC0+cGF5bG9hZF9sZW5ndGgpOworCisJCW1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF93cml0ZShtc2csICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCQlpZiAoIW1hdGNoZWQgfHwgIXdyaXRlX2NhbGxlZCkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIG1hdGNoZWQsIHdyaXRlX2NhbGxlZCk7CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisvKiBzZW5kIHVkdCBmcm9tIG9uZSBlbmQgdG8gYW5vdGhlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZXN0X3ZhbHVlID0gMHgyNDQyOworc3RhdGljIGludCBzY2NwX3VkdF9yZWFkKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCAqdmFsOworCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIldyb25nIHNpemU6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9ICh1bnNpZ25lZCBpbnQqKWRhdGEtPmwzaDsKKwltYXRjaGVkID0gdGVzdF92YWx1ZSA9PSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NjcF93cml0ZV9sb29wKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCS8qIHNlbmQgaXQgYmFjayB0byB1cyAqLworCXNjY3Bfc3lzdGVtX2luY29taW5nKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfdWR0X2NvbW11bmljYXRpb24odm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9sb29wLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF91ZHRfcmVhZCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCisJZGF0YSA9IG1zZ2JfYWxsb2MoNCwgInRlc3QgZGF0YSIpOworCWRhdGEtPmwzaCA9ICZkYXRhLT5kYXRhWzBdOworCXZhbCA9ICh1bnNpZ25lZCBpbnQgKiltc2diX3B1dChkYXRhLCA0KTsKKwkqdmFsID0gdGVzdF92YWx1ZTsKKworCW1hdGNoZWQgPSAwOworCXNjY3Bfd3JpdGUoZGF0YSwgJnNjY3Bfc3NuX2Jzc2FwLCAmc2NjcF9zc25fYnNzYXAsIDApOworCisJaWYgKCFtYXRjaGVkKQorCSAgICBGQUlMKCJUYWxraW5nIHdpdGggdXMgZGlkbid0IHdvcmtcbiIpOworCisJbXNnYl9mcmVlKGRhdGEpOworfQorCisKKy8qIGNvbm5lY3Rpb24gdGVzdGluZy4uLiBvcGVuLCBzZW5kLCBjbG9zZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgKmN1cnJlbnRfY29uX3Rlc3Q7CitzdGF0aWMgc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqb3V0Z29pbmdfY29uOworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmluY29taW5nX2NvbjsKK3N0YXRpYyBpbnQgb3V0Z29pbmdfZGF0YSwgaW5jb21pbmdfZGF0YSwgaW5jb21pbmdfc3RhdGUsIG91dGdvaW5nX3N0YXRlOworCitzdGF0aWMgc3RydWN0IG1zZ2IgKnRlc3RfZGF0YTEsICp0ZXN0X2RhdGEyLCAqdGVzdF9kYXRhMzsKKworc3RhdGljIHZvaWQgc2NjcF9jb25uX2luX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBvbGRfc3RhdGUpCit7CisJcHJpbnRmKCJcdGluY29tZTogJWQgLT4gJWRcbiIsIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gaW5jb21pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCWluY29taW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCSsraW5jb21pbmdfZGF0YTsKKwlwcmludGYoIlx0aW5jb21pbmcgZGF0YTogJWRcbiIsIGxlbik7CisKKwkvKiBjb21wYXJlIHRoZSBkYXRhICovCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5jb21pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTEtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTEtPmwzaCwgbGVuKSk7CisKKwkJfQorCX0gZWxzZSBpZiAoaW5jb21pbmdfZGF0YSA9PSAyKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTItPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTItPmwzaCwgbGVuKSk7CisJCX0KKwl9CisKKwkvKiBzZW5kaW5nIG91dCBkYXRhICovCisJaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlwcmludGYoIlx0UmV0dXJuaW5nIGRhdGEzXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKGNvbm4sIHRlc3RfZGF0YTMpOworCX0KK30KKworc3RhdGljIGludCBzY2NwX2Nvbm5fYWNjZXB0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHZvaWQgKmN0eCkKK3sKKwlwcmludGYoIlx0YWNjZXB0OiAlcFxuIiwgY29ubik7CisJY29ubi0+c3RhdGVfY2IgPSBzY2NwX2Nvbm5faW5fc3RhdGU7CisJY29ubi0+ZGF0YV9jYiA9IHNjY3BfY29ubl9pbl9kYXRhOworCisJaWYgKGN1cnJlbnRfY29uX3Rlc3QtPnJlZnVzZSkKKwkJcmV0dXJuIC0xOworCisJaW5jb21pbmdfY29uID0gY29ubjsKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2tzIGZvciB0aGUgb3V0Z29pbmcgc2lkZSAqLworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRvdXRnb2luZzogJXAgJWQgLT4gJWRcbiIsIGNvbm4sIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisKKwlpZiAoY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlpZiAoY29ubiA9PSBvdXRnb2luZ19jb24pIHsKKwkJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm4pOworCQkJb3V0Z29pbmdfY29uID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJKytvdXRnb2luZ19kYXRhOworCXByaW50ZigiXHRvdXRnb2luZyBkYXRhOiAlcCAlZFxuIiwgY29ubiwgbGVuKTsKKworCWlmIChsZW4gIT0gNCkKKwkJRkFJTCgiTGVuZ3RoIG9mIHBhY2tldCBpcyB3cm9uZzogJXUgJXVcbiIsIG1zZ2JfbDNsZW4obXNnKSwgbGVuKTsKKworCWlmIChvdXRnb2luZ19kYXRhID09IDEpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMy0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWRcbiIpOworCQkJb3V0Z29pbmdfc3RhdGUgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb190ZXN0X3NjY3BfY29ubmVjdGlvbihjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICp0ZXN0KQoreworCWludCByZXQ7CisKKwljdXJyZW50X2Nvbl90ZXN0ID0gdGVzdDsKKwlvdXRnb2luZ19jb24gPSBpbmNvbWluZ19jb24gPSAwOworCisJb3V0Z29pbmdfY29uID0gc2NjcF9jb25uZWN0aW9uX3NvY2tldCgpOworCWlmICghb3V0Z29pbmdfY29uKSB7CisJCUZBSUwoIkNvbm5lY3Rpb24gaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlvdXRnb2luZ19jb24tPnN0YXRlX2NiID0gc2NjcF9jb25uX291dF9zdGF0ZTsKKwlvdXRnb2luZ19jb24tPmRhdGFfY2IgPSBzY2NwX2Nvbm5fb3V0X2RhdGE7CisJb3V0Z29pbmdfZGF0YSA9IGluY29taW5nX2RhdGEgPSAwOworCWluY29taW5nX3N0YXRlID0gb3V0Z29pbmdfc3RhdGUgPSAxOworCisJLyogc3RhcnQgdGVzdGluZyAqLworCWlmICh0ZXN0LT53aXRoX2RhdGEpIHsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCB0ZXN0X2RhdGExKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0gZWxzZSB7CisJCSsraW5jb21pbmdfZGF0YTsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCBOVUxMKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0KKworCWlmICh0ZXN0LT5yZWZ1c2UpIHsKKwkJaWYgKG91dGdvaW5nX2NvbikKKwkJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiByZWZ1c2VkLlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKCFpbmNvbWluZ19jb24pCisJCQlGQUlMKCJDcmVhdGluZyBpbmNvbWluZyBkaWRuJ3Qgd29yay5cbiIpOworCisJCXByaW50ZigiXHRXcml0aW5nIHRlc3QgZGF0YTJcbiIpOworCQlzY2NwX2Nvbm5lY3Rpb25fd3JpdGUob3V0Z29pbmdfY29uLCB0ZXN0X2RhdGEyKTsKKwkJc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQob3V0Z29pbmdfY29uKTsKKworCQkvKiBjbG9zaW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKHRlc3QtPmNsb3NlX3NpZGUgPT0gMCkKKwkJCXJldCA9IHNjY3BfY29ubmVjdGlvbl9jbG9zZShvdXRnb2luZ19jb24sIDApOworCQllbHNlCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2UoaW5jb21pbmdfY29uLCAwKTsKKworCQlpZiAocmV0ICE9IDApCisJCQlGQUlMKCJDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGZhaWxlZFxuIik7CisJfQorCisJLyogb3V0Z29pbmcgc2hvdWxkIGJlIGdvbmUgbm93ICovCisJaWYgKG91dGdvaW5nX2NvbikKKwkJRkFJTCgiT3V0Z29pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3Blcmx5IGNsb3NlZFxuIik7CisKKwlpZiAoaW5jb21pbmdfY29uKQorCQlGQUlMKCJJbmNvbWluZyBjb25uZWN0aW9uIHdhcyBub3QgcHJvcGVyeSBjbG9zZWQuXG4iKTsKKworCWlmICh0ZXN0LT5yZWZ1c2UgPT0gMCkgeworCQlpZiAob3V0Z29pbmdfZGF0YSAhPSAxIHx8IGluY29taW5nX2RhdGEgIT0gMikgeworCQkJRkFJTCgiRGF0YSBzZW5kaW5nIGZhaWxlZDogJWQvJWQgJWQvJWRcbiIsCisJCQkgICAgIG91dGdvaW5nX2RhdGEsIDEsCisJCQkgICAgIGluY29taW5nX2RhdGEsIDIpOworCQl9CisJfQorCisJaWYgKCFpbmNvbWluZ19zdGF0ZSB8fCAhb3V0Z29pbmdfc3RhdGUpCisJCUZBSUwoIkZhaWx1cmUgd2l0aCB0aGUgc3RhdGUgdHJhbnNpdGlvbi4gJWQgJWRcbiIsCisJCSAgICAgb3V0Z29pbmdfc3RhdGUsIGluY29taW5nX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX2Nvbm5lY3Rpb24odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9jb25uX2FjY2VwdCwgTlVMTCk7CisKKwl0ZXN0X2RhdGExID0gbXNnYl9hbGxvYyg0LCAiZGF0YTEiKTsKKwl0ZXN0X2RhdGExLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGExLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTEtPmwzaCkgPSAweDIzNDIxMTIyOworCisJdGVzdF9kYXRhMiA9IG1zZ2JfYWxsb2MoNCwgImRhdGEyIik7CisJdGVzdF9kYXRhMi0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMiwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGEyLT5sM2gpID0gMHg0MjIzMjIxMTsKKworCXRlc3RfZGF0YTMgPSBtc2diX2FsbG9jKDQsICJkYXRhMyIpOworCXRlc3RfZGF0YTMtPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTMsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMy0+bDNoKSA9IDB4MjMyM2ZmNTU7CisKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShjb25uZWN0aW9uX3Rlc3RzKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJcHJpbnRmKCJUZXN0aW5nICVkIHJlZnVzZTogJWQgd2l0aF9kYXRhOiAlZFxuIiwKKwkJCWN1cnJlbnRfdGVzdCwgY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdLnJlZnVzZSwKKwkJCWNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS53aXRoX2RhdGEpOworCQlkb190ZXN0X3NjY3BfY29ubmVjdGlvbigmY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdKTsKKwl9CisKKwltc2diX2ZyZWUodGVzdF9kYXRhMSk7CisJbXNnYl9mcmVlKHRlc3RfZGF0YTIpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEzKTsKK30KKworLyogaW52YWxpZCBpbnB1dCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCh2b2lkKQoreworCXByaW50ZigidHJ5aW5nIHRvIHByb3Zva2UgYSBjcmFzaCB3aXRoIGludmFsaWQgaW5wdXRcbiIpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJaW50IG9yaWdpbmFsX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IG9yaWdpbmFsX2xlbmd0aCArIDI7CisJCWludCBpOworCisJCXByaW50ZigiVGVzdGluZyBwYWNrZXQ6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCisJCWZvciAoaSA9IGxlbmd0aDsgaSA+PSAwOyAtLWkpIHsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBNSU4odGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoLCBpKTsKKwkJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW5ndGgpOworCQkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCQkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl9CisJfQorCisJcHJpbnRmKCJzdXJ2aXZlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9wYXJzaW5nKHZvaWQpCit7CisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHBhcnNlX3Jlc3VsdCk7ICsrY3VycmVudF90ZXN0KSB7CisJCXN0cnVjdCBtc2diICptc2c7CisJCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwkJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSgxMDI0LCAxMjgsICJwYXJzZS10ZXN0Iik7CisJCW1zZ2JfcHV0KG1zZywgMSk7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dF9sZW4pOworCQltZW1jcHkobXNnLT5sMmgsIHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmlucHV0LCBtc2diX2wybGVuKG1zZykpOworCisJCW1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CisJCWlmIChzY2NwX3BhcnNlX2hlYWRlcihtc2csICZyZXN1bHQpICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRlc3Q6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLndhbnRlZF9sZW4gIT0gcmVzdWx0LmRhdGFfbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIGRhdGEgbGVuZ3RoLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19zcmNfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCQkJICAgJnBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19yZWYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSkgIT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNSQyBSRUYgZGlkIG5vdCBtYXRjaFxuIik7CisJCQkJCWFib3J0KCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaGFzX2RzdF9yZWYpIHsKKwkJCQlpZiAobWVtY21wKHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3RfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJEU1QgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19zc24gIT0gLTEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbXBsZW1lbnRlZC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3Rfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCQl9CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl0ZXN0X3NjY3Bfc3lzdGVtKCk7CisJdGVzdF9zY2NwX3NlbmRfdWR0KCk7CisJdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKCk7CisJdGVzdF9zY2NwX2Nvbm5lY3Rpb24oKTsKKwl0ZXN0X3NjY3Bfc3lzdGVtX2NyYXNoKCk7CisJdGVzdF9zY2NwX3BhcnNpbmcoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYl9zdG9yZV9jb3VudGVyKCkge30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc21zLnR4dCBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM4ODViCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zbXMudHh0CkBAIC0wLDAgKzEsNTAgQEAKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIDM5IDAxIDFhIDAwIDAxIDAwIDA3IDkxIDU1IDExIDE4IDMxIDI4IDAwIDBlIDMxIDIwIDA0IDgxIDIxIDQzIDAwIDAwIGZmIDA0IGQ0IGYyIDljIDBlCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIC0KKzM5IC0gVHJhbnNhY3Rpb25JRCAzLCBTTVMgbWVzc2FnZXMJOjogZ2gtPnByb3RvX2Rpc2NyCiswMSAtIENQLURBVEEJCQkJOjogZ2gtPm1zZ190eXBlCisxYSAtIExlbmd0aDogMjYJCQkJOjogZ2gtPmRhdGFbMF0KKzAwIC0gTVRJIDAgUlAtREFUQSAobXMtPm4pCiswMSAtIE1SIDEKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLCBOdW1iZXJpbmcgUGxhbgorNTUgMTEgMTggMzEgMjggMDAgLSA1NTExODExMzgyMDAKKzBlIC0gUlAtVUQgbGVuICgxNCkKKworVFBEVSAoMTQgYnl0ZSk6CiszMSAtIE1USSgwMSksIFZQRigyOnJlbGF0aXZlKSwgTU1TKDApLCBTUkkoMSksIFVESEkoMCksIFJQKDApCisyMCAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbiwgTmF0aW9uYWwgbnVtYmVyCisyMSA0MyAtIERBIDEyMzQKKzAwIC0gUElECiswMCAtIERDUworZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzA0IC0gVXNlciBEYXRhIGxlbmd0aCAoMDQpCitkNCBmMiA5YyAwZSAtIGdzbV9kZWZhdWx0IDdiaXQgZW5jb2RlZCAiVGVzdCIgKDQgYnl0ZSkKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgMDkgMDEgOWMgMDAgZGEgMDAgMDcgOTEgODggOTYgMTMgMDAgMDAgOTkgOTAgMTEgN2IgMDQgODEgMjIgMjIgMDAgMDggZmYgODYgNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgLSBsb3dlciBsZXZlbHMKKzA5IC0gVHJhbnNhY3Rpb25JRCAwLCBTTVMgbWVzc2FnZXMKKzAxIC0gQ1AtREFUQQorOWMgLSBMZW5ndGg6ICgxNTYpCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorZGEgLSBNUiAoPykKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLgorODggOTYgMTMgMDAgMDAgOTkKKzkwIC0gUlAtVUQgbGVuICgxNDQpCisxMSAtCis3YiAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbgorMjIgMjIgLSBBZGRyZXNzIDIyMjIKKzAwIC0gUElECiswOCAtIERDUyAoVUNTMiBjaGFyc2V0KQorZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzg2IC0gVXNlciBEYXRhIGxlbmd0aCAoMTM0KQorNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90b29scy9obHJzdGF0LnBsIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2OGZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rvb2xzL2hscnN0YXQucGwKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgREJJOworbXkgJGRiaCA9IERCSS0+Y29ubmVjdCgiZGJpOlNRTGl0ZTpkYm5hbWU9aGxyLnNxbGl0ZTMiLCIiLCIiKTsKKworCitteSAlbWNjX25hbWVzOworbXkgJW1jY19tbmNfbmFtZXM7CisKK3N1YiBnZXRfbWNjX21uY19uYW1lKCQpCit7CisJbXkgJG1jY19tbmMgPSBzaGlmdDsKKwlteSAkcmV0ID0gJG1jY19tbmM7CisKKwlpZiAoJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9IG5lICcnKSB7CisJCSRyZXQgPSAkbWNjX21uY19uYW1lc3skbWNjX21uY307CisJfQorCisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiByZWFkX25ldHdvcmtzKCQpCit7CisJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisJbXkgJGN1cl9uYW1lOworCisJb3BlbihJTkZJTEUsICRmaWxlbmFtZSk7CisJd2hpbGUgKG15ICRsID0gPElORklMRT4pIHsKKwkJY2hvbXAoJGwpOworCQlpZiAoJGwgPX4gL14jLykgeworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGwgPX4gL15cdC8pIHsKKwkJCW15ICgkbWNjLCAkbW5jLCAkYnJhbmQsICRyKSA9IHNwbGl0KCcgJywgJGwsIDQpOworCQkJI3ByaW50ZigiJXN8JXN8JXNcbiIsICRtY2MsICRtbmMsICRicmFuZCk7CisJCQkkbWNjX21uY19uYW1lc3siJG1jYy0kbW5jIn0gPSAkYnJhbmQ7CisJCQkkbWNjX25hbWVzeyRtY2N9ID0gJGN1cl9uYW1lOworCQl9IGVsc2lmICgkbCA9fiAvXihcd1x3KVx0KC4qKS8pIHsKKwkJCSNwcmludGYoIiVzfCVzXG4iLCAkMSwgJDIpOworCQkJJGN1cl9uYW1lID0gJDI7CisJCX0KKwl9CisJY2xvc2UoSU5GSUxFKTsKK30KKworcmVhZF9uZXR3b3JrcygibmV0d29ya3MudGFiIik7CisKK215ICVvcGVyX2NvdW50OworbXkgJWNvdW50cnlfY291bnQ7CisKKyNteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUIGltc2kgRlJPTSBzdWJzY3JpYmVyIHdoZXJlIGF1dGhvcml6ZWQ9MSIpOworbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciIpOworCiskc3RoLT5leGVjdXRlKCk7CisKK3doaWxlIChteSAkaHJlZiA9ICRzdGgtPmZldGNocm93X2hhc2hyZWYpIHsKKwlteSAoJG1jYywgJG1uYykgPSAkJGhyZWZ7aW1zaX0gPX4gLyhcZHszfSkoXGR7Mn0pLiovOworCSNwcmludGYoIiVzICVzLSVzIFxuIiwgJCRocmVme2ltc2l9LCAkbWNjLCAkbW5jKTsKKwkkb3Blcl9jb3VudHsiJG1jYy0kbW5jIn0rKzsKKwkkY291bnRyeV9jb3VudHskbWNjfSsrOworfQorCisKK2ZvcmVhY2ggbXkgJGMgKHNvcnR7JGNvdW50cnlfY291bnR7JGJ9IDw9PiAkY291bnRyeV9jb3VudHskYX19IGtleXMgJWNvdW50cnlfY291bnQpIHsKKwlwcmludGYoIiVzOiAlZFxuIiwgJG1jY19uYW1lc3skY30sICRjb3VudHJ5X2NvdW50eyRjfSk7CisKKwlmb3JlYWNoIG15ICRrIChzb3J0eyRvcGVyX2NvdW50eyRifSA8PT4gJG9wZXJfY291bnR7JGF9fSBrZXlzICVvcGVyX2NvdW50KSB7CisJCWlmICgkayA9fiAvXiRjLS8pIHsKKwkJCXByaW50ZigiXHQlczogJWRcbiIsIGdldF9tY2NfbW5jX25hbWUoJGspLCAkb3Blcl9jb3VudHska30pOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZSBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACithc24xX2dlbi8qCisqLm8KKyouYQorcnJscC10ZXN0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9DT1BZSU5HIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcwODhlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpAQCAtMCwwICsxLDIgQEAKK1NlZSB0aGUgaW5jbHVkZWQgZ3BsLTIuMC50eHQgb3IgZ3BsLTMuMC50eHQgZGVwZW5kaW5nIG9uIHlvdXIKK3ByZWZlcmVuY2VzLgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUgYi9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJjYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NCBAQAorCitBU04xQz0uLi8uLi8uLi90bXAvcnJscC9hc24xYy9hc24xYy9hc24xYworQVNOMV9JTkNMVURFPS9ob21lL3RudC90bXAvcnJscC9hc24xYy9za2VsZXRvbnMKK0NDPWdjYworQ0ZMQUdTPS1JJChBU04xX0lOQ0xVREUpIC1JYXNuMV9nZW4gLU8zIC1XYWxsCisKK0FTTjFfRklMRVM9JCh3aWxkY2FyZCBhc24xLyouYXNuKQorCisKK2FsbDogcnJscC10ZXN0CisKKworcnJscC10ZXN0OiBsaWJnc20tYXNuMS5hIGdwcy5vIHVieC5vIHVieC1wYXJzZS5vIHJybHAubyBtYWluLm8KKwkkKENDKSAtbyAkQCBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vIC1MLiAtbGdzbS1hc24xIC1sbQorCisKKyMKKyMgQVNOMSBmaWxlIGF1dG9nZW5lcmF0aW9uIChuZWVkIHJlY3Vyc2l2ZSBtYWtlZmlsZSBjYWxsKQorIworCitBU04xX1NPVVJDRVMgPSAkKHdpbGRjYXJkIGFzbjFfZ2VuLyouYykKK0FTTjFfT0JKRUNUUyA9ICQoQVNOMV9TT1VSQ0VTOi5jPS5vKQorCitsaWJnc20tYXNuMS5hOiAkKEFTTjFfRklMRVMpCisJbWtkaXIgLXAgYXNuMV9nZW4gJiYgXAorCWNkIGFzbjFfZ2VuICYmIFwKKwkkKEFTTjFDKSAtZnNrZWxldG9ucy1jb3B5IC1mbmF0aXZlLXR5cGVzIC1nZW4tUEVSICQoYWRkcHJlZml4IC4uLywkXikKKwlAcm0gYXNuMV9nZW4vY29udmVydGVyLXNhbXBsZS5jIGFzbjFfZ2VuL01ha2VmaWxlLmFtLnNhbXBsZQorCUAkKE1BS0UpIGxpYmdzbS1hc24xLmEuc3VibWFrZQorCitsaWJnc20tYXNuMS5hLnN1Ym1ha2U6ICQoQVNOMV9PQkpFQ1RTKQorCSQoQVIpIHJjcyBsaWJnc20tYXNuMS5hICReCisKKy5QSE9OWTogbGliZ3NtLWFzbjEuYS5zdWJtYWtlCisKKworIworIyBDbGVhbgorIworCitjbGVhbjoKKwlybSAtUmYgYXNuMV9nZW4KKwlybSAtZiBsaWJnc20tYXNuMS5hICoubyBycmxwLXRlc3QKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KQEAgLTAsMCArMSwxMzEgQEAKKy0tICRJZDogTUFQLUJTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xMAlCZWFyZXIgU2VydmljZSBDb2RlcworIAorTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworQmVhcmVyU2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gYmVhcmVyIHNlcnZpY2UsIGEgZ3JvdXAgb2YgYmVhcmVyIHNlcnZpY2VzLCBvciBhbGwgYmVhcmVyCisJLS0gc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwMiBbM10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworRXh0LUJlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gT0NURVQgMToKKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCS0tCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJZiByZWNlaXZlZCB0aGUKKyAgICAtLSBFeHQtVGVsZXNlcnZpY2VDb2RlIHNoYWxsIGJlCisJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4gCisKKworCS0tIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIEJlYXJlclNlcnZpY2VDb2RlLgorCithbGxCZWFyZXJTZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsRGF0YUNEQS1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK2RhdGFDREEtMzAwYnBzCQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2RhdGFDREEtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKK2RhdGFDREEtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDExJ0IKK2RhdGFDREEtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKK2RhdGFDREEtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKK2RhdGFDREEtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTEwJ0IKK2dlbmVyYWwtZGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTExJ0IKKworYWxsRGF0YUNEUy1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDAwJ0IKK2RhdGFDRFMtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDEwJ0IKK2RhdGFDRFMtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAwJ0IKK2RhdGFDRFMtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAxJ0IKK2RhdGFDRFMtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTEwJ0IKK2dlbmVyYWwtZGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTExJ0IKKworYWxsUGFkQWNjZXNzQ0EtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMCdCCitwYWRBY2Nlc3NDQS0zMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMSdCCitwYWRBY2Nlc3NDQS0xMjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorcGFkQWNjZXNzQ0EtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDExJ0IKK3BhZEFjY2Vzc0NBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDEwMCdCCitwYWRBY2Nlc3NDQS00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDEnQgorcGFkQWNjZXNzQ0EtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTEwJ0IKK2dlbmVyYWwtcGFkQWNjZXNzQ0EJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMSdCCisKK2FsbERhdGFQRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTAwMCdCCitkYXRhUERTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMCdCCitkYXRhUERTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMSdCCitkYXRhUERTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMCdCCitnZW5lcmFsLWRhdGFQRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMSdCCisKK2FsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMTAwMDAnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTExMDAwJ0IKKworYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAwMDAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDEwMDAnQgorCistLSBUaGUgZm9sbG93aW5nIG5vbi1oaWVyYXJjaGljYWwgQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UKKy0tIEdyb3VwcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAzMDoKK2FsbERhdGFDaXJjdWl0QXN5bmNocm9ub3VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIgYW5kCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIgorYWxsQXN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RBLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEiIGFuZCAiYWxsUGFkQWNjZXNzQ0RBLVNlcnZpY2VzIgorYWxsRGF0YUNpcmN1aXRTeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDExMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDRFMtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUyIKK2FsbFN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiIGFuZCAiYWxsRGF0YVBEUy1TZXJ2aWNlcyIKKy0tCistLSBDb21wb3VuZCBCZWFyZXIgU2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFBMTU4tc3BlY2lmaWNCUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNCUy0xCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDEnQgorcGxtbi1zcGVjaWZpY0JTLTIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljQlMtMwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNCUy00CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDAnQgorcGxtbi1zcGVjaWZpY0JTLTUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljQlMtNglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNCUy03CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTEnQgorcGxtbi1zcGVjaWZpY0JTLTgJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljQlMtOQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1BCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTAnQgorcGxtbi1zcGVjaWZpY0JTLUIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljQlMtQwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy1ECUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDEnQgorcGxtbi1zcGVjaWZpY0JTLUUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljQlMtRglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDIwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjMzIEBACistLSAkSWQ6IE1BUC1Db21tb25EYXRhVHlwZXMuYXNuIDMwNDcwIDIwMDktMTAtMTAgMTI6Mzc6NTZaIGtyaiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjgJQ29tbW9uIGRhdGEgdHlwZXMKKworTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gZ2VuZXJhbCBkYXRhIHR5cGVzIGFuZCB2YWx1ZXMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwltYXhJU0ROLUFkZHJlc3NMZW5ndGgsCisJRlROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUV4dGVybmFsU2lnbmFsSW5mbywgCisJRXh0LUV4dGVybmFsU2lnbmFsSW5mbywgCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlTaWduYWxJbmZvLAorCW1heFNpZ25hbEluZm9MZW5ndGgsCisJQWxlcnRpbmdQYXR0ZXJuLAorCVRCQ0QtU1RSSU5HLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgbnVtYmVyaW5nIGFuZCBpZGVudGlmaWNhdGlvbgorCUlNU0ksCisJVE1TSSwgCisJSWRlbnRpdHksCisJU3Vic2NyaWJlcklkLAorCUlNRUksCisJSExSLUxpc3QsCisJTE1TSSwKKwlHbG9iYWxDZWxsSWQsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UsCisJTkFFQS1QcmVmZXJyZWRDSSwgCisJTkFFQS1DSUMsIAorCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJUExNTi1JZCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIENBTUVMCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksIAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCUxBSUZpeGVkTGVuZ3RoLAorCisJLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZSwKKwlFTUxQUC1JbmZvLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNQy1TUy1JbmZvLAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHQtU1MtU3RhdHVzLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCisJTENTU2VydmljZVR5cGVJRCwKKy0tLSBXUyBhZGRlZCBleHBvcnRzIG5lZWRlZCBieSBnc21fbWFwLmFzbiAoZXh0cmEgYXNuMSBmaWxlIHRvIGhhbmRsZSBvbGRlciBwcm90LiB2ZXIuKQorCVByb3RvY29sSWQsCisJTENTU2VydmljZVR5cGVJRAkKKzsKKworSU1QT1JUUworCVRlbGVzZXJ2aWNlQ29kZSwKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUJlYXJlclNlcnZpY2VDb2RlLAorCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKKy0tIGdlbmVyYWwgZGF0YSB0eXBlcworCitUQkNELVNUUklORyA6Oj0gT0NURVQgU1RSSU5HCisJLS0gVGhpcyB0eXBlIChUZWxlcGhvbnkgQmluYXJ5IENvZGVkIERlY2ltYWwgU3RyaW5nKSBpcyB1c2VkIHRvCisJLS0gcmVwcmVzZW50IHNldmVyYWwgZGlnaXRzIGZyb20gMCB0aHJvdWdoIDksICosICMsIGEsIGIsIGMsIHR3bworCS0tIGRpZ2l0cyBwZXIgb2N0ZXQsIGVhY2ggZGlnaXQgZW5jb2RlZCAwMDAwIHRvIDEwMDEgKDAgdG8gOSksCisJLS0gMTAxMCAoKiksIDEwMTEgKCMpLCAxMTAwIChhKSwgMTEwMSAoYikgb3IgMTExMCAoYyk7IDExMTEgdXNlZAorCS0tIGFzIGZpbGxlciB3aGVuIHRoZXJlIGlzIGFuIG9kZCBudW1iZXIgb2YgZGlnaXRzLgorCisJLS0gYml0cyA4NzY1IG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMm4KKwktLSBiaXRzIDQzMjEgb2Ygb2N0ZXQgbiBlbmNvZGluZyBkaWdpdCAyKG4tMSkgKzEKKworQWRkcmVzc1N0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgZm9yIGFkZHJlc3NpbmcKKwktLSBwdXJwb3Nlcy4gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIG5hdHVyZSBvZiBhZGRyZXNzLCBhbmQgbnVtYmVyaW5nIHBsYW4KKwktLQkJaW5kaWNhdG9yLgorCS0tCWIpCWRpZ2l0cyBvZiBhbiBhZGRyZXNzIGVuY29kZWQgYXMgVEJDRC1TdHJpbmcuCisKKwktLSBhKQlUaGUgZmlyc3Qgb2N0ZXQgaW5jbHVkZXMgYSBvbmUgYml0IGV4dGVuc2lvbiBpbmRpY2F0b3IsIGEKKwktLQkJMyBiaXRzIG5hdHVyZSBvZiBhZGRyZXNzIGluZGljYXRvciBhbmQgYSA0IGJpdHMgbnVtYmVyaW5nCisJLS0JCXBsYW4gaW5kaWNhdG9yLCBlbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tIGJpdHMgNzY1OiBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IKKwktLQkwMDAgIHVua25vd24KKwktLQkwMDEgIGludGVybmF0aW9uYWwgbnVtYmVyCisJLS0JMDEwICBuYXRpb25hbCBzaWduaWZpY2FudCBudW1iZXIKKwktLQkwMTEgIG5ldHdvcmsgc3BlY2lmaWMgbnVtYmVyCisJLS0JMTAwICBzdWJzY3JpYmVyIG51bWJlcgorCS0tCTEwMSAgcmVzZXJ2ZWQKKwktLQkxMTAgIGFiYnJldmlhdGVkIG51bWJlcgorCS0tCTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0gYml0cyA0MzIxOiBudW1iZXJpbmcgcGxhbiBpbmRpY2F0b3IKKwktLQkwMDAwICB1bmtub3duCisJLS0JMDAwMSAgSVNETi9UZWxlcGhvbnkgTnVtYmVyaW5nIFBsYW4gKFJlYyBJVFUtVCBFLjE2NCkKKwktLQkwMDEwICBzcGFyZQorCS0tCTAwMTEgIGRhdGEgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBYLjEyMSkKKwktLQkwMTAwICB0ZWxleCBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEYuNjkpCisJLS0JMDEwMSAgc3BhcmUKKwktLQkwMTEwICBsYW5kIG1vYmlsZSBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEUuMjEyKQorCS0tCTAxMTEgIHNwYXJlCisJLS0JMTAwMCAgbmF0aW9uYWwgbnVtYmVyaW5nIHBsYW4KKwktLQkxMDAxICBwcml2YXRlIG51bWJlcmluZyBwbGFuCisJLS0JMTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0JYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLSBiKQlUaGUgZm9sbG93aW5nIG9jdGV0cyByZXByZXNlbnRpbmcgZGlnaXRzIG9mIGFuIGFkZHJlc3MKKwktLQkJZW5jb2RlZCBhcyBhIFRCQ0QtU1RSSU5HLgorCittYXhBZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMAorCitJU0ROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4SVNETi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBudW1iZXJzLgorCittYXhJU0ROLUFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDkKKworRlROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4RlROLUFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBmb3J3YXJkZWQtdG8gbnVtYmVycy4gCisJLS0gSWYgTkFJID0gaW50ZXJuYXRpb25hbCB0aGUgZmlyc3QgZGlnaXRzIHJlcHJlc2VudCB0aGUgY291bnRyeSBjb2RlIChDQykKKwktLSBhbmQgdGhlIG5ldHdvcmsgZGVzdGluYXRpb24gY29kZSAoTkRDKSBhcyBmb3IgRS4xNjQuCisKK21heEZUTi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAxNQorCitJU0ROLVN1YmFkZHJlc3NTdHJpbmcgOjo9IAorCQkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhJU0ROLVN1YmFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0ROIHN1YmFkZHJlc3Nlcy4KKwktLSBJdCBpcyBjb21wb3NlZCBvZgorCS0tCWEpCW9uZSBvY3RldCBmb3IgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBvZGQvZXZlbiBpbmRpY2F0b3IuCisJLS0JYikJMjAgb2N0ZXRzIGZvciBzdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCisJLS0JYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyB0eXBlIG9mIHN1YmFkZHJlc3MgYW5kIGEgb25lIGJpdCBvZGQvZXZlbiBpbmRpY2F0b3IsCisJLS0JCWVuY29kZWQgYXMgZm9sbG93czoKKworCS0tCWJpdCA4OiAxICAobm8gZXh0ZW5zaW9uKQorCisJLS0JYml0cyA3NjU6IHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQkwMDAgIE5TQVAgKFguMjEzL0lTTyA4MzQ4IEFEMikKKwktLQkJMDEwICBVc2VyIFNwZWNpZmllZAorCS0tCQlBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAorCisJLS0JYml0IDQ6IG9kZC9ldmVuIGluZGljYXRvcgorCS0tCQkwICBldmVuIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJMSAgb2RkIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJVGhlIG9kZC9ldmVuIGluZGljYXRvciBpcyB1c2VkIHdoZW4gdGhlIHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQlpcyAidXNlciBzcGVjaWZpZWQiIGFuZCB0aGUgY29kaW5nIGlzIEJDRC4KKworCS0tCWJpdHMgMzIxOiAwMDAgKHVudXNlZCkKKworCS0tCWIpIFN1YmFkZHJlc3MgaW5mb3JtYXRpb24uCisJLS0JVGhlIE5TQVAgWC4yMTMvSVNPODM0OEFEMiBhZGRyZXNzIHNoYWxsIGJlIGZvcm1hdHRlZCBhcyBzcGVjaWZpZWQKKwktLQlieSBvY3RldCA0IHdoaWNoIGNvbnRhaW5zIHRoZSBBdXRob3JpdHkgYW5kIEZvcm1hdCBJZGVudGlmaWVyCisJLS0JKEFGSSkuIFRoZSBlbmNvZGluZyBpcyBtYWRlIGFjY29yZGluZyB0byB0aGUgInByZWZlcnJlZCBiaW5hcnkKKwktLQllbmNvZGluZyIgYXMgZGVmaW5lZCBpbiBYLjIxMy9JU084MzRBRDIuIEZvciB0aGUgZGVmaW5pdGlvbgorCS0tCW9mIHRoaXMgdHlwZSBvZiBzdWJhZGRyZXNzLCBzZWUgSVRVLVQgUmVjIEkuMzM0LgorCisJLS0JRm9yIFVzZXItc3BlY2lmaWMgc3ViYWRkcmVzcywgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIGFjY29yZGluZworCS0tCXRvIHRoZSB1c2VyIHNwZWNpZmljYXRpb24sIHN1YmplY3QgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZiAyMAorCS0tCW9jdGV0cy4gV2hlbiBpbnRlcndvcmtpbmcgd2l0aCBYLjI1IG5ldHdvcmtzIEJDRCBjb2Rpbmcgc2hvdWxkCisJLS0JYmUgYXBwbGllZC4KKworbWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMQorCitFeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwcm90b2NvbElkCVByb3RvY29sSWQsCisJc2lnbmFsSW5mbwlTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4KKwktLSBjbGF1c2UgNy42LjkuCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwktLSBleHRlbnNpb25Db250YWluZXIgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDIKKwkuLi59CisKK1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4U2lnbmFsSW5mb0xlbmd0aCkpCisKK21heFNpZ25hbEluZm9MZW5ndGggIElOVEVHRVIgOjo9IDIwMAorCS0tIFRoaXMgTmFtZWRWYWx1ZSByZXByZXNlbnRzIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMKKwktLSBhdmFpbGFibGUgdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIFNpZ25hbEluZm8gZGF0YSB0eXBlLAorCS0tIHdpdGhvdXQgcmVxdWlyaW5nIHNlZ21lbnRhdGlvbiB0byBjb3BlIHdpdGggdGhlIG5ldHdvcmsgbGF5ZXIgc2VydmljZS4KKwktLSBIb3dldmVyLCB0aGUgYWN0dWFsIG1heGltdW0gc2l6ZSBhdmFpbGFibGUgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhCisJLS0gdHlwZSBtYXkgYmUgbG93ZXIsIGVzcGVjaWFsbHkgd2hlbiBvdGhlciBpbmZvcm1hdGlvbiBlbGVtZW50cworCS0tIGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcG9uZW50LgorCitQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlnc20tMDQwOCAgKDEpLAorCWdzbS0wODA2ICAoMiksCisJZ3NtLUJTU01BUCAgKDMpLAorCS0tIFZhbHVlIDMgaXMgcmVzZXJ2ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQKKwlldHMtMzAwMTAyLTEgICg0KX0KKworRXh0LUV4dGVybmFsU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWV4dC1Qcm90b2NvbElkCUV4dC1Qcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LjEwCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1Qcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlldHMtMzAwMzU2ICAoMSksCisJLi4uIAorCSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIHNlcXVlbmNlLgorCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFjY2Vzc05ldHdvcmtQcm90b2NvbElkCUFjY2Vzc05ldHdvcmtQcm90b2NvbElkLAorCXNpZ25hbEluZm8JTG9uZ1NpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbiBjbGF1c2UgNy42LjkuMQorCQorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMb25nU2lnbmFsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhMb25nU2lnbmFsSW5mb0xlbmd0aCkpCisKK21heExvbmdTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyNTYwCisJLS0gVGhpcyBOYW1lZCBWYWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMgYXZhaWxhYmxlCisJLS0gdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIExvbmdTaWduYWxJbmZvIGRhdGEgdHlwZSB1c2luZworCS0tIFdoaXRlIEJvb2sgU0NDUCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cy4KKwktLSBJdCB0YWtlcyBhY2NvdW50IG9mIHRoZSBvY3RldHMgdXNlZCBieSB0aGUgbG93ZXIgbGF5ZXJzIG9mIHRoZSBwcm90b2NvbCwgYW5kCisJLS0gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworQWNjZXNzTmV0d29ya1Byb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgeworCXRzM0ctNDgwMDYgICAoMSksCisJdHMzRy0yNTQxMyAoMiksCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKwktLSBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWxlcnRpbmdQYXR0ZXJuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpICkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgQWxlcnRpbmcgUGF0dGVybgorCisJLS0JYml0cyA4NzY1IDogMDAwMCAodW51c2VkKQorCisJLS0JYml0cyA0MyA6IHR5cGUgb2YgUGF0dGVybgorCS0tCQkwMCBsZXZlbAorCS0tCQkwMSBjYXRlZ29yeQorCS0tCQkxMCBjYXRlZ29yeQorCS0tCQlhbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZC4KKworCS0tCWJpdHMgMjEgOiB0eXBlIG9mIGFsZXJ0aW5nCisKK2FsZXJ0aW5nTGV2ZWwtMCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAwJ0IKK2FsZXJ0aW5nTGV2ZWwtMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAxJ0IKK2FsZXJ0aW5nTGV2ZWwtMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDEwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIGxldmVsIGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIExldmVscyBhcmUgZGVmaW5lZCBpbiBHU00gMDIuMDcKKwkKK2FsZXJ0aW5nQ2F0ZWdvcnktMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAxJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMyAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTEwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTExJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAxMDAwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIENhdGVnb3J5IGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIGNhdGVnb3JpZXMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisKKy0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKworSU1TSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDMuLjgpKQorCS0tIGRpZ2l0cyBvZiBNQ0MsIE1OQywgTVNJTiBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIuCisKK0lkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlJTVNJLAorCWltc2ktV2l0aExNU0kJSU1TSS1XaXRoTE1TSX0KKworSU1TSS1XaXRoTE1TSSA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJLAorCS0tIGEgc3BlY2lhbCB2YWx1ZSAwMDAwMDAwMCBpbmRpY2F0ZXMgdGhhdCB0aGUgTE1TSSBpcyBub3QgaW4gdXNlCisJLi4ufQorCitBU0NJLUNhbGxSZWZlcmVuY2UgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBkaWdpdHMgb2YgVkdDUy9WQlMtYXJlYSxHcm91cC1JRCBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIgaWYgdGhlcmUgaXMgYQorCS0tIFZHQ1MvVkJTLWFyZWEuCisKK1RNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKK1N1YnNjcmliZXJJZCA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJdG1zaQkJCVsxXSBUTVNJfQorCitJTUVJIDo6PSBUQkNELVNUUklORyAoU0laRSAoOCkpCisJLS0JUmVmZXJzIHRvIEludGVybmF0aW9uYWwgTW9iaWxlIFN0YXRpb24gRXF1aXBtZW50IElkZW50aXR5CisJLS0JYW5kIFNvZnR3YXJlIFZlcnNpb24gTnVtYmVyIChTVk4pIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLQlJZiB0aGUgU1ZOIGlzIG5vdCBwcmVzZW50IHRoZSBsYXN0IG9jdGV0IHNoYWxsIGNvbnRhaW4gdGhlCisJLS0JZGlnaXQgMCBhbmQgYSBmaWxsZXIuCisJLS0JSWYgcHJlc2VudCB0aGUgU1ZOIHNoYWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IG9jdGV0LgorCitITFItSWQgOjo9IElNU0kKKwktLSBsZWFkaW5nIGRpZ2l0cyBvZiBJTVNJLCBpLmUuIChNQ0MsIE1OQywgbGVhZGluZyBkaWdpdHMgb2YKKwktLSBNU0lOKSBmb3JtaW5nIEhMUiBJZCBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK0hMUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkhMUi1JZCkgT0YKKwkJCQlITFItSWQKKworbWF4TnVtT2ZITFItSWQgIElOVEVHRVIgOjo9IDUwCisKK0xNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0dsb2JhbENlbGxJZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li43KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK05ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtbiAgKDApLAorCWhsciAgKDEpLAorCXZsciAgKDIpLAorCXB2bHIgICgzKSwKKwljb250cm9sbGluZ01TQyAgKDQpLAorCXZtc2MgICg1KSwKKwllaXIgICg2KSwKKwlyc3MgICg3KX0KKworQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbiAoMCksCisJZ2dzbiAoMSksCisJZ21sYyAoMiksCisJZ3NtU0NGICgzKSwKKwlucGxyICg0KSwKKwlhdWMgKDUpLAorCS4uLiAsCisJdWUgKDYpLAorCW1tZSAoNyl9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCisJLS0gaXQgc2hhbGwgYmUgaWdub3JlZC4KKworCitOQUVBLVByZWZlcnJlZENJIDo6PSBTRVFVRU5DRSB7CisJbmFlYS1QcmVmZXJyZWRDSUMJWzBdIE5BRUEtQ0lDLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTkFFQS1DSUMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJ5IHRoZSBDYXJyaWVyIElkZW50aWZpY2F0aW9uCisJLS0gcGFyYW1ldGVyIGluIEFOU0kgVDEuMTEzLjMuIENhcnJpZXIgY29kZXMgYmV0d2VlbiAiMDAwIiBhbmQgIjk5OSIgbWF5CisJLS0gYmUgZW5jb2RlZCBhcyAzIGRpZ2l0cyB1c2luZyAiMDAwIiB0byAiOTk5IiBvciBhcyA0IGRpZ2l0cyB1c2luZyAKKwktLSAiMDAwMCIgdG8gIjA5OTkiLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjEwMDAiIGFuZCAiOTk5OSIgYXJlIGVuY29kZWQKKwktLSB1c2luZyA0IGRpZ2l0cy4KKworU3Vic2NyaWJlcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcKKwl9CisKK0xDU0NsaWVudEV4dGVybmFsSUQgOjo9IFNFUVVFTkNFIHsKKwlleHRlcm5hbEFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitMQ1NDbGllbnRJbnRlcm5hbElEIDo6PSBFTlVNRVJBVEVEIHsKKwlicm9hZGNhc3RTZXJ2aWNlCSgwKSwKKwlvLWFuZE0tSFBMTU4JKDEpLAorCW8tYW5kTS1WUExNTgkoMiksCisJYW5vbnltb3VzTG9jYXRpb24JKDMpLAorCXRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2UJKDQpLAorCS4uLiB9CistLSBmb3IgYSBDQU1FTCBwaGFzZSAzIFBMTU4gb3BlcmF0b3IgY2xpZW50LCB0aGUgdmFsdWUgdGFyZ2V0TVNzdWJzY3JpYmVkU2VydmljZSBzaGFsbCBiZSB1c2VkCisKK0xDU1NlcnZpY2VUeXBlSUQgOjo9IElOVEVHRVIgKDAuLjEyNykKKwktLSB0aGUgaW50ZWdlciB2YWx1ZXMgMC02MyBhcmUgcmVzZXJ2ZWQgZm9yIFN0YW5kYXJkIExDUyBzZXJ2aWNlIHR5cGVzCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDY0LTEyNyBhcmUgcmVzZXJ2ZWQgZm9yIE5vbiBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCistLSBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworZW1lcmdlbmN5U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDAKK2VtZXJnZW5jeUFsZXJ0U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEKK3BlcnNvblRyYWNraW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMgorZmxlZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAzCithc3NldE1hbmFnZW1lbnQJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDQKK3RyYWZmaWNDb25nZXN0aW9uUmVwb3J0aW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA1Cityb2Fkc2lkZUFzc2lzdGFuY2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDYKK3JvdXRpbmdUb05lYXJlc3RDb21tZXJjaWFsRW50ZXJwcmlzZQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNworbmF2aWdhdGlvbgkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgKKwktLXRoaXMgc2VydmljZSB0eXBlIGlzIHJlc2VydmVkIGZvciB1c2UgaW4gcHJldmlvdXMgcmVsZWFzZXMKK2NpdHlTaWdodHNlZWluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gOQorbG9jYWxpemVkQWR2ZXJ0aXNpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwCittb2JpbGVZZWxsb3dQYWdlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEgCit0cmFmZmljQW5kUHVibGljVHJhbnNwb3J0YXRpb25JbmZvCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMgord2VhdGhlcgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMworYXNzZXRBbmRTZXJ2aWNlRmluZGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTQKK2dhbWluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNQorZmluZFlvdXJGcmllbmQJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNgorZGF0aW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE3CitjaGF0dGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxOAorcm91dGVGaW5kaW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTkKK3doZXJlQW1JCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIwCisKKy0tIFRoZSB2YWx1ZXMgb2YgTENTU2VydmljZVR5cGVJRCBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMi4wNzEuCisKKy0tIE5vbiBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworc2VydjY0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY0CitzZXJ2NjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjUKK3NlcnY2NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Ngorc2VydjY3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY3CitzZXJ2NjgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjgKK3NlcnY2OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2OQorc2VydjcwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcwCitzZXJ2NzEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzEKK3NlcnY3MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mgorc2VydjczCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDczCitzZXJ2NzQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzQKK3NlcnY3NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3NQorc2Vydjc2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc2CitzZXJ2NzcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzcKK3NlcnY3OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OAorc2Vydjc5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc5CitzZXJ2ODAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODAKK3NlcnY4MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4MQorc2VydjgyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgyCitzZXJ2ODMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODMKK3NlcnY4NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NAorc2Vydjg1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg1CitzZXJ2ODYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODYKK3NlcnY4NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Nworc2Vydjg4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg4CitzZXJ2ODkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODkKK3NlcnY5MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MAorc2VydjkxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkxCitzZXJ2OTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTIKK3NlcnY5MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Mworc2Vydjk0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk0CitzZXJ2OTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTUKK3NlcnY5NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Ngorc2Vydjk3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk3CitzZXJ2OTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTgKK3NlcnY5OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5OQorc2VydjEwMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDAKK3NlcnYxMDEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAxCitzZXJ2MTAyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMgorc2VydjEwMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDMKK3NlcnYxMDQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA0CitzZXJ2MTA1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNQorc2VydjEwNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDYKK3NlcnYxMDcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA3CitzZXJ2MTA4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwOAorc2VydjEwOQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDkKK3NlcnYxMTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEwCitzZXJ2MTExCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMQorc2VydjExMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTIKK3NlcnYxMTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEzCitzZXJ2MTE0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNAorc2VydjExNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTUKK3NlcnYxMTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE2CitzZXJ2MTE3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNworc2VydjExOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTgKK3NlcnYxMTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE5CitzZXJ2MTIwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMAorc2VydjEyMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjEKK3NlcnYxMjIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIyCitzZXJ2MTIzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMworc2VydjEyNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjQKK3NlcnYxMjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI1CitzZXJ2MTI2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNgorc2VydjEyNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjcKKworUExNTi1JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCistLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSA6Oj0gQ0hPSUNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aAlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgsCisJbGFpRml4ZWRMZW5ndGgJWzFdIExBSUZpeGVkTGVuZ3RofQorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg3KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gb3IgU2VydmljZSBBcmUgSWRlbnRpZmljYXRpb24KKwktLSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSB2YWx1ZSBvciAKKwktLSAJCQlTZXJ2aWNlIEFyZWEgQ29kZSAoU0FDKSB2YWx1ZSAKKwktLQkJCWFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMworCitMQUlGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1KSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisKK0Jhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJYmVhcmVyU2VydmljZQlbMl0gQmVhcmVyU2VydmljZUNvZGUsCisJdGVsZXNlcnZpY2UJWzNdIFRlbGVzZXJ2aWNlQ29kZX0KKworRXh0LUJhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJZXh0LUJlYXJlclNlcnZpY2UJWzJdIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSwKKwlleHQtVGVsZXNlcnZpY2UJWzNdIEV4dC1UZWxlc2VydmljZUNvZGV9CisKK0VNTFBQLUluZm8gOjo9IFNFUVVFTkNFIHsKKwltYXhpbXVtZW50aXRsZWRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eSwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0VNTFBQLVByaW9yaXR5IDo6PSBJTlRFR0VSICgwLi4xNSkKKwktLSBUaGUgbWFwcGluZyBmcm9tIHRoZSB2YWx1ZXMgQSxCLDAsMSwyLDMsNCB0byB0aGUgaW50ZWdlci12YWx1ZSBpcworCS0tIHNwZWNpZmllZCBhcyBmb2xsb3dzIHdoZXJlIEEgaXMgdGhlIGhpZ2hlc3QgYW5kIDQgaXMgdGhlIGxvd2VzdAorCS0tIHByaW9yaXR5IGxldmVsCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDctMTUgYXJlIHNwYXJlIGFuZCBzaGFsbCBiZSBtYXBwZWQgdG8gdmFsdWUgNAorCitwcmlvcml0eUxldmVsQQkJRU1MUFAtUHJpb3JpdHkgOjo9IDYKK3ByaW9yaXR5TGV2ZWxCCQlFTUxQUC1Qcmlvcml0eSA6Oj0gNQorcHJpb3JpdHlMZXZlbDAJCUVNTFBQLVByaW9yaXR5IDo6PSAwCitwcmlvcml0eUxldmVsMQkJRU1MUFAtUHJpb3JpdHkgOjo9IDEKK3ByaW9yaXR5TGV2ZWwyCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMgorcHJpb3JpdHlMZXZlbDMJCUVNTFBQLVByaW9yaXR5IDo6PSAzCitwcmlvcml0eUxldmVsNAkJRU1MUFAtUHJpb3JpdHkgOjo9IDQKKworTUMtU1MtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXSBTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIEV4dC1TUy1TdGF0dXMsCisJbmJyU0IJCVsyXSBNYXhNQy1CZWFyZXJzLAorCW5iclVzZXIJCVszXSBNQy1CZWFyZXJzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTWF4TUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMi4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCitNQy1CZWFyZXJzIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZk1DLUJlYXJlcnMpCisKK21heE51bU9mTUMtQmVhcmVycyAgSU5URUdFUiA6Oj0gNworCitFeHQtU1MtU3RhdHVzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKwktLQorCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kLgorCisKKwktLSBkYXRhIHR5cGVzIGZvciBnZW9ncmFwaGljIGxvY2F0aW9uCisKK0FnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gSU5URUdFUiAoMC4uMzI3NjcpCistLSB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbnV0ZXMgc2luY2UgdGhlIGxhc3QKKy0tIG5ldHdvcmsgY29udGFjdCBvZiB0aGUgbW9iaWxlIHN0YXRpb24gKGkuZS4gdGhlIGFjdHVhbGl0eSBvZiB0aGUKKy0tIGxvY2F0aW9uIGluZm9ybWF0aW9uKS4KKy0tIHZhbHVlICIwIiBpbmRpY2F0ZXMgdGhhdCB0aGUgTVMgaXMgY3VycmVudGx5IGluIGNvbnRhY3Qgd2l0aCB0aGUKKy0tICAgICAgICAgICBuZXR3b3JrCistLSB2YWx1ZSAiMzI3NjciIGluZGljYXRlcyB0aGF0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBhdCBsZWFzdAorLS0gICAgICAgICAgICAgICAzMjc2NyBtaW51dGVzIG9sZAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiOTBmYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw0MTUgQEAKKy0tICRJZDogTUFQLUVSLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjcJRXJyb3IgZGF0YSB0eXBlcworCitNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUm9hbWluZ05vdEFsbG93ZWRQYXJhbSwKKwlDYWxsQmFycmVkUGFyYW0sCisJQ1VHLVJlamVjdFBhcmFtLAorCVNTLUluY29tcGF0aWJpbGl0eUNhdXNlLAorCVBXLVJlZ2lzdHJhdGlvbkZhaWx1cmVDYXVzZSwKKwlTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSwKKwlTeXN0ZW1GYWlsdXJlUGFyYW0sCisJRGF0YU1pc3NpbmdQYXJhbSwKKwlVbmV4cGVjdGVkRGF0YVBhcmFtLAorCUZhY2lsaXR5Tm90U3VwUGFyYW0sCisJT1ItTm90QWxsb3dlZFBhcmFtLAorCVVua25vd25TdWJzY3JpYmVyUGFyYW0sCisJTnVtYmVyQ2hhbmdlZFBhcmFtLAorCVVuaWRlbnRpZmllZFN1YlBhcmFtLAorCUlsbGVnYWxTdWJzY3JpYmVyUGFyYW0sCisJSWxsZWdhbEVxdWlwbWVudFBhcmFtLAorCUJlYXJlclNlcnZOb3RQcm92UGFyYW0sCisJVGVsZXNlcnZOb3RQcm92UGFyYW0sCisJVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSwKKwlOb1JvYW1pbmdOYlBhcmFtLAorCUFic2VudFN1YnNjcmliZXJQYXJhbSwKKwlCdXN5U3Vic2NyaWJlclBhcmFtLAorCU5vU3Vic2NyaWJlclJlcGx5UGFyYW0sCisJRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtLAorCUZvcndhcmRpbmdGYWlsZWRQYXJhbSwgCisJQVRJLU5vdEFsbG93ZWRQYXJhbSwKKwlTdWJCdXN5Rm9yTVQtU01TLVBhcmFtLAorCU1lc3NhZ2VXYWl0TGlzdEZ1bGxQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyU00tUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSwKKwlSZXNvdXJjZUxpbWl0YXRpb25QYXJhbSwKKwlOb0dyb3VwQ2FsbE5iUGFyYW0sCisJSW5jb21wYXRpYmxlVGVybWluYWxQYXJhbSwKKwlTaG9ydFRlcm1EZW5pYWxQYXJhbSwKKwlMb25nVGVybURlbmlhbFBhcmFtLAorCVVuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtLAorCVVuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSwKKwlQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0sCitVbmtub3duT3JVbnJlYWNoYWJsZUxDU0NsaWVudC1QYXJhbSwKKwlNTS1FdmVudE5vdFN1cHBvcnRlZC1QYXJhbSwKK0FUU0ktTm90QWxsb3dlZFBhcmFtLAorQVRNLU5vdEFsbG93ZWRQYXJhbSwKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSwKK1NTLU5vdEF2YWlsYWJsZVBhcmFtLAorU1MtU3Vic2NyaXB0aW9uVmlvbGF0aW9uUGFyYW0sCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtLAorVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0sCitPbmdvaW5nR3JvdXBDYWxsUGFyYW0KKworOworCitJTVBPUlRTCisJU1MtU3RhdHVzCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTaWduYWxJbmZvLAorCUJhc2ljU2VydmljZUNvZGUsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworUm9hbWluZ05vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJUm9hbWluZ05vdEFsbG93ZWRDYXVzZSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZQlbMF0gQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgT1BUSU9OQUwgfQorCistLQlpZiB0aGUgYWRkaXRpb25hbFJvYW1pbmdOb3RhbGxvd2VkQ2F1c2UgaXMgcmVjZWl2ZWQgYnkgdGhlIE1TQy9WTFIgb3IgU0dTTiB0aGVuIHRoZSAKKy0tCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2Ugc2hhbGwgYmUgZGlzY2FyZGVkLgorCitBZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3VwcG9ydGVkUkFULVR5cGVzTm90QWxsb3dlZCAoMCksCisJLi4ufQorCitSb2FtaW5nTm90QWxsb3dlZENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlwbG1uUm9hbWluZ05vdEFsbG93ZWQgICgwKSwKKwlvcGVyYXRvckRldGVybWluZWRCYXJyaW5nICAoMyl9CisKK0NhbGxCYXJyZWRQYXJhbSA6Oj0gQ0hPSUNFIHsKKwljYWxsQmFycmluZ0NhdXNlCUNhbGxCYXJyaW5nQ2F1c2UsCisJLS0gY2FsbCBCYXJyaW5nQ2F1c2UgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDMgYW5kIGhpZ2hlcgorCWV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0JRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbQorCS0tIGV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitDYWxsQmFycmluZ0NhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwliYXJyaW5nU2VydmljZUFjdGl2ZSAgKDApLAorCW9wZXJhdG9yQmFycmluZyAgKDEpfQorCitFeHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl1bmF1dGhvcmlzZWRNZXNzYWdlT3JpZ2luYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwgfQorCitDVUctUmVqZWN0UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwljdWctUmVqZWN0Q2F1c2UJQ1VHLVJlamVjdENhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctUmVqZWN0Q2F1c2UgOjo9IEVOVU1FUkFURUQgeworCWluY29taW5nQ2FsbHNCYXJyZWRXaXRoaW5DVUcgICgwKSwKKwlzdWJzY3JpYmVyTm90TWVtYmVyT2ZDVUcgICgxKSwKKwlyZXF1ZXN0ZWRCYXNpY1NlcnZpY2VWaW9sYXRlc0NVRy1Db25zdHJhaW50cyAgKDUpLAorCWNhbGxlZFBhcnR5U1MtSW50ZXJhY3Rpb25WaW9sYXRpb24gICg3KX0KKworU1MtSW5jb21wYXRpYmlsaXR5Q2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMV0gU1MtQ29kZQlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJLi4ufQorCitQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXVuZGV0ZXJtaW5lZCAgKDApLAorCWludmFsaWRGb3JtYXQgICgxKSwKKwluZXdQYXNzd29yZHNNaXNtYXRjaCAgKDIpfQorCitTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwllcXVpcG1lbnRQcm90b2NvbEVycm9yICAoMSksCisJZXF1aXBtZW50Tm90U00tRXF1aXBwZWQgICgyKSwKKwl1bmtub3duU2VydmljZUNlbnRyZSAgKDMpLAorCXNjLUNvbmdlc3Rpb24gICg0KSwKKwlpbnZhbGlkU01FLUFkZHJlc3MgICg1KSwKKwlzdWJzY3JpYmVyTm90U0MtU3Vic2NyaWJlciAgKDYpfQorCitTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSA6Oj0gU0VRVUVOQ0UgeworCXNtLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZQlTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJZGlhZ25vc3RpY0luZm8JU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gY2FuIGJlIGVpdGhlciBmb3Igbm9uLUdQUlMgCisJLS0gb3IgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAgCVswXSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gaWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIGlzIGZvciBHUFJTIGFuZCBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIAorCS0tIGZvciBub24tR1BSUworCitBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIDo6PSBJTlRFR0VSICgwLi4yNTUpCisJLS0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAKKworU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBDSE9JQ0UgeworCW5ldHdvcmtSZXNvdXJjZQlOZXR3b3JrUmVzb3VyY2UsCisJLS0gbmV0d29ya1Jlc291cmNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzCisJZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQlFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtCisJLS0gZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gPDMKKwl9CisKK0V4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJWzBdIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJT1BUSU9OQUwsCisJZmFpbHVyZUNhdXNlUGFyYW0JWzFdIEZhaWx1cmVDYXVzZVBhcmFtCU9QVElPTkFMIH0KKworRmFpbHVyZUNhdXNlUGFyYW0gOjo9IEVOVU1FUkFURUQgeworCWxpbWl0UmVhY2hlZE9uTnVtYmVyT2ZDb25jdXJyZW50TG9jYXRpb25SZXF1ZXN0cyAoMCksCisJLi4uIH0KKwktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEZhaWx1cmVDYXVzZVBhcmFtIGl0IHNoYWxsIGJlIGlnbm9yZWQKKworCitEYXRhTWlzc2luZ1BhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuZXhwZWN0ZWREYXRhUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRmFjaWxpdHlOb3RTdXBQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkIFswXQlOVUxMCQlPUFRJT05BTCwKKwluZWVkZWRMY3NDYXBhYmlsaXR5Tm90U3VwcG9ydGVkSW5TZXJ2aW5nTm9kZSBbMV0gTlVMTAlPUFRJT05BTCB9CisKK09SLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmtub3duU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljCVVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlPUFRJT05BTH0KKworVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpVW5rbm93biAgKDApLAorCWdwcnMtZXBzLVN1YnNjcmlwdGlvblVua25vd24gICgxKSwKKwkuLi4sCisJbnBkYk1pc21hdGNoICAoMil9CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIAkKKwktLSBVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMgdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQKKworTnVtYmVyQ2hhbmdlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuaWRlbnRpZmllZFN1YlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbEVxdWlwbWVudFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0JlYXJlclNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGVsZXNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb1JvYW1pbmdOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFic2VudFN1YnNjcmliZXJSZWFzb24JWzBdIEFic2VudFN1YnNjcmliZXJSZWFzb24JT1BUSU9OQUx9CisKK0Fic2VudFN1YnNjcmliZXJSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCWltc2lEZXRhY2ggKDApLAorCXJlc3RyaWN0ZWRBcmVhICgxKSwKKwlub1BhZ2VSZXNwb25zZSAoMiksCisJLi4uICwKKwlwdXJnZWRNUyAoMyl9CistLSBleGNlcHRpb24gaGFuZGxpbmc6IGF0IHJlY2VwdGlvbiBvZiBvdGhlciB2YWx1ZXMgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIAorLS0gQWJzZW50U3Vic2NyaWJlclJlYXNvbiBzaGFsbCBiZSBpZ25vcmVkLiAKKy0tIFRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBwdXJnZWRNUyBpcyBkZWZpbmVkIGZvciB0aGUgU3VwZXItQ2hhcmdlciBmZWF0dXJlIAorLS0gKHNlZSBUUyAyMy4xMTYpLiBJZiB0aGlzIHZhbHVlIGlzIHJlY2VpdmVkIGluIGEgUHJvdmlkZSBSb2FtaW5nIE51bWJlciByZXNwb25zZQorLS0gaXQgc2hhbGwgYmUgbWFwcGVkIHRvIHRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBpbXNpRGV0YWNoIGluIHRoZSBTZW5kIFJvdXRlaW5nCistLSBJbmZvcm1hdGlvbiByZXNwb25zZQorCitCdXN5U3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2Nicy1Qb3NzaWJsZQlbMF0gTlVMTAkJT1BUSU9OQUwsCisJY2Nicy1CdXN5CQlbMV0gTlVMTAkJT1BUSU9OQUx9CisKK05vU3Vic2NyaWJlclJlcGx5UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdGYWlsZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVEktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUU0ktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUTS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbFNTLU9wZXJhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLU5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luZm9ybWF0aW9uTm90QXZhaWxhYmxlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3ViQnVzeUZvck1ULVNNUy1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzQ29ubmVjdGlvblN1c3BlbmRlZAlOVUxMCQkJT1BUSU9OQUwgfQorCS0tIElmIEdwcnNDb25uZWN0aW9uU3VzcGVuZGVkIGlzIG5vdCB1bmRlcnN0b29kIGl0IHNoYWxsIAorCS0tIGJlIGRpc2NhcmRlZAorCitNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Hcm91cENhbGxOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2hvcnRUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK0xvbmdUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1VuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljCVswXSBVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub0FkZGl0aW9uYWxJbmZvcm1hdGlvbiAoMCksCisJY2xpZW50Tm90SW5NU1ByaXZhY3lFeGNlcHRpb25MaXN0ICgxKSwKKwljYWxsVG9DbGllbnROb3RTZXR1cCAoMiksCisJcHJpdmFjeU92ZXJyaWRlTm90QXBwbGljYWJsZSAoMyksCisJZGlzYWxsb3dlZEJ5TG9jYWxSZWd1bGF0b3J5UmVxdWlyZW1lbnRzICg0KSwKKwkuLi4sCisJdW5hdXRob3JpemVkUHJpdmFjeUNsYXNzICg1KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblVucmVsYXRlZEV4dGVybmFsQ2xpZW50ICg2KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNykgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljCVswXSBQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwljb25nZXN0aW9uICAoMCksCisJaW5zdWZmaWNpZW50UmVzb3VyY2VzICAoMSksCisJaW5zdWZmaWNpZW50TWVhc3VyZW1lbnREYXRhICAoMiksCisJaW5jb25zaXN0ZW50TWVhc3VyZW1lbnREYXRhICAoMyksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RDb21wbGV0ZWQgICg0KSwKKwlsb2NhdGlvblByb2NlZHVyZU5vdFN1cHBvcnRlZEJ5VGFyZ2V0TVMgICg1KSwKKwlxb1NOb3RBdHRhaW5hYmxlICAoNiksCisJcG9zaXRpb25NZXRob2ROb3RBdmFpbGFibGVJbk5ldHdvcmsJKDcpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5Mb2NhdGlvbkFyZWEJKDgpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbnkgdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIGlnbm9yZWQKKworVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworT25nb2luZ0dyb3VwQ2FsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NGMwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNzQgQEAKKy0tICRJZDogTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLQorLS0gMTcuNy4xMSBFeHRlbnNpb24gZGF0YSB0eXBlcworLS0KKworTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJUHJpdmF0ZUV4dGVuc2lvbiwKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcjsKKworCistLSBJT0MgZm9yIHByaXZhdGUgTUFQIGV4dGVuc2lvbnMKKworCitNQVAtRVhURU5TSU9OICA6Oj0gQ0xBU1MgeworCSZFeHRlbnNpb25UeXBlCQkJCU9QVElPTkFMLAorCSZleHRlbnNpb25JZCAJT0JKRUNUIElERU5USUZJRVIgfQorCS0tIFRoZSBsZW5ndGggb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYgb2N0ZXRzIGFuZCB0aGUKKwktLSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgT2JqZWN0IElkZW50aWZpZXIgc2hhbGwgbm90IGV4Y2VlZCAxNgorCistLSBkYXRhIHR5cGVzCisKK0V4dGVuc2lvbkNvbnRhaW5lciA6Oj0gU0VRVUVOQ0UgeworCXByaXZhdGVFeHRlbnNpb25MaXN0CVswXVByaXZhdGVFeHRlbnNpb25MaXN0CU9QVElPTkFMLCAKKwlwY3MtRXh0ZW5zaW9ucwlbMV1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1NMUi1BcmdFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJc2xyLUFyZy1QQ1MtRXh0ZW5zaW9ucwlbMV1TTFItQXJnLVBDUy1FeHRlbnNpb25zCU9QVElPTkFMLAorCS4uLn0KKworUHJpdmF0ZUV4dGVuc2lvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmF0ZUV4dGVuc2lvbnMpIE9GCisJCQkJUHJpdmF0ZUV4dGVuc2lvbgorCitQcml2YXRlRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0SWQJCU1BUC1FWFRFTlNJT04uJmV4dGVuc2lvbklkCisJCQkJKHtFeHRlbnNpb25TZXR9KSwKKwlleHRUeXBlCQlNQVAtRVhURU5TSU9OLiZFeHRlbnNpb25UeXBlCisJCQkJKHtFeHRlbnNpb25TZXR9e0BleHRJZH0pCU9QVElPTkFMfQorCittYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zICBJTlRFR0VSIDo6PSAxMAorCitFeHRlbnNpb25TZXQJCU1BUC1FWFRFTlNJT04gOjo9CisJCXsuLi4KKwkJIC0tIEV4dGVuc2lvblNldCBpcyB0aGUgc2V0IG9mIGFsbCBkZWZpbmVkIHByaXZhdGUgZXh0ZW5zaW9ucworCX0KKwktLSBVbnN1cHBvcnRlZCBwcml2YXRlIGV4dGVuc2lvbnMgc2hhbGwgYmUgZGlzY2FyZGVkIGlmIHJlY2VpdmVkLgorCitQQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLn0KKworU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLiwKKwluYS1FU1JLLVJlcXVlc3QJWzBdCU5VTEwJCU9QVElPTkFMIH0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTENTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzNGI4OQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjU3IEBACistLSAkSWQ6IE1BUC1MQ1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gTUFQLUxDUy1EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTMgTG9jYXRpb24gc2VydmljZSBkYXRhIHR5cGVzCistLQorCitNQVAtTENTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCitJTVBMSUNJVCBUQUdTCis6Oj0KK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvckxDUy1BcmcsCisJUm91dGluZ0luZm9Gb3JMQ1MtUmVzLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tUmVzLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcsCisJU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcywKK0xvY2F0aW9uVHlwZSwgCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorTENTQ2xpZW50TmFtZSwKK0xDUy1Rb1MsCitIb3Jpem9udGFsLUFjY3VyYWN5LAorUmVzcG9uc2VUaW1lLAorRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCAKK1ZlbG9jaXR5RXN0aW1hdGUsCitTdXBwb3J0ZWRHQURTaGFwZXMsCitBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCitMQ1NSZXF1ZXN0b3JJRCwgCitMQ1MtUmVmZXJlbmNlTnVtYmVyLAorTENTQ29kZXdvcmQsCitBcmVhRXZlbnRJbmZvLAorUmVwb3J0aW5nUExNTkxpc3QsCitQZXJpb2RpY0xEUkluZm8sCitTZXF1ZW5jZU51bWJlcgorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSU1FSSwKKwlJTVNJLAorCUxNU0ksCisJU3Vic2NyaWJlcklkZW50aXR5LAorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCitMQ1NTZXJ2aWNlVHlwZUlELAorQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCitQTE1OLUlkCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorVVNTRC1TdHJpbmcKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKSBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykKKyAgIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCUFQTiwKKwlHU04tQWRkcmVzcywKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMKK0ZST00gTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZGl0aW9uYWwtTnVtYmVyCitGUk9NIE1BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JMQ1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJbWxjTnVtYmVyCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXRhcmdldE1TCQlbMV0gU3Vic2NyaWJlcklkZW50aXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUm91dGluZ0luZm9Gb3JMQ1MtUmVzIDo6PSBTRVFVRU5DRSB7CisJdGFyZ2V0TVMJCVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbNF0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJcHByLUFkZHJlc3MJWzVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtdi1nbWxjLUFkZHJlc3MJWzZdCUdTTi1BZGRyZXNzCU9QVElPTkFMIH0KKworTENTTG9jYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJbG1zaQkJCVswXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNOb2RlSW5kaWNhdG9yIAlbMl0gTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbM10gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs0XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJYWRkaXRpb25hbC1MQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTAorCX0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvblR5cGUJTG9jYXRpb25UeXBlLAorCW1sYy1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxjcy1DbGllbnRJRAlbMF0gTENTLUNsaWVudElECU9QVElPTkFMLAorCXByaXZhY3lPdmVycmlkZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJaW1zaQkJCVsyXSBJTVNJCQlPUFRJT05BTCwKKwltc2lzZG4JCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG1zaQkJCVs0XSBMTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzVdIElNRUkJCU9QVElPTkFMLAorCWxjcy1Qcmlvcml0eQlbNl0gTENTLVByaW9yaXR5CU9QVElPTkFMLAorCWxjcy1Rb1MJCVs3XSBMQ1MtUW9TCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc3VwcG9ydGVkR0FEU2hhcGVzCVs5XQlTdXBwb3J0ZWRHQURTaGFwZXMJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbMTBdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwsCisJbGNzU2VydmljZVR5cGVJRAlbMTFdCUxDU1NlcnZpY2VUeXBlSUQJT1BUSU9OQUwsCisJbGNzQ29kZXdvcmQJWzEyXQlMQ1NDb2Rld29yZAlPUFRJT05BTCwKKwlsY3MtUHJpdmFjeUNoZWNrCVsxM10JTENTLVByaXZhY3lDaGVjawlPUFRJT05BTCwKKwlhcmVhRXZlbnRJbmZvCVsxNF0JQXJlYUV2ZW50SW5mbwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxNl0gTlVMTAkJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsxN10gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCXJlcG9ydGluZ1BMTU5MaXN0CVsxOF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIGltc2kgb3IgbXNpc2RuIGlzIG1hbmRhdG9yeQorCS0tIElmIGEgbG9jYXRpb24gZXN0aW1hdGUgdHlwZSBpbmRpY2F0ZXMgYWN0aXZhdGUgZGVmZXJyZWQgbG9jYXRpb24gb3IgY2FuY2VsIGRlZmVycmVkIAorCS0tIGxvY2F0aW9uLCBhIGxjcy1SZWZlcmVuY2UgbnVtYmVyIHNoYWxsIGJlIGluY2x1ZGVkLgorCitMb2NhdGlvblR5cGUgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlVHlwZQlbMF0gTG9jYXRpb25Fc3RpbWF0ZVR5cGUsCisJLi4uLAorCWRlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJWzFdIERlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJT1BUSU9OQUwgfQorCitMb2NhdGlvbkVzdGltYXRlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY3VycmVudExvY2F0aW9uCSgwKSwKKwljdXJyZW50T3JMYXN0S25vd25Mb2NhdGlvbgkoMSksCisJaW5pdGlhbExvY2F0aW9uCSgyKSwKKwkuLi4sCisJYWN0aXZhdGVEZWZlcnJlZExvY2F0aW9uCSgzKSwKKwljYW5jZWxEZWZlcnJlZExvY2F0aW9uCSg0KSAsCisJbm90aWZpY2F0aW9uVmVyaWZpY2F0aW9uT25seQkoNSkgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBMb2NhdGlvbkVzdGltYXRlVHlwZQorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0RlZmVycmVkTG9jYXRpb25FdmVudFR5cGUgOjo9IEJJVCBTVFJJTkcgeworCW1zQXZhaWxhYmxlCSgwKSAsCisJZW50ZXJpbmdJbnRvQXJlYQkoMSksCisJbGVhdmluZ0Zyb21BcmVhCSgyKSwKKwliZWluZ0luc2lkZUFyZWEJKDMpICwKKwlwZXJpb2RpY0xEUgkoNCkgIH0gKFNJWkUgKDEuLjE2KSkgCistLSBiZWluZ0luc2lkZUFyZWEgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgb25lVGltZUV2ZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIHBvc3NpYmxlIHZhbHVlCistLSBvZiBvY2N1cnJlbmNlSW5mbyBpbnNpZGUgYXJlYUV2ZW50SW5mby4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBvdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgaW4gCistLSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIHNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIAorLS0gdW5leHBlY3RlZCBkYXRhIHZhbHVlLgorCitMQ1MtQ2xpZW50SUQgOjo9IFNFUVVFTkNFIHsKKwlsY3NDbGllbnRUeXBlCVswXSBMQ1NDbGllbnRUeXBlLAorCWxjc0NsaWVudEV4dGVybmFsSUQJWzFdIExDU0NsaWVudEV4dGVybmFsSUQJT1BUSU9OQUwsCisJbGNzQ2xpZW50RGlhbGVkQnlNUwlbMl0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsY3NDbGllbnRJbnRlcm5hbElECVszXSBMQ1NDbGllbnRJbnRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudE5hbWUJWzRdIExDU0NsaWVudE5hbWUJT1BUSU9OQUwsCisJLi4uLAorCWxjc0FQTgkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbGNzUmVxdWVzdG9ySUQJWzZdIExDU1JlcXVlc3RvcklECU9QVElPTkFMIH0KKworTENTQ2xpZW50VHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJZW1lcmdlbmN5U2VydmljZXMJKDApLAorCXZhbHVlQWRkZWRTZXJ2aWNlcwkoMSksCisJcGxtbk9wZXJhdG9yU2VydmljZXMJKDIpLAorCWxhd2Z1bEludGVyY2VwdFNlcnZpY2VzCSgzKSwKKwkuLi4gfQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQl1bnJlY29nbml6ZWQgdmFsdWVzIG1heSBiZSBpZ25vcmVkIGlmIHRoZSBMQ1MgY2xpZW50IHVzZXMgdGhlIHByaXZhY3kgb3ZlcnJpZGUKKwktLQlvdGhlcndpc2UsIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIGFzIHVuZXhwZWN0ZWQgZGF0YSBieSBhIHJlY2VpdmVyCisJLS0JYSByZXR1cm4gZXJyb3Igc2hhbGwgdGhlbiBiZSByZXR1cm5lZCBpZiByZWNlaXZlZCBpbiBhIE1BUCBpbnZva2UgCisKK0xDU0NsaWVudE5hbWUgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJbmFtZVN0cmluZwlbMl0gTmFtZVN0cmluZywKKwkuLi4sCisJbGNzLUZvcm1hdEluZGljYXRvcglbM10gTENTLUZvcm1hdEluZGljYXRvcglPUFRJT05BTCB9CisKKy0tIFRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgc2hhbGwgaW5kaWNhdGUgdXNlIG9mIHRoZSBkZWZhdWx0IGFscGhhYmV0IHRocm91Z2ggdGhlCistLSBmb2xsb3dpbmcgZW5jb2RpbmcKKy0tCWJpdAk3IDYgNSA0IDMgMiAxIDAKKy0tCQkwIDAgMCAwIDEgMSAxIDEKKworTmFtZVN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heE5hbWVTdHJpbmdMZW5ndGgpKQorCittYXhOYW1lU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1NSZXF1ZXN0b3JJRCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlyZXF1ZXN0b3JJRFN0cmluZwlbMV0gUmVxdWVzdG9ySURTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzJdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCitSZXF1ZXN0b3JJRFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoKSkKKworbWF4UmVxdWVzdG9ySURTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDYzCisKK0xDUy1Gb3JtYXRJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWxvZ2ljYWxOYW1lCSgwKSwKKwllLW1haWxBZGRyZXNzCSgxKSwKKwltc2lzZG4JCSgyKSwKKwl1cmwJCQkoMyksCisJc2lwVXJsCQkoNCksCisJLi4uIH0KKworTENTLVByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIDAgPSBoaWdoZXN0IHByaW9yaXR5CisJLS0gMSA9IG5vcm1hbCBwcmlvcml0eQorCS0tIGFsbCBvdGhlciB2YWx1ZXMgdHJlYXRlZCBhcyAxIAorCitMQ1MtUW9TIDo6PSBTRVFVRU5DRSB7CisJaG9yaXpvbnRhbC1hY2N1cmFjeQlbMF0gSG9yaXpvbnRhbC1BY2N1cmFjeQlPUFRJT05BTCwKKwl2ZXJ0aWNhbENvb3JkaW5hdGVSZXF1ZXN0CVsxXSBOVUxMCQlPUFRJT05BTCwKKwl2ZXJ0aWNhbC1hY2N1cmFjeQlbMl0gVmVydGljYWwtQWNjdXJhY3kJT1BUSU9OQUwsCXJlc3BvbnNlVGltZQlbM10gUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2ZWxvY2l0eVJlcXVlc3QJWzVdIE5VTEwJCU9QVElPTkFMCit9CisKK0hvcml6b250YWwtQWNjdXJhY3kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gYml0IDggPSAwCisJLS0gYml0cyA3LTEgPSA3IGJpdCBVbmNlcnRhaW50eSBDb2RlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIAorCS0tIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JQorCS0tIGNvbmZpZGVuY2UuCisKK1ZlcnRpY2FsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVmVydGljYWwgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiAKKwktLSBUaGUgdmVydGljYWwgbG9jYXRpb24gZXJyb3Igc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgZXJyb3IgaW5kaWNhdGVkIAorCS0tIGJ5IHRoZSB1bmNlcnRhaW50eSBjb2RlIHdpdGggNjclIGNvbmZpZGVuY2UuCisKK1Jlc3BvbnNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCXJlc3BvbnNlVGltZUNhdGVnb3J5CVJlc3BvbnNlVGltZUNhdGVnb3J5LAorCS4uLn0KKy0tCW5vdGU6IGFuIGV4cGFuZGFibGUgU0VRVUVOQ0Ugc2ltcGxpZmllcyBsYXRlciBhZGRpdGlvbiBvZiBhIG51bWVyaWMgcmVzcG9uc2UgdGltZS4KKworUmVzcG9uc2VUaW1lQ2F0ZWdvcnkgOjo9IEVOVU1FUkFURUQgeworCWxvd2RlbGF5ICAoMCksCisJZGVsYXl0b2xlcmFudCAgKDEpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAxIChkZWxheXRvbGVyYW50KQorCitTdXBwb3J0ZWRHQURTaGFwZXMgOjo9IEJJVCBTVFJJTkcgeworCWVsbGlwc29pZFBvaW50ICAoMCksCisJZWxsaXBzb2lkUG9pbnRXaXRoVW5jZXJ0YWludHlDaXJjbGUgKDEpLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5RWxsaXBzZSAoMiksCisJcG9seWdvbiAoMyksCisJZWxsaXBzb2lkUG9pbnRXaXRoQWx0aXR1ZGUgKDQpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlQW5kVW5jZXJ0YWludHlFbGlwc29pZCAoNSksCisJZWxsaXBzb2lkQXJjICAoNikgfSAoU0laRSAoNy4uMTYpKQorLS0gQSBub2RlIHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIFNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGl0IHN1cHBvcnRzLgorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBiaXRzIDcgdG8gMTUgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZC4KKworTENTLVJlZmVyZW5jZU51bWJlcjo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCisKK0xDU0NvZGV3b3JkIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCWxjc0NvZGV3b3JkU3RyaW5nCVsxXSBMQ1NDb2Rld29yZFN0cmluZywKKwkuLi59CisKK0xDU0NvZGV3b3JkU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGgpKQorCittYXhMQ1NDb2Rld29yZFN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworTENTLVByaXZhY3lDaGVjayA6Oj0gU0VRVUVOQ0UgeworCWNhbGxTZXNzaW9uVW5yZWxhdGVkCVswXSBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uLAorCWNhbGxTZXNzaW9uUmVsYXRlZAlbMV0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbglPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWFsbG93ZWRXaXRob3V0Tm90aWZpY2F0aW9uICgwKSwKKwlhbGxvd2VkV2l0aE5vdGlmaWNhdGlvbiAoMSksCisJYWxsb3dlZElmTm9SZXNwb25zZSAoMiksCisJcmVzdHJpY3RlZElmTm9SZXNwb25zZSAoMyksCisJbm90QWxsb3dlZCAoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uCistLQlzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworQXJlYUV2ZW50SW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFyZWFEZWZpbml0aW9uCVswXQlBcmVhRGVmaW5pdGlvbiwKKwlvY2N1cnJlbmNlSW5mbwlbMV0JT2NjdXJyZW5jZUluZm8JT1BUSU9OQUwsCisJaW50ZXJ2YWxUaW1lCVsyXQlJbnRlcnZhbFRpbWUJT1BUSU9OQUwsCisJLi4ufQorCitBcmVhRGVmaW5pdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFyZWFMaXN0CQlbMF0JQXJlYUxpc3QsCisJLi4ufQorCitBcmVhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBcmVhcykgT0YgQXJlYQorCittYXhOdW1PZkFyZWFzICBJTlRFR0VSIDo6PSAxMAorCitBcmVhIDo6PSBTRVFVRU5DRSB7CisJYXJlYVR5cGUJCVswXQlBcmVhVHlwZSwKKwlhcmVhSWRlbnRpZmljYXRpb24JWzFdCUFyZWFJZGVudGlmaWNhdGlvbiwKKwkuLi59CisKK0FyZWFUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljb3VudHJ5Q29kZQkoMCksCisJcGxtbklkCQkoMSksCisJbG9jYXRpb25BcmVhSWQJKDIpLAorCXJvdXRpbmdBcmVhSWQJKDMpLAorCWNlbGxHbG9iYWxJZAkoNCksCisJLi4uLAorCXV0cmFuQ2VsbElkCSg1KSB9CisKK0FyZWFJZGVudGlmaWNhdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi43KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdCBpZiAzIGRpZ2l0IE1OQyBpbmNsdWRlZAorCS0tCQkJb3IgZmlsbGVyICgxMTExKQorCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgZm9yIExvY2FsIEFyZWEgSWQsCisJLS0JCQlSb3V0aW5nIEFyZWEgSWQgYW5kIENlbGwgR2xvYmFsIElkCisJLS0gb2N0ZXQgNglSb3V0aW5nIEFyZWEgQ29kZSAoUkFDKSBmb3IgUm91dGluZyBBcmVhIElkCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGZvciBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0cyA0IHVudGlsIDcJVXRyYW4gQ2VsbCBJZGVudGl0eSAoVUMtSWQpIGZvciBVdHJhbiBDZWxsIElkCisKK09jY3VycmVuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmVUaW1lRXZlbnQJKDApLAorCW11bHRpcGxlVGltZUV2ZW50CSgxKSwKKwkuLi59CisKK0ludGVydmFsVGltZSA6Oj0gSU5URUdFUiAoMS4uMzI3NjcpCisJLS0gbWluaW11bSBpbnRlcnZhbCB0aW1lIGJldHdlZW4gYXJlYSByZXBvcnRzIGluIHNlY29uZHMKKworUGVyaW9kaWNMRFJJbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVwb3J0aW5nQW1vdW50CQlSZXBvcnRpbmdBbW91bnQsCisJcmVwb3J0aW5nSW50ZXJ2YWwJUmVwb3J0aW5nSW50ZXJ2YWwsCisJLi4ufQorLS0gcmVwb3J0aW5nSW50ZXJ2YWwgeCByZXBvcnRpbmdBbW91bnQgc2hhbGwgbm90IGV4Y2VlZCA4NjM5OTk5ICg5OSBkYXlzLCAyMyBob3VycywKKy0tIDU5IG1pbnV0ZXMgYW5kIDU5IHNlY29uZHMpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggT01BIE1MUCBhbmQgUkxQCisKK1JlcG9ydGluZ0Ftb3VudCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCittYXhSZXBvcnRpbmdBbW91bnQgSU5URUdFUiA6Oj0gODYzOTk5OQorCitSZXBvcnRpbmdJbnRlcnZhbCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nSW50ZXJ2YWwpCistLSBSZXBvcnRpbmdJbnRlcnZhbCBpcyBpbiBzZWNvbmRzCisKK21heFJlcG9ydGluZ0ludGVydmFsIElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgeworCXBsbW4tTGlzdFByaW9yaXRpemVkCQkJWzBdIE5VTEwJCQkJCU9QVElPTkFMLAorCXBsbW4tTGlzdCAJCQkJCQlbMV0gUExNTkxpc3QsCisJLi4ufQorCitQTE1OTGlzdDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlJlcG9ydGluZ1BMTU4pIE9GCisJCQkJUmVwb3J0aW5nUExNTgorCittYXhOdW1PZlJlcG9ydGluZ1BMTU4gSU5URUdFUiA6Oj0gMjAKKworUmVwb3J0aW5nUExNTjo6PSBTRVFVRU5DRSB7CisJcGxtbi1JZCAJCQkJCQlbMF0gUExNTi1JZCwKKwlyYW4tVGVjaG5vbG9neSAJCQkJCVsxXSBSQU4tVGVjaG5vbG9neQkJCU9QVElPTkFMLAorCXJhbi1QZXJpb2RpY0xvY2F0aW9uU3VwcG9ydAkJWzJdIE5VTEwJCQkJCU9QVElPTkFMLAorCS4uLn0KKworUkFOLVRlY2hub2xvZ3kgOjo9IEVOVU1FUkFURUQgeworCWdzbQkJCSgwKSwKKwl1bXRzCQkoMSksCisJLi4ufQorCitQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uRXN0aW1hdGUJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorCWFnZU9mTG9jYXRpb25Fc3RpbWF0ZQlbMF0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzJdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAJT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbNF0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzVdIFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbwlPUFRJT05BTCwKKwljZWxsSWRPclNhaQlbNl0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJc2FpLVByZXNlbnQJWzddIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbOF0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCQlPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVs5XSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxMF0gTlVMTAkJT1BUSU9OQUwgfQorCistLQlpZiBkZWZlcnJlZG10LWxyUmVzcG9uc2VJbmRpY2F0b3IgaXMgc2V0LCBsb2NhdGlvbkVzdGltYXRlIGlzIGlnbm9yZWQuCisKKy0tIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHNlbnQgdG8gYSBub2RlIHRoYXQgZGlkIG5vdCBpbmRpY2F0ZSB0aGUKKy0tIGdlb2dyYXBoaWMgc2hhcGVzIHN1cHBvcnRlZCBpbiB0aGUgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIFRoZSBsb2NhdGlvbkVzdGltYXRlIGFuZCB0aGUgYWRkLWxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVycyBzaGFsbCBub3QgYmUgc2VudCBpZgorLS0gdGhlIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIGFuZCB0aGUgc2hhcGUgZW5jb2RlZCBpbiBsb2NhdGlvbkVzdGltYXRlIG9yIGFkZC1Mb2NhdGlvbkVzdGltYXRlIGlzIG5vdCBtYXJrZWQKKy0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24KKy0tIHNoYWxsIGJlIHJlamVjdGVkIHdpdGggZXJyb3IgRmFjaWxpdHlOb3RTdXBwb3J0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZGljYXRpb24KKy0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLgorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlyZXF1ZXN0ZWRBY2N1cmFjeUZ1bGZpbGxlZCAgKDApLAorCXJlcXVlc3RlZEFjY3VyYWN5Tm90RnVsZmlsbGVkICAoMSksCisJLi4uCX0KKworRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2Ygc2hhcGUsIG9ubHkgdGhlIGZvbGxvd2luZyBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLQkJKGIpIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLQkJKGMpIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJKGQpIEVsbGlwc29pZCBBcmMKKwktLQkJKGUpIEVsbGlwc29pZCBQb2ludAorCS0tIEFueSBvdGhlciB2YWx1ZSBpbiBvY3RldCAxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZAorCS0tIE9jdGV0cyAyIHRvIDggZm9yIGNhc2UgKGEpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTEgZm9yIGNhc2UgKGIpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZToKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTQgZm9yIGNhc2UgKGMpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCUFsdGl0dWRlCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWlub3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUFuZ2xlIG9mIG1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBhbHRpdHVkZQkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDEzIGZvciBjYXNlIChkKSCWIEVsbGlwc29pZCBBcmMKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlJbm5lciByYWRpdXMJCQkJMiBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgcmFkaXVzCQkJCTEgb2N0ZXQKKwktLQkJT2Zmc2V0IGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJSW5jbHVkZWQgYW5nbGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChlKSCWIEVsbGlwc29pZCBQb2ludAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisKKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBtb3JlIHRoYW4gb25lIG9jdGV0IGFuZAorCS0tIGNvbnRhaW5pbmcgYW55IG90aGVyIHNoYXBlIG9yIGFuIGluY29ycmVjdCBudW1iZXIgb2Ygb2N0ZXRzIG9yIGNvZGluZyBhY2NvcmRpbmcKKwktLSB0byAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSBkaXNjYXJkZWQKKwktLSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyByZWNlaXZlZCAKKwktLSBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSB0cmVhdGVkIGFzCisJLS0gaW52YWxpZCBkYXRhIGJ5IHRoZSByZWNlaXZlciBpZiBhbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGlzIG5vdAorCS0tIHJlY2VpdmVkIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gMjAKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIGZvciBmdXJ0aGVyIHNoYXBlcyBpbiAzR1BQIFRTIDIzLjAzMiB0byBiZSBpbmNsdWRlZCBpbiBsYXRlciAKKwktLSB2ZXJzaW9ucyBvZiAzR1BQIFRTIDI5LjAwMgorCitWZWxvY2l0eUVzdGltYXRlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjcpKQorCS0tIFJlZmVycyB0byBWZWxvY2l0eSBkZXNjcmlwdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgNCBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2YgdmVsb2NpdHksIG9ubHkgdGhlIGZvbGxvd2luZyB0eXBlcyBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLQkJKGEpIEhvcml6b250YWwgVmVsb2NpdHkKKwktLQkJKGIpIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tCQkoYykgSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisJLS0JCShkKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5CisJLS0gRm9yIHR5cGVzIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisJLS0gYW5kIFVuY2VydGFpbnR5LCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBWZXJ0aWNhbCBTcGVlZCBpcyBhbHNvIGluY2x1ZGVkIGluIE9jdGV0IDEKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA0IGZvciBjYXNlIChhKSBIb3Jpem9udGFsIHZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGIpIJYgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNSBmb3IgY2FzZSAoYykgliBIb3Jpem9udGFsIHZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChkKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVZlcnRpY2FsIFNwZWVkCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBVbmNlcnRhaW50eSBTcGVlZAkJCTEgb2N0ZXQKKwktLQkJVmVydGljYWwgVW5jZXJ0YWludHkgU3BlZWQJCQkJMSBvY3RldAorCitQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi5tYXhQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbmluZyBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyA0OS4wMzEuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAyIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bworCS0tIDNHUFAgVFMgNDkuMDMxLiAKKworbWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gSU5URUdFUiA6Oj0gMTAKKwktLSAKKworVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMuLm1heFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbykpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbiBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiB0aGUgcG9zaXRpb25pbmdEYXRhRGlzY3JpbWluYXRvciBhbmQgdGhlIHBvc2l0aW9uaW5nRGF0YVNldAorCS0tIGluY2x1ZGVkIGluIHBvc2l0aW9uRGF0YSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCittYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8gSU5URUdFUiA6Oj0gMTEKKwktLSAKKworQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBhbGwgdGhlIHNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tIE9jdGV0cyAyIHRvIG4gKHdoZXJlIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiBvY3RldHMgbmVjZXNzYXJ5IHRvIGVuY29kZSB0aGUgc2hhcGUKKwktLSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMzIpIGFyZSB1c2VkIHRvIGVuY29kZSB0aGUgc2hhcGUgaXRzZWxmIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKwktLSBlbmNvZGluZyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisJLS0KKwktLSBBbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyLCB3aGV0aGVyIHZhbGlkIG9yIGludmFsaWQsIHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UgCisJLS0gc2hhbGwgYmUgZGlzY2FyZGVkLgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb250YWluaW5nIGFueSBzaGFwZSBub3QgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDIzLjAzMiBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBkYXRhIGJ5IGEgcmVjZWl2ZXIgaWYgbm90IHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gOTEKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIHN1cHBvcnQgZm9yIGFsbCB0aGUgc2hhcGVzIGN1cnJlbnRseSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisKK1N1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsY3MtRXZlbnQJCUxDUy1FdmVudCwKKwlsY3MtQ2xpZW50SUQJTENTLUNsaWVudElELCAKKwlsY3NMb2NhdGlvbkluZm8JTENTTG9jYXRpb25JbmZvLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCWltZWkJCQlbMl0gSU1FSQkJT1BUSU9OQUwsCisJbmEtRVNSRAkJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JLCQlbNF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxvY2F0aW9uRXN0aW1hdGUJWzVdIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzZdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzbHItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzhdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlkZWZlcnJlZG10LWxyRGF0YQlbOV0gRGVmZXJyZWRtdC1sckRhdGEJT1BUSU9OQUwsIAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXSBMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWdlcmFuUG9zaXRpb25pbmdEYXRhCVsxMV0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzEyXSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzEzXQlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzE1XQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJcHNldWRvbnltSW5kaWNhdG9yCVsxOF0gTlVMTAkJT1BUSU9OQUwsCisJYWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCVsxOV0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCU9QVElPTkFMLAorCXZlbG9jaXR5RXN0aW1hdGUJWzIwXSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCXNlcXVlbmNlTnVtYmVyCVsyMV0gU2VxdWVuY2VOdW1iZXIJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsyMl0gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsyM10gTlVMTAkJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIG1zaXNkbiBvciBpbXNpIGlzIG1hbmRhdG9yeQorCS0tIGEgbG9jYXRpb24gZXN0aW1hdGUgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIGxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNob3VsZCAKKwktLSBiZSB0cmFuc2ZlcnJlZCBpbiB0aGlzIHBhcmFtZXRlciBpbiBwcmVmZXJlbmNlIHRvIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZS4KKwktLSB0aGUgZGVmZXJyZWRtdC1sckRhdGEgcGFyYW1ldGVyIHNoYWxsIGJlIGluY2x1ZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBsY3MtRXZlbnQKKwktLSBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UuCisJLS0gaWYgdGhlIGxjcy1FdmVudCBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UgdGhlbiB0aGUgbG9jYXRpb25Fc3RpbWF0ZSAKKwktLSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYgdGhlIAorCS0tIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFkIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKwktLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSB3YXMgbm90IG1hcmtlZAorCS0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIHRlcm1pbmF0aW9uQ2F1c2UgCisJLS0gaW4gZGVmZXJyZWRtdC1sckRhdGEgc2hhbGwgYmUgcHJlc2VudCB3aXRoIHZhbHVlIAorCS0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLiAKKwktLSBJZiBhIGxjcyBldmVudCBpbmRpY2F0ZXMgZGVmZXJyZWQgbXQtbHIgcmVzcG9uc2UsIHRoZSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSAKKwktLSBpbmNsdWRlZC4gCisJLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworRGVmZXJyZWRtdC1sckRhdGEgOjo9IFNFUVVFTkNFIHsKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCURlZmVycmVkTG9jYXRpb25FdmVudFR5cGUsCisJdGVybWluYXRpb25DYXVzZQlbMF0gVGVybWluYXRpb25DYXVzZQlPUFRJT05BTCwKKwlsY3NMb2NhdGlvbkluZm8JWzFdIExDU0xvY2F0aW9uSW5mbwlPUFRJT05BTCwKKwkuLi59CisJLS0gbGNzTG9jYXRpb25JbmZvIG1heSBiZSBpbmNsdWRlZCBvbmx5IGlmIGEgdGVybWluYXRpb25DYXVzZSBpcyBwcmVzZW50IAorCS0tIGluZGljYXRpbmcgbXQtbHJSZXN0YXJ0LgorCitMQ1MtRXZlbnQgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeUNhbGxPcmlnaW5hdGlvbiAgKDApLAorCWVtZXJnZW5jeUNhbGxSZWxlYXNlICAoMSksIAorCW1vLWxyICAoMiksCisJLi4uLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZSAgKDMpICwKKwlkZWZlcnJlZG1vLWxyVFRUUEluaXRpYXRpb24gICg0KSAgfQorCS0tCWRlZmVycmVkbXQtbHJSZXNwb25zZSBpcyBhcHBsaWNhYmxlIHRvIHRoZSBkZWxpdmVyeSBvZiBhIGxvY2F0aW9uIGVzdGltYXRlIAorCS0tCWZvciBhbiBMRFIgaW5pdGlhdGVkIGVhcmxpZXIgYnkgZWl0aGVyIHRoZSBuZXR3b3JrICh2aWEgYW4gTVQtTFIgYWN0aXZhdGUgZGVmZXJyZWQgCisJLS0JbG9jYXRpb24pIG9yIHRoZSBVRSAodmlhIGEgZGVmZXJyZWQgTU8tTFIgVFRUUCBpbml0aWF0aW9uKQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQlhIFN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTENTLUV2ZW50CisJLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgYSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitUZXJtaW5hdGlvbkNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlub3JtYWwgICgwKSwKKwllcnJvcnVuZGVmaW5lZCAgKDEpLAorCWludGVybmFsVGltZW91dCAgKDIpLAorCWNvbmdlc3Rpb24gICgzKSwKKwltdC1sclJlc3RhcnQgICg0KSwKKwlwcml2YWN5VmlvbGF0aW9uICAoNSksCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkICg2KSAsCisJc3Vic2NyaWJlclRlcm1pbmF0aW9uICg3KSwKKwl1RVRlcm1pbmF0aW9uICg4KSwKKwluZXR3b3JrVGVybWluYXRpb24gKDkpICB9IAorLS0gbXQtbHJSZXN0YXJ0IHNoYWxsIGJlIHVzZWQgdG8gdHJpZ2dlciB0aGUgR01MQyB0byByZXN0YXJ0IHRoZSBsb2NhdGlvbiBwcm9jZWR1cmUsIAorLS0gZWl0aGVyIGJlY2F1c2UgdGhlIHNlbmRpbmcgbm9kZSBrbm93cyB0aGF0IHRoZSB0ZXJtaW5hbCBoYXMgbW92ZWQgdW5kZXIgY292ZXJhZ2UgCistLSBvZiBhbm90aGVyIE1TQyBvciBTR1NOIChlLmcuIFNlbmQgSWRlbnRpZmljYXRpb24gcmVjZWl2ZWQpLCBvciBiZWNhdXNlIHRoZSBzdWJzY3JpYmVyCistLSBoYXMgYmVlbiBkZXJlZ2lzdGVyZWQgZHVlIHRvIGEgQ2FuY2VsIExvY2F0aW9uIHJlY2VpdmVkIGZyb20gSExSLgorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZXJyb3J1bmRlZmluZWQpIAorCitTZXF1ZW5jZU51bWJlciA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4uLCAKKwluYS1FU1JLCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5hLUVTUkQJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbNF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbNV0JTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCB9CisKKy0tIG5hLUVTUksgYW5kIG5hLUVTUkQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gcmVjZWlwdCBvZiBib3RoIG5hLUVTUksgYW5kIG5hLUVTUkQgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIHJldHVybiBlcnJvcgorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEyYTAyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDI3ODAgQEAKKy0tICRJZDogTUFQLU1TLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjEJTW9iaWxlIFNlcnZpY2UgZGF0YSB0eXBlcworCitNQVAtTVMtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisKKwktLSBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKwlVcGRhdGVMb2NhdGlvbkFyZywKKwlVcGRhdGVMb2NhdGlvblJlcywKKwlDYW5jZWxMb2NhdGlvbkFyZywKKwlDYW5jZWxMb2NhdGlvblJlcywgCisJUHVyZ2VNUy1BcmcsIAorCVB1cmdlTVMtUmVzLAorCVNlbmRJZGVudGlmaWNhdGlvbkFyZywKKwlTZW5kSWRlbnRpZmljYXRpb25SZXMsIAorCVVwZGF0ZUdwcnNMb2NhdGlvbkFyZywKKwlVcGRhdGVHcHJzTG9jYXRpb25SZXMsCisJSVNULVN1cHBvcnRJbmRpY2F0b3IsIAorCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cywKKworCS0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJR1NOLUFkZHJlc3MsCisKKwktLSBoYW5kb3ZlciB0eXBlcworCUZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlQcmVwYXJlSE8tQXJnLAorCVByZXBhcmVITy1SZXMsCisJUHJlcGFyZVN1YnNlcXVlbnRITy1BcmcsIAorCVByZXBhcmVTdWJzZXF1ZW50SE8tUmVzLAorCVByb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlTZW5kRW5kU2lnbmFsLUFyZywKKwlTZW5kRW5kU2lnbmFsLVJlcywKKworCS0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvQXJnLAorCVNlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMsIAorCUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZywKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcywKKworCS0tIHNlY3VyaXR5IG1hbmFnZW1lbnQgdHlwZXMKKwlLYywgCisJQ2tzbiwKKworCS0tIGVxdWlwbWVudCBtYW5hZ2VtZW50IHR5cGVzCisJQ2hlY2tJTUVJLUFyZywKKwlDaGVja0lNRUktUmVzLAorCisJLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFBcmcsCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFSZXMsIAorCUxTQUlkZW50aXR5LAorCURlbGV0ZVN1YnNjcmliZXJEYXRhQXJnLAorCURlbGV0ZVN1YnNjcmliZXJEYXRhUmVzLAorCUV4dC1Rb1MtU3Vic2NyaWJlZCwKKwlFeHQyLVFvUy1TdWJzY3JpYmVkLCAKKwlFeHQzLVFvUy1TdWJzY3JpYmVkLAorCVN1YnNjcmliZXJEYXRhLAorCU9EQi1EYXRhLAorCVN1YnNjcmliZXJTdGF0dXMsCisJWm9uZUNvZGVMaXN0LAorCW1heE51bU9mWm9uZUNvZGVzLCAKKwlPLUNTSSwgCitELUNTSSwKKwlPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCwgCisJVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QsCisJU1MtQ1NJLAorCVNlcnZpY2VLZXksCisJRGVmYXVsdENhbGxIYW5kbGluZywKKwlDYW1lbENhcGFiaWxpdHlIYW5kbGluZywKKwlCYXNpY1NlcnZpY2VDcml0ZXJpYSwKKwlTdXBwb3J0ZWRDYW1lbFBoYXNlcywKKwlPZmZlcmVkQ2FtZWw0Q1NJcywKKwlPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzLAorCW1heE51bU9mQ2FtZWxURFBEYXRhLAorCUNVRy1JbmRleCwgCisJQ1VHLUluZm8sCisJQ1VHLUludGVybG9jaywKKwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJSW50cmFDVUctT3B0aW9ucywKKwlOb3RpZmljYXRpb25Ub01TVXNlciwgCisJUW9TLVN1YnNjcmliZWQsCitJU1QtQWxlcnRUaW1lclZhbHVlLAorCVQtQ1NJLAorCVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKK0FQTiwKK0FkZGl0aW9uYWxJbmZvLAorCisJLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKwlSZXNldEFyZywKKwlSZXN0b3JlRGF0YUFyZywKKwlSZXN0b3JlRGF0YVJlcywKKworLS0gcHJvdmlkZSBzdWJzY3JpYmVyIGluZm8gdHlwZXMgCitHZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitNUy1DbGFzc21hcmsyLAorR1BSU01TQ2xhc3MsCisKKwktLSBzdWJzY3JpYmVyIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlQcm92aWRlU3Vic2NyaWJlckluZm9BcmcsCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvUmVzLAorCVN1YnNjcmliZXJJbmZvLAorCUxvY2F0aW9uSW5mb3JtYXRpb24sCisJTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsCisJUkFJZGVudGl0eSwKKwlTdWJzY3JpYmVyU3RhdGUsCisJR1BSU0NoYXJnaW5nSUQsIAorTU5QSW5mb1JlcywKKwlSb3V0ZWluZ051bWJlciwKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlBbnlUaW1lSW50ZXJyb2dhdGlvbkFyZywKKwlBbnlUaW1lSW50ZXJyb2dhdGlvblJlcywKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGhhbmRsaW5nIHR5cGVzCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcsCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMsCisJQW55VGltZU1vZGlmaWNhdGlvbkFyZywKKwlBbnlUaW1lTW9kaWZpY2F0aW9uUmVzLAorCisJLS0gc3Vic2NyaWJlciBkYXRhIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZywKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcywKKworCS0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc0FyZywKKwlTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzLAorCisJLS0gZmFpbHVyZSByZXBvcnRpbmcgdHlwZXMKKwlGYWlsdXJlUmVwb3J0QXJnLAorCUZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCU5vdGVNc1ByZXNlbnRGb3JHcHJzQXJnLAorCU5vdGVNc1ByZXNlbnRGb3JHcHJzUmVzLAorCisJLS0gTW9iaWxpdHkgTWFuYWdlbWVudCB0eXBlcworTm90ZU1NLUV2ZW50QXJnLAorCU5vdGVNTS1FdmVudFJlcywKKwlOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cywKKwlQYWdpbmdBcmVhLAorCisJLS0gVkdDUyAvIFZCUyB0eXBlcyB0eXBlcworR3JvdXBJZCwgCitMb25nLUdyb3VwSWQsCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucworCis7CisKK0lNUE9SVFMKKwltYXhOdW1PZlNTLAorCVNTLVN1YnNjcmlwdGlvbk9wdGlvbiwKKwlTUy1MaXN0LAorCVNTLUZvckJTLUNvZGUsCisJUGFzc3dvcmQKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0LUJlYXJlclNlcnZpY2VDb2RlCitGUk9NIE1BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1UZWxlc2VydmljZUNvZGUKK0ZST00gTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCisJQWRkcmVzc1N0cmluZywKK0lTRE4tQWRkcmVzc1N0cmluZywgCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLCAKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlJTVNJLCAKKwlJTUVJLAorCVRNU0ksCisJSExSLUxpc3QsCisJTE1TSSwKKwlJZGVudGl0eSwKKwlHbG9iYWxDZWxsSWQsCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJTkFFQS1QcmVmZXJyZWRDSSwKKwlFTUxQUC1JbmZvLCAKKwlNQy1TUy1JbmZvLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUV4dC1TUy1TdGF0dXMsCisJTENTU2VydmljZVR5cGVJRCwKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJVEJDRC1TVFJJTkcsCisJTEFJRml4ZWRMZW5ndGgsCisJUExNTi1JZCwKK0VNTFBQLVByaW9yaXR5CitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCVRyYWNlUHJvcGFnYXRpb25MaXN0CitGUk9NIE1BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKKzsKKworLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUxvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNjLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXZsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxtc2kJCQlbMTBdIExNU0kJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwsCisJaW5mb3JtUHJldmlvdXNOZXR3b3JrRW50aXR5CVsxMV0JTlVMTAkJT1BUSU9OQUwsCisJY3MtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzEyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVsxM10gQURELUluZm8JT1BUSU9OQUwsCisJcGFnaW5nQXJlYQlbMTRdIFBhZ2luZ0FyZWEJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxNV0gTlVMTAkJT1BUSU9OQUwgCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCSB9CisKK1ZMUi1DYXBhYmlsaXR5IDo6PSBTRVFVRU5DRXsKKwlzdXBwb3J0ZWRDYW1lbFBoYXNlcyAgCVswXSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlpc3RTdXBwb3J0SW5kaWNhdG9yCVsxXSBJU1QtU3VwcG9ydEluZGljYXRvcglPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVszXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs3XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJbG9uZ0dyb3VwSUQtU3VwcG9ydGVkCVs4XQlOVUxMCQlPUFRJT05BTCB9CisKK1N1cHBvcnRlZFJBVC1UeXBlczo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA1IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkgCisKKworU3VwZXJDaGFyZ2VySW5mbyA6Oj0gQ0hPSUNFIHsKKwlzZW5kU3Vic2NyaWJlckRhdGEJWzBdIE5VTEwsCisJc3Vic2NyaWJlckRhdGFTdG9yZWQJWzFdIEFnZUluZGljYXRvciB9CisKK0FnZUluZGljYXRvciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi42KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorCitJU1QtU3VwcG9ydEluZGljYXRvciA6Oj0gIEVOVU1FUkFURUQgeworCWJhc2ljSVNUU3VwcG9ydGVkCSgwKSwKKwlpc3RDb21tYW5kU3VwcG9ydGVkCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJyBpc3RDb21tYW5kU3VwcG9ydGVkICcKKworU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzIDo6PSBCSVQgU1RSSU5HIHsKKwlsY3NDYXBhYmlsaXR5U2V0MSAoMCksCisJbGNzQ2FwYWJpbGl0eVNldDIgKDEpLAorCWxjc0NhcGFiaWxpdHlTZXQzICgyKSwKKwlsY3NDYXBhYmlsaXR5U2V0NCAoMykgLAorCWxjc0NhcGFiaWxpdHlTZXQ1ICg0KSB9IChTSVpFICgyLi4xNikpIAorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQxIGluZGljYXRlcyBMQ1MgUmVsZWFzZTk4IG9yIFJlbGVhc2U5OSB2ZXJzaW9uLgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQyIGluZGljYXRlcyBMQ1MgUmVsZWFzZTQuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDMgaW5kaWNhdGVzIExDUyBSZWxlYXNlNS4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NCBpbmRpY2F0ZXMgTENTIFJlbGVhc2U2LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQ1IGluZGljYXRlcyBMQ1MgUmVsZWFzZTcgb3IgbGF0ZXIgdmVyc2lvbi4KKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBMQ1MgY2FwYWJpbGl0eSBzZXRzIGl0IHN1cHBvcnRzLiAKKy0tIElmIG5vIGJpdCBpcyBzZXQgdGhlbiB0aGUgc2VuZGluZyBub2RlIGRvZXMgbm90IHN1cHBvcnQgTENTLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBWTFIgdGhlbiB0aGUgVkxSIG1heSBzdXBwb3J0IGF0IG1vc3QgY2FwYWJpbGl0eSBzZXQxLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBTR1NOIHRoZW4gbm8gc3VwcG9ydCBmb3IgTENTIGlzIGFzc3VtZWQuCistLSBBbiBTR1NOIGlzIG5vdCBhbGxvd2VkIHRvIGluZGljYXRlIHN1cHBvcnQgb2YgY2FwYWJpbGl0eSBzZXQxLgorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1VwZGF0ZUxvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkLUNhcGFiaWxpdHkJTlVMTAkJCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEtQ2FwYWJpbGl0eQlbMF1OVUxMCQkJT1BUSU9OQUwgfQorCitBREQtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWltZWlzdgkJWzBdIElNRUksCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwktLSBUaGUgc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlIHBhcmFtZXRlciBpbiB0aGUgVXBkYXRlTG9jYXRpb25BcmcgYW5kIHRoZSBBREQtSW5mbworCS0tIHN0cnVjdHVyZXMgY2FycnkgdGhlIHNhbWUgc2VtYW50aWMuCisJLi4ufQorCisKK1BhZ2luZ0FyZWEgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GIExvY2F0aW9uQXJlYSAKKworCitMb2NhdGlvbkFyZWEgOjo9IENIT0lDRSB7CisJbGFpRml4ZWRMZW5ndGgJWzBdIExBSUZpeGVkTGVuZ3RoLAorCWxhYwkJCVsxXSBMQUN9CisKKworTEFDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIENvZGUgb2YgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAKKyAgICAgLS0gM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworQ2FuY2VsTG9jYXRpb25BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaWRlbnRpdHkJCUlkZW50aXR5LAorCWNhbmNlbGxhdGlvblR5cGUJQ2FuY2VsbGF0aW9uVHlwZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0eXBlT2ZVcGRhdGUJWzBdIFR5cGVPZlVwZGF0ZQlPUFRJT05BTCB9CisKK1R5cGVPZlVwZGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbi1jaGFuZ2UgKDApLAorCW1tZS1jaGFuZ2UgKDEpLAorCS4uLn0KKwktLSBUeXBlT2ZVcGRhdGUgc2hhbGwgYmUgYWJzZW50IGlmIENhbmNlbGxhdGlvblR5cGUgaXMgZGlmZmVyZW50IGZyb20gdXBkYXRlUHJvY2VkdXJlCisKK0NhbmNlbGxhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXVwZGF0ZVByb2NlZHVyZQkoMCksCisJc3Vic2NyaXB0aW9uV2l0aGRyYXcJKDEpLAorCS4uLn0KKwktLSBUaGUgSExSIHNoYWxsIG5vdCBzZW5kIHZhbHVlcyBvdGhlciB0aGFuIGxpc3RlZCBhYm92ZQorCitDYW5jZWxMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQdXJnZU1TLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwl2bHItTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlmcmVlemVUTVNJCVswXQlOVUxMCQlPUFRJT05BTCwKKwlmcmVlemVQLVRNU0kJWzFdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWZyZWV6ZU0tVE1TSQlbMl0JTlVMTAkJT1BUSU9OQUwgfQorCitTZW5kSWRlbnRpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwl0bXNpCQkJVE1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIAlPUFRJT05BTCwKKwktLSB3aXRoaW4gYSBkaWFsb2d1ZSBudW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgc2hhbGwgYmUgcHJlc2VudCBpbiAKKwktLSB0aGUgZmlyc3Qgc2VydmljZSByZXF1ZXN0IGFuZCBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBzdWJzZXF1ZW50IHNlcnZpY2UgcmVxdWVzdHMuIAorCS0tIElmIHJlY2VpdmVkIGluIGEgc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3QgaXQgc2hhbGwgYmUgZGlzY2FyZGVkLiAKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwltc2MtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJcHJldmlvdXMtTEFJCVswXSBMQUlGaXhlZExlbmd0aAlPUFRJT05BTCwKKwlob3BDb3VudGVyCVsxXSBIb3BDb3VudGVyCU9QVElPTkFMIH0KKworSG9wQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uMykKKworU2VuZElkZW50aWZpY2F0aW9uUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJCQkJT1BUSU9OQUwsCisJLS0gSU1TSSBzaGFsbCBiZSBwcmVzZW50IGluIHRoZSBmaXJzdCAob3Igb25seSkgc2VydmljZSByZXNwb25zZSBvZiBhIGRpYWxvZ3VlLgorCS0tIElmIG11bHRpcGxlIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHByZXNlbnQgaW4gYSBkaWFsb2d1ZSB0aGVuIElNU0kKKwktLSBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBhbnkgc2VydmljZSByZXNwb25zZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUuCisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCwKKwljdXJyZW50U2VjdXJpdHlDb250ZXh0CVsyXUN1cnJlbnRTZWN1cml0eUNvbnRleHQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK0F1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gQ0hPSUNFIHsKKwl0cmlwbGV0TGlzdAlbMF0gVHJpcGxldExpc3QsCisJcXVpbnR1cGxldExpc3QJWzFdIFF1aW50dXBsZXRMaXN0IH0KKworVHJpcGxldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJQXV0aGVudGljYXRpb25UcmlwbGV0CisKK1F1aW50dXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uUXVpbnR1cGxldAorCitBdXRoZW50aWNhdGlvblRyaXBsZXQgOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlzcmVzCQkJU1JFUywKKwlrYwkJCUtjLAorCS4uLn0KKworQXV0aGVudGljYXRpb25RdWludHVwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJY2sJCQlDSywKKwlpawkJCUlLLAorCWF1dG4JCQlBVVROLAorCS4uLn0KKworQ3VycmVudFNlY3VyaXR5Q29udGV4dCA6Oj0gQ0hPSUNFIHsKKwlnc20tU2VjdXJpdHlDb250ZXh0RGF0YQlbMF0gR1NNLVNlY3VyaXR5Q29udGV4dERhdGEsCisJdW10cy1TZWN1cml0eUNvbnRleHREYXRhCVsxXSBVTVRTLVNlY3VyaXR5Q29udGV4dERhdGEgfQorCitHU00tU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWtjCQkJS2MsCisJY2tzbgkJCUNrc24sCisJLi4uIH0KKworVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIDo6PSBTRVFVRU5DRSB7CisJY2sJCQlDSywKKwlpawkJCUlLLAorCWtzaQkJCUtTSSwKKwkuLi4gfQorCitSQU5EIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworU1JFUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworS2MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCisKK1hSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uMTYpKQorCitDSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0lLIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworQVVUTiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVFMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTQpKQorCitDa3NuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitLU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjQuMDA4CisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWZhaWx1cmVDYXVzZQlGYWlsdXJlQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJlLWF0dGVtcHQJQk9PTEVBTgkJT1BUSU9OQUwsCisJYWNjZXNzVHlwZQlBY2Nlc3NUeXBlCU9QVElPTkFMLAorCXJhbmQJCQlSQU5ECQkJT1BUSU9OQUwsCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitBY2Nlc3NUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljYWxsICgwKSwKKwllbWVyZ2VuY3lDYWxsICgxKSwKKwlsb2NhdGlvblVwZGF0aW5nICgyKSwKKwlzdXBwbGVtZW50YXJ5U2VydmljZSAoMyksCisJc2hvcnRNZXNzYWdlICg0KSwKKwlncHJzQXR0YWNoICg1KSwKKwlyb3V0aW5nQXJlYVVwZGF0aW5nICg2KSwKKwlzZXJ2aWNlUmVxdWVzdCAoNyksCisJcGRwQ29udGV4dEFjdGl2YXRpb24gKDgpLAorCXBkcENvbnRleHREZWFjdGl2YXRpb24gKDkpLAorCS4uLiwKKwlncHJzRGV0YWNoICgxMCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTAgc2hhbGwgYmUgaWdub3JlZC4KKworQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJd3JvbmdVc2VyUmVzcG9uc2UgICgwKSwKKwl3cm9uZ05ldHdvcmtTaWduYXR1cmUgICgxKX0KKworLS0gZ3BycyBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKworVXBkYXRlR3Byc0xvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJc2dzbi1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwlzZ3NuLUFkZHJlc3MJR1NOLUFkZHJlc3MsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNnc24tQ2FwYWJpbGl0eQlbMF0gU0dTTi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJcHMtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzJdCU5VTEwJCU9QVElPTkFMLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGQtaW5mbwkJWzRdICBBREQtSW5mbwlPUFRJT05BTCwKKwllcHMtaW5mbwkJWzVdCUVQUy1JbmZvCU9QVElPTkFMLAorCXNlcnZpbmdOb2RlVHlwZUluZGljYXRvcglbNl0JTlVMTAkJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVs3XSBOVUxMCQlPUFRJT05BTCwKKwl1c2VkUkFULVR5cGUJWzhdIFVzZWQtUkFULVR5cGUJT1BUSU9OQUwgCisJIH0KKworVXNlZC1SQVQtVHlwZTo6PSBFTlVNRVJBVEVEIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KSwKKwkuLi59CisKK0VQUy1JbmZvIDo6PSBDSE9JQ0V7CisJcGRuLWd3LXVwZGF0ZQlbMF0gUEROLUdXLVVwZGF0ZSwKKwlpc3ItSW5mb3JtYXRpb24JWzFdIElTUi1JbmZvcm1hdGlvbiB9CisKK1BETi1HVy1VcGRhdGUgOjo9IFNFUVVFTkNFeworCWFwbgkJCVswXSBBUE4JCU9QVElPTkFMLAorCXBkbi1ndy1JZGVudGl0eQlbMV0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCWNvbnRleHRJZAkJWzJdIENvbnRleHRJZCAgICAgICAgICAgICAgICAgICAgIE9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0lTUi1JbmZvcm1hdGlvbjo6PSBCSVQgU1RSSU5HIHsKKwl1cGRhdGVNTUUgICgwKSwKKwljYW5jZWxTR1NOICAoMSl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBJU1ItSW5mb3JtYXRpb24gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1NHU04tQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluU2VydmluZ05ldHdvcmtFbnRpdHkJWzJdIFN1cGVyQ2hhcmdlckluZm8JT1BUSU9OQUwgLAorCWdwcnNFbmhhbmNlbWVudHNTdXBwb3J0SW5kaWNhdG9yIAlbM10gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbNF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XSAgU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs2XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzbXNDYWxsQmFycmluZ1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAlzdXBwb3J0ZWRSQVQtVHlwZXNJbmRpY2F0b3IJWzhdCVN1cHBvcnRlZFJBVC1UeXBlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRGZWF0dXJlczo6PSBCSVQgU1RSSU5HIHsKKwlvZGItYWxsICgwKSwKKwlvZGItSFBMTU4tQVBOICgxKSwKKwlvZGItVlBMTU4tQVBOICgyKSwKKwlyZWdTdWIgKDMpfSAoU0laRSAoNC4uOCkpCisKK0dTTi1BZGRyZXNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjE3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK1VwZGF0ZUdwcnNMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlzZ3NuLW1tZVNlcGFyYXRpb25TdXBwb3J0ZWQJWzBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0gaGFuZG92ZXIgdHlwZXMKKworRm9yd2FyZEFjY2Vzc1NpZ25hbGxpbmctQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVswXSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVsxXSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWtleVN0YXR1cwkJWzJdCUtleVN0YXR1cwlPUFRJT05BTCwKKwlhbGxvd2VkR1NNLUFsZ29yaXRobXMJWzRdCUFsbG93ZWRHU00tQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlhbGxvd2VkVU1UUy1BbGdvcml0aG1zCVs1XQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJcmFkaW9SZXNvdXJjZUxpc3QJWzddCVJhZGlvUmVzb3VyY2VMaXN0CU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzldCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVs4XQlSQU5BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzEwXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwljdXJyZW50bHlVc2VkQ29kZWMJWzExXSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzEyXSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxM10gTlVMTAkJT1BUSU9OQUwsCisJaXVTZWxlY3RlZENvZGVjCVsxNF0JQ29kZWMJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMTVdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMTddCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMIH0KKworQWxsb3dlZEdTTS1BbGdvcml0aG1zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tCisJLS0gUGVybWl0dGVkIEFsZ29yaXRobXMgZGVmaW5lZCBpbiAzR1BQIFRTIDQ4LjAwOAorCS0tIEEgbm9kZSBzaGFsbCBtYXJrIGFsbCBHU00gYWxnb3JpdGhtcyB0aGF0IGFyZSBhbGxvd2VkIGluIE1TQy1CCisKK0FsbG93ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlbMF0gCVBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG1zCVsxXSAJUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMuIAorCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyA6Oj0KKwkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtc0xlbmd0aCkpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitLZXlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW9sZCAgKDApLAorCW5ldyAgKDEpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAib2xkIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAibmV3IgorCitQcmVwYXJlSE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCWhvLU51bWJlck5vdFJlcXVpcmVkCU5VTEwJCQlPUFRJT05BTCwgCisJdGFyZ2V0Uk5DSWQJWzFdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJSZXF1ZXN0ZWQJWzNdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbNF0gSU1TSQkJT1BUSU9OQUwsCisJaW50ZWdyaXR5UHJvdGVjdGlvbkluZm8JWzVdIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJZW5jcnlwdGlvbkluZm8JWzZdIEVuY3J5cHRpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs3XSBSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs5XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbMTBdCUFsbG93ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUxpc3QJWzExXSBSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJhYi1JZAkJWzEyXSBSQUItSWQJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglbMTNdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVsxNF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLCAKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyTGlzdAlbMTVdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0CU9QVElPTkFMLAorCWFzY2lDYWxsUmVmZXJlbmNlCVsyMF0JQVNDSS1DYWxsUmVmZXJlbmNlCU9QVElPTkFMLAorCWdlcmFuLWNsYXNzbWFyawlbMTZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlpdUN1cnJlbnRseVVzZWRDb2RlYwlbMTddIENvZGVjCU9QVElPTkFMLAorCWl1U3VwcG9ydGVkQ29kZWNzTGlzdAlbMThdIFN1cHBvcnRlZENvZGVjc0xpc3QJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwl1ZXNiaS1JdQkJWzIxXQlVRVNCSS1JdQlPUFRJT05BTCwKKwlpbWVpc3YJCVsyMl0JSU1FSQkJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMjNdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMjVdCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMCSB9CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzKSBPRgorCQkJCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvCisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvIDo6PSBTRVFVRU5DRSB7CisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglCU1NNQVAtU2VydmljZUhhbmRvdmVyLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBzZXJ2aWNlIGhhbmRvdmVycyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlNlcnZpY2VIYW5kb3ZlcnMgIElOVEVHRVIgOjo9IDcKKworQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU2VydmljZSBIYW5kb3ZlciBpbmZvcm1hdGlvbiBlbGVtZW50IGluCisJLS0gM0dQUCBUUyA0OC4wMDguCisKK1JBTkFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIFNlcnZpY2UtSGFuZG92ZXIgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworCitSYWRpb1Jlc291cmNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mUmFkaW9SZXNvdXJjZXMpIE9GCisJCQkJUmFkaW9SZXNvdXJjZQorCitSYWRpb1Jlc291cmNlIDo6PSBTRVFVRU5DRSB7CisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgcmFkaW8gcmVzb3VyY2VzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKKwkuLi59CisKK21heE51bU9mUmFkaW9SZXNvdXJjZXMgIElOVEVHRVIgOjo9IDcKKworUHJlcGFyZUhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwloYW5kb3Zlck51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXJlbG9jYXRpb25OdW1iZXJMaXN0CVsxXQlSZWxvY2F0aW9uTnVtYmVyTGlzdAlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGljYWxsQmVhcmVySW5mbwlbM10JTXVsdGljYWxsQmVhcmVySW5mbwlPUFRJT05BTCwKKwltdWx0aXBsZUJlYXJlck5vdFN1cHBvcnRlZAlOVUxMCQkJT1BUSU9OQUwsCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzVdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCSBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJaXVTZWxlY3RlZENvZGVjCVs3XSBDb2RlYwkJT1BUSU9OQUwsCisJaXVBdmFpbGFibGVDb2RlY3NMaXN0CVs4XSBDb2RlY0xpc3QJT1BUSU9OQUwgfQorCitTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcyA6Oj0gU0VRVUVOQ0UgeworCWludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0JWzBdIAlDaG9zZW5JbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG0JWzFdIAlDaG9zZW5FbmNyeXB0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEVuY3J5cHRpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY2hvc2VuQ2hhbm5lbEluZm8JWzBdIENob3NlbkNoYW5uZWxJbmZvCU9QVElPTkFMLAorCWNob3NlblNwZWVjaFZlcnNpb24JWzFdIENob3NlblNwZWVjaFZlcnNpb24JT1BUSU9OQUwsCisJLi4ufQorCitDaG9zZW5DaGFubmVsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgQ2hvc2VuIENoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitDaG9zZW5TcGVlY2hWZXJzaW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBTcGVlY2ggVmVyc2lvbiAoY2hvc2VuKSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMKKwktLSA0OC4wMDggCisKK1ByZXBhcmVTdWJzZXF1ZW50SE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCXRhcmdldE1TQy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRSTkNJZAlbMl0gUk5DSWQJCU9QVElPTkFMLAorCWFuLUFQRFUJCVszXQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlzZWxlY3RlZFJhYi1JZAlbNF0JUkFCLUlkCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlnZXJhbi1jbGFzc21hcmsJWzZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbN10gTlVMTAkJT1BUSU9OQUwgfQorCitQcmVwYXJlU3Vic2VxdWVudEhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Byb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlzZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlbMV0JU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJc2VsZWN0ZWRHU00tQWxnb3JpdGhtCVsyXQlTZWxlY3RlZEdTTS1BbGdvcml0aG0JT1BUSU9OQUwsCisJY2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVszXSBDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdIFJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCWlVU2VsZWN0ZWRDb2RlYwlbNV0gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbNl0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU3VwcG9ydGVkQ29kZWNzTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXV0cmFuQ29kZWNMaXN0CVswXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZ2VyYW5Db2RlY0xpc3QJWzFdIENvZGVjTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NvZGVjTGlzdCA6Oj0gU0VRVUVOQ0UgeworCWNvZGVjMQkJWzFdIENvZGVjLAorCWNvZGVjMgkJWzJdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzMJCVszXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM0CQlbNF0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNQkJWzVdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzYJCVs2XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM3CQlbN10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjOAkJWzhdIENvZGVjCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisJLS0gQ29kZWNzIGFyZSBzZW50IGluIHByaW9yaXR5IG9yZGVyIHdoZXJlIGNvZGVjMSBoYXMgaGlnaGVzdCBwcmlvcml0eQorCitDb2RlYyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKKworCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEJQ29kZWQgYXMgQ29kZWMgSWRlbnRpZmljYXRpb24gY29kZSBpbiAzR1BQIFRTIDI2LjEwMworCS0tIG9jdGV0cyAyLDMsNAlQYXJhbWV0ZXJzIGZvciB0aGUgQ29kZWMgYXMgZGVmaW5lZCBpbiAzR1BQIFRTCisJLS0JCQkyNi4xMDMsIGlmIGF2YWlsYWJsZSwgbGVuZ3RoIGRlcGVuZGluZyBvbiB0aGUgY29kZWMKKworR0VSQU4tQ2xhc3NtYXJrIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjg3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgR0VSQU4gQ2xhc3NtYXJrIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworU2VsZWN0ZWRHU00tQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tIENob3NlbiBFbmNyeXB0aW9uCisJLS0gQWxnb3JpdGhtIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBvbmx5IHRoZSBzZWxlY3RlZCBHU00gYWxnb3JpdGhtCisKK1NlbmRFbmRTaWduYWwtQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1NlbmRFbmRTaWduYWwtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworUk5DSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4CisJLS0gb2N0ZXRzIDYgYW5kIDcJUk5DIElkIHZhbHVlIGFjY29yZGluZyB0byAzR1BQIFRTIDI1LjQxMworCitSZWxvY2F0aW9uTnVtYmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKSBPRgorCQkJCVJlbG9jYXRpb25OdW1iZXIKKworTXVsdGljYWxsQmVhcmVySW5mbyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKQorCitSZWxvY2F0aW9uTnVtYmVyIDo6PSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBjYWxscyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCitSQUItSWQgOjo9IElOVEVHRVIgKDEuLm1heE5yT2ZSQUJzKQorCittYXhOck9mUkFCcyBJTlRFR0VSIDo6PSAyNTUKKworbWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyICBJTlRFR0VSIDo6PSA3CisKK1JhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi4xMykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENoYW5uZWwgVHlwZSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK0ludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZJbnRlZ3JpdHlJbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mSW50ZWdyaXR5SW5mbyBJTlRFR0VSIDo6PSAxMDAKKworRW5jcnlwdGlvbkluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE4Li5tYXhOdW1PZkVuY3J5cHRpb25JbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEVuY3J5cHRpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mRW5jcnlwdGlvbkluZm8gSU5URUdFUiA6Oj0gMTAwCisKKy0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzLAorCXNlZ21lbnRhdGlvblByb2hpYml0ZWQJTlVMTAkJCU9QVElPTkFMLAorCWltbWVkaWF0ZVJlc3BvbnNlUHJlZmVycmVkCVsxXSBOVUxMCQkJT1BUSU9OQUwsCisJcmUtc3luY2hyb25pc2F0aW9uSW5mbwlSZS1zeW5jaHJvbmlzYXRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlyZXF1ZXN0aW5nTm9kZVR5cGUJWzNdIFJlcXVlc3RpbmdOb2RlVHlwZQlPUFRJT05BTCwKKwlyZXF1ZXN0aW5nUExNTi1JZAlbNF0gUExNTi1JZAlPUFRJT05BTCwKKwludW1iZXJPZlJlcXVlc3RlZEFkZGl0aW9uYWwtVmVjdG9ycwlbNV0gTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU9QVElPTkFMLAorCWFkZGl0aW9uYWxWZWN0b3JzQXJlRm9yRVBTCVs2XSBOVUxMCQlPUFRJT05BTCB9CQorCisKK051bWJlck9mUmVxdWVzdGVkVmVjdG9ycyA6Oj0gSU5URUdFUiAoMS4uNSkKKworUmUtc3luY2hyb25pc2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCWF1dHMJCQlBVVRTLAorCS4uLn0KKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb1JlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhdXRoZW50aWNhdGlvblNldExpc3QJQXV0aGVudGljYXRpb25TZXRMaXN0IAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwllcHMtQXV0aGVudGljYXRpb25TZXRMaXN0CVsyXSBFUFMtQXV0aGVudGljYXRpb25TZXRMaXN0CU9QVElPTkFMIH0KKworRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlFUEMtQVYKKworRVBDLUFWIDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJYXV0bgkJCUFVVE4sCisJa2FzbWUJCUtBU01FLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitLQVNNRSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1JlcXVlc3RpbmdOb2RlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJdmxyICAoMCksCisJc2dzbiAgKDEpLAorCS4uLiwKKwlzLWNzY2YgICgyKSwKKwlic2YgICgzKSwKKwlnYW4tYWFhLXNlcnZlciAgKDQpLAorCXdsYW4tYWFhLXNlcnZlciAgKDUpLAorCW1tZQkJKDE2KSwKKwltbWUtc2dzbgkoMTcpCisJfQorCS0tIHRoZSB2YWx1ZXMgMiwgMywgNCBhbmQgNSBzaGFsbCBub3QgYmUgdXNlZCBvbiB0aGUgTUFQLUQgb3IgR3IgaW50ZXJmYWNlcworCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgaW4gdGhlIHJhbmdlICg2LTE1KSBzaGFsbCBiZSB0cmVhdGVkIGFzICJ2bHIiCisJLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxNyBzaGFsbCBiZSB0cmVhdGVkIGFzICJzZ3NuIgorCistLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCitDaGVja0lNRUktQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1laQkJCUlNRUksCisJcmVxdWVzdGVkRXF1aXBtZW50SW5mbwlSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDaGVja0lNRUktUmVzIDo6PSBTRVFVRU5DRSB7CisJZXF1aXBtZW50U3RhdHVzCUVxdWlwbWVudFN0YXR1cwlPUFRJT05BTCwKKwlibXVlZgkJVUVTQkktSXUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkRXF1aXBtZW50SW5mbzo6PSBCSVQgU1RSSU5HIHsKKwllcXVpcG1lbnRTdGF0dXMgICgwKSwKKwlibXVlZiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gUmVxdWVzdGVkRXF1aXBtZW50SW5mbyBkYXRhIHR5cGUgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlciAKKworVUVTQkktSXUgOjo9IFNFUVVFTkNFIHsKKwl1ZXNiaS1JdUEJWzBdIFVFU0JJLUl1QQkJCQlPUFRJT05BTCwKKwl1ZXNiaS1JdUIJWzFdIFVFU0JJLUl1QgkJCQlPUFRJT05BTCwKKwkuLi59CisKK1VFU0JJLUl1QQkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK1VFU0JJLUl1QgkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK0VxdWlwbWVudFN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJd2hpdGVMaXN0ZWQgICgwKSwKKwlibGFja0xpc3RlZCAgKDEpLAorCWdyZXlMaXN0ZWQgICgyKX0KKworLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisKK0luc2VydFN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwlDT01QT05FTlRTIE9GCVN1YnNjcmliZXJEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAkKKwluYWVhLVByZWZlcnJlZENJCVsxNV0gTkFFQS1QcmVmZXJyZWRDSQlPUFRJT05BTCwKKwktLSBuYWVhLVByZWZlcnJlZENJIGlzIGluY2x1ZGVkIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBITFIgb3BlcmF0b3IuCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGEJWzE2XSBHUFJTU3Vic2NyaXB0aW9uRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlIFsyM10gCU5VTEwJCisJCQkJCQkJT1BUSU9OQUwsIAorCW5ldHdvcmtBY2Nlc3NNb2RlCVsyNF0gTmV0d29ya0FjY2Vzc01vZGUJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb24JWzI1XSBMU0FJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlsbXUtSW5kaWNhdG9yCVsyMV0JTlVMTAkJT1BUSU9OQUwsCisJbGNzSW5mb3JtYXRpb24JWzIyXQlMQ1NJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlpc3RBbGVydFRpbWVyCVsyNl0gSVNULUFsZXJ0VGltZXJWYWx1ZQlPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJbkhMUglbMjddIEFnZUluZGljYXRvcglPUFRJT05BTCwKKwltYy1TUy1JbmZvCVsyOF0gTUMtU1MtSW5mbwlPUFRJT05BTCwKKwljcy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJWzI5XSBDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJCU9QVElPTkFMLAorCXNnc24tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbMTddIFNHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJWzE4XQlDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJT1BUSU9OQUwsCisJYWNjZXNzUmVzdHJpY3Rpb25EYXRhCVsxOV0gQWNjZXNzUmVzdHJpY3Rpb25EYXRhCU9QVElPTkFMLAorCWljcy1JbmRpY2F0b3IJWzIwXQlCT09MRUFOCU9QVElPTkFMLAorCWVwcy1TdWJzY3JpcHRpb25EYXRhCVszMV0JRVBTLVN1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJY3NnLVN1YnNjcmlwdGlvbkRhdGFMaXN0CVszMl0gQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0CU9QVElPTkFMIH0KKwktLSBJZiB0aGUgTmV0d29yayBBY2Nlc3MgTW9kZSBwYXJhbWV0ZXIgaXMgc2VudCwgaXQgc2hhbGwgYmUgcHJlc2VudCBvbmx5IGluIAorCS0tIHRoZSBmaXJzdCBzZXF1ZW5jZSBpZiBzZXFtZW50YXRpb24gaXMgdXNlZAorCitDU0ctU3Vic2NyaXB0aW9uRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUwKSBPRgorCQkJCUNTRy1TdWJzY3JpcHRpb25EYXRhCisKK0NTRy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY3NnLUlkCSAJCUNTRy1JZCwKKwlleHBpcmF0aW9uRGF0ZQkJVGltZQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworQ1NHLUlkIDo6PSBCSVQgU1RSSU5HIChTSVpFICgyNykpCisJLS0gY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK1RpbWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gSUVURiBSRkMgMzU4OCBbMTM5XQorCisKK0VQUy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJYXBuLW9pLVJlcGxhY2VtZW50CVswXQlBUE4tT0ktUmVwbGFjZW1lbnQJT1BUSU9OQUwsCisJcmZzcC1pZAkJWzJdCVJGU1AtSUQJCU9QVElPTkFMLAorCWFtYnIJCQlbM10JQU1CUgkJT1BUSU9OQUwsCisJYXBuLUNvbmZpZ3VyYXRpb25Qcm9maWxlCVs0XQlBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUJT1BUSU9OQUwsCisJc3RuLXNyCQlbNl0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FQTi1PSS1SZXBsYWNlbWVudCA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFzIEFQTiBPcGVyYXRvciBJZGVudGlmaWVyIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitSRlNQLUlEIDo6PSAgSU5URUdFUiAoMS4uMjU2KQorCitBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUgOjo9IFNFUVVFTkNFIHsKKwlkZWZhdWx0Q29udGV4dAlDb250ZXh0SWQsCisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEFQTi1Db25maWd1cmF0aW9uUHJvZmlsZS4KKwllcHNEYXRhTGlzdAlbMV0JRVBTLURhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMpIE9GCisJCQkJQVBOLUNvbmZpZ3VyYXRpb24KKworCittYXhOdW1PZkFQTi1Db25maWd1cmF0aW9ucyAgSU5URUdFUiA6Oj0gNTAKKworCitBUE4tQ29uZmlndXJhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNvbnRleHRJZAkJWzBdIENvbnRleHRJZCwKKwlzZXJ2ZWRQYXJ0eUlQLUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbgkJCVsyXSBBUE4sCisJZXBzLXFvcy1TdWJzY3JpYmVkCVszXSBFUFMtUW9TLVN1YnNjcmliZWQsCisJcGRuLWd3LUlkZW50aXR5CVs0XSBQRE4tR1ctSWRlbnRpdHkJT1BUSU9OQUwsCisJcGRuLWd3LUFsbG9jYXRpb25UeXBlCVs1XSBQRE4tR1ctQWxsb2NhdGlvblR5cGUJT1BUSU9OQUwsCisJdnBsbW5BZGRyZXNzQWxsb3dlZAlbNl0gTlVMTAkJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzddIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWFtYnIJCQlbOF0gQU1CUgkJT1BUSU9OQUwsCisJc3BlY2lmaWNBUE5JbmZvTGlzdAlbOV0gU3BlY2lmaWNBUE5JbmZvTGlzdAlPUFRJT05BTCwJZXh0ZW5zaW9uQ29udGFpbmVyCVsxMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1Rb1MtU3Vic2NyaWJlZCA6Oj0gU0VRVUVOQ0UgeworCXFvcy1DbGFzcy1JZGVudGlmaWVyCVswXSBRb1MtQ2xhc3MtSWRlbnRpZmllciwKKwlhbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eQlbMV0gQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQU1CUiA6Oj0gU0VRVUVOQ0UgeworCW1heC1SZXF1ZXN0ZWRCYW5kd2lkdGgtVUwJWzBdIEJhbmR3aWR0aCwKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLURMCVsxXSBCYW5kd2lkdGgsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworCitTcGVjaWZpY0FQTkluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MpIE9GCisJCQkJU3BlY2lmaWNBUE5JbmZvCisKK21heE51bU9mU3BlY2lmaWNBUE5JbmZvcyAgSU5URUdFUiA6Oj0gNTAKKworU3BlY2lmaWNBUE5JbmZvIDo6PSBTRVFVRU5DRSB7CisJYXBuCQkJWzBdIEFQTiwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitCYW5kd2lkdGggOjo9IElOVEVHRVIgCisJLS0gYml0cyBwZXIgc2Vjb25kCisKK1FvUy1DbGFzcy1JZGVudGlmaWVyIDo6PSBJTlRFR0VSICgxLi45KQorCS0tIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiAgM0dQUCBUUyAyOS4yMTIKKworCisKK0FsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5IDo6PSBTRVFVRU5DRSB7CisJcHJpb3JpdHktbGV2ZWwJWzBdIElOVEVHRVIsCisJcHJlLWVtcHRpb24tY2FwYWJpbGl0eQlbMV0gQk9PTEVBTglPUFRJT05BTCwKKwlwcmUtZW1wdGlvbi12dWxuZXJhYmlsaXR5CVsyXSBCT09MRUFOCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1BETi1HVy1JZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCXBkbi1ndy1pcHY0LUFkZHJlc3MJWzBdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1pcHY2LUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1uYW1lCVsyXSBGUUROCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitGUUROIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICg5Li4xMDApKQorCisKK1BETi1HVy1BbGxvY2F0aW9uVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3RhdGljCSgwKSwKKwlkeW5hbWljCSgxKX0KKworCitBY2Nlc3NSZXN0cmljdGlvbkRhdGEgOjo9IEJJVCBTVFJJTkcgeworCXV0cmFuTm90QWxsb3dlZCAoMCksCisJZ2VyYW5Ob3RBbGxvd2VkICgxKSwKKwlnYW5Ob3RBbGxvd2VkICAgKDIpLAorCWktaHNwYS1ldm9sdXRpb25Ob3RBbGxvd2VkICgzKSwKKwllLXV0cmFuTm90QWxsb3dlZCAoNCksCisJaG8tdG9Ob24zR1BQLUFjY2Vzc05vdEFsbG93ZWQgKDUpIH0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogCisJLS0gYWNjZXNzIHJlc3RyaWN0aW9uIGRhdGEgcmVsYXRlZCB0byBhbiBhY2Nlc3MgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IGEgbm9kZQorCS0tIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBiaXRzIDYgdG8gNyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCQorCitDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyBkYXRhIHR5cGUgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4gVFMgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUKKwktLSBvZiB0aGUgcHJpb3JpdHkgbGV2ZWwuCisKK0lTVC1BbGVydFRpbWVyVmFsdWUgOjo9IElOVEVHRVIgKDE1Li4yNTUpCisKK0xDU0luZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJZ21sYy1MaXN0CVswXQlHTUxDLUxpc3QJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVsxXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwsCisJbW9sci1MaXN0CQlbMl0JTU9MUi1MaXN0CU9QVElPTkFMLAorCS4uLiwKKwlhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVszXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwgfQorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgbWF5IGJlIHNlbnQgb25seSBpZiBsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgaXMKKwktLSBwcmVzZW50IGFuZCBjb250YWlucyBmb3VyIGluc3RhbmNlcyBvZiBMQ1MtUHJpdmFjeUNsYXNzLiBJZiB0aGUgbWVudGlvbmVkIGNvbmRpdGlvbgorCS0tIGlzIG5vdCBzYXRpc2ZpZWQgdGhlIHJlY2VpdmluZyBub2RlIHNoYWxsIGRpc2NhcmQgYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdC4KKwktLSBJZiBhbiBMQ1MtUHJpdmFjeUNsYXNzIGlzIHJlY2VpdmVkIGJvdGggaW4gbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGFuZCBpbgorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3Qgd2l0aCB0aGUgc2FtZSBTUy1Db2RlLCB0aGVuIHRoZSBlcnJvciB1bmV4cGVjdGVkIAorCS0tIGRhdGEgdmFsdWUgc2hhbGwgYmUgcmV0dXJuZWQuCisKK0dNTEMtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZHTUxDKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCS0tIGlmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCB0aGUgY29tcGxldGUgR01MQy1MaXN0IHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKKworbWF4TnVtT2ZHTUxDICBJTlRFR0VSIDo6PSA1CisKK05ldHdvcmtBY2Nlc3NNb2RlIDo6PSBFTlVNRVJBVEVEIHsKKwlwYWNrZXRBbmRDaXJjdWl0CSgwKSwKKwlvbmx5Q2lyY3VpdAkJKDEpLAorCW9ubHlQYWNrZXQJCSgyKSwKKwkuLi59CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIE5ldHdvcmtBY2Nlc3NNb2RlCisJLS0gdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dQUlNEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCisJCQkJUERQLUNvbnRleHQKKworbWF4TnVtT2ZQRFAtQ29udGV4dHMgIElOVEVHRVIgOjo9IDUwCisKK1BEUC1Db250ZXh0IDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZAlDb250ZXh0SWQsCisJcGRwLVR5cGUJCVsxNl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzE3XSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMThdIFFvUy1TdWJzY3JpYmVkLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzE5XSBOVUxMCU9QVElPTkFMLAorCWFwbgkJCVsyMF0gQVBOLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMjFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWV4dC1Rb1MtU3Vic2NyaWJlZAlbMF0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLCAKKwlwZHAtQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzFdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWV4dDItUW9TLVN1YnNjcmliZWQJWzJdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gZXh0Mi1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dC1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCWV4dDMtUW9TLVN1YnNjcmliZWQJWzNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBleHQzLVFvUy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgZXh0Mi1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCSB9CisKK0NvbnRleHRJZCA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEdQUlNTdWJzY3JpcHRpb25EYXRhLgorCWdwcnNEYXRhTGlzdAlbMV0JR1BSU0RhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1NHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ1NJCQlbMF0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMV0JU01TLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXQtc21zLUNTSQlbM10JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzRdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVs1XQlNRy1DU0kJT1BUSU9OQUwKKwl9CisKK0dQUlMtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1DYW1lbFREUERhdGFMaXN0CVswXSBHUFJTLUNhbWVsVERQRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIEdQUlMtQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4gCistLQlHUFJTLUNhbWVsVERQRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgR1BSUy1DU0kgc2VxdWVuY2UuCistLQlJZiBHUFJTLUNTSSBpcyBzZWdtZW50ZWQsIGdwcnMtQ2FtZWxURFBEYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK0dQUlMtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJR1BSUy1DYW1lbFREUERhdGEKKy0tCUdQUlMtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlHUFJTLUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworR1BSUy1DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlbMV0gU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRTZXNzaW9uSGFuZGxpbmcJWzNdIERlZmF1bHRHUFJTLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworRGVmYXVsdEdQUlMtSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlVHJhbnNhY3Rpb24gKDApICwKKwlyZWxlYXNlVHJhbnNhY3Rpb24gKDEpICwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVUcmFuc2FjdGlvbiIKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VUcmFuc2FjdGlvbiIKKworR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWF0dGFjaCAJCQkoMSksCisJYXR0YWNoQ2hhbmdlT2ZQb3NpdGlvbiAJCSgyKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnQgCQkoMTEpLAorCXBkcC1Db250ZXh0RXN0YWJsaXNobWVudEFja25vd2xlZGdlbWVudAkoMTIpLAorCXBkcC1Db250ZXh0Q2hhbmdlT2ZQb3NpdGlvbiAJCSgxNCksCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEZvciBHUFJTLUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBHUFJTLUNhbWVsVERQRGF0YXNlcXVlbmNlLgorCitBUE4gOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjYzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitQRFAtVHlwZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI5LjA2MCBbMTA1XQorCitQRFAtQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xNikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworCS0tIFRoZSBwb3NzaWJsZSBzaXplIHZhbHVlcyBhcmU6CisJLS0gMS03IG9jdGV0cyAgWC4yNSBhZGRyZXNzIHR5cGUKKwktLSAgNCAgb2N0ZXRzICBJUHY0IGFkZHJlc3MgdHlwZQorCS0tIDE2ICBvY3RldHMgIElwdjYgYWRkcmVzcyB0eXBlCisKK1FvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSAzLTUuCisKK0V4dC1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi45KSkKKwktLSBPQ1RFVCAxOiAKKwktLSAgQWxsb2NhdGlvbi9SZXRlbnRpb24gUHJpb3JpdHkgKFRoaXMgb2N0ZXQgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4KKwktLSAgICAgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHByaW9yaXR5IGxldmVsLCBkZWNsYXJhdGlvbiBpbiAyOS4wNjApCisJLS0gT2N0ZXRzIDItOSBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSA2LTEzLgorCitFeHQyLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjMpKQorCS0tIE9jdGV0cyAxLTMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgMTQtMTYuCisJLS0gSWYgUXVhbGl0eSBvZiBTZXJ2aWNlIGluZm9ybWF0aW9uIGlzIHN0cnVjdHVyZWQgd2l0aCAxNCBvY3RldCBsZW5ndGgsIHRoZW4KKwktLSBPY3RldCAxIGlzIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldCAxNC4KKworRXh0My1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKwktLSBPY3RldHMgMS0yIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE3LTE4LgorCitDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDMyLjIxNS4KKworTFNBT25seUFjY2Vzc0luZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJYWNjZXNzT3V0c2lkZUxTQXNBbGxvd2VkICAoMCksCisJYWNjZXNzT3V0c2lkZUxTQXNSZXN0cmljdGVkICgxKX0KKworTFNBRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTFNBcykgT0YKKwkJCQlMU0FEYXRhCisKK21heE51bU9mTFNBcyAgSU5URUdFUiA6Oj0gMjAKKworTFNBRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWxzYUlkZW50aXR5CVswXSBMU0FJZGVudGl0eSwKKwlsc2FBdHRyaWJ1dGVzCVsxXSBMU0FBdHRyaWJ1dGVzLAorCWxzYUFjdGl2ZU1vZGVJbmRpY2F0b3IJWzJdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTFNBSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAorCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudC4KKwlsc2FPbmx5QWNjZXNzSW5kaWNhdG9yCVsxXQlMU0FPbmx5QWNjZXNzSW5kaWNhdG9yCU9QVElPTkFMLAorCWxzYURhdGFMaXN0CVsyXQlMU0FEYXRhTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUlkZW50aXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworTFNBQXR0cmlidXRlcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDQ4LjAwOCBbNDldCisKK1N1YnNjcmliZXJEYXRhIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNhdGVnb3J5CQlbMl0gQ2F0ZWdvcnkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXR1cwlbM10gU3Vic2NyaWJlclN0YXR1cwlPUFRJT05BTCwKKwliZWFyZXJTZXJ2aWNlTGlzdAlbNF0gQmVhcmVyU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIGJlYXJlclNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwl0ZWxlc2VydmljZUxpc3QJWzZdIFRlbGVzZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQgLyBub3QgYWxsb2NhdGVkCisJLS0gdGVsZXNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwlwcm92aXNpb25lZFNTCVs3XSBFeHQtU1MtSW5mb0xpc3QJT1BUSU9OQUwsCisJb2RiLURhdGEJCVs4XSBPREItRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSAgWzldIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25EYXRhCVsxMF0gWm9uZUNvZGVMaXN0CU9QVElPTkFMLAorCXZic1N1YnNjcmlwdGlvbkRhdGEJWzExXSBWQlNEYXRhTGlzdAlPUFRJT05BTCwKKwl2Z2NzU3Vic2NyaXB0aW9uRGF0YQlbMTJdIFZHQ1NEYXRhTGlzdAlPUFRJT05BTCwKKwl2bHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JWzEzXSBWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwKKwl9CisKK0NhdGVnb3J5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBJVFUtVCBSZWMgUS43NjMuCisKK1N1YnNjcmliZXJTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXNlcnZpY2VHcmFudGVkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDEpfQorCitCZWFyZXJTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmVhcmVyU2VydmljZUNvZGUKKworbWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNTAKKworVGVsZXNlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlRlbGVzZXJ2aWNlcykgT0YKKwkJCQlFeHQtVGVsZXNlcnZpY2VDb2RlCisKK21heE51bU9mVGVsZXNlcnZpY2VzICBJTlRFR0VSIDo6PSAyMAorCitPREItRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1HZW5lcmFsRGF0YQlPREItR2VuZXJhbERhdGEsCisJb2RiLUhQTE1OLURhdGEJT0RCLUhQTE1OLURhdGEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09EQi1HZW5lcmFsRGF0YSA6Oj0gQklUIFNUUklORyB7CisJYWxsT0ctQ2FsbHNCYXJyZWQgICgwKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc0JhcnJlZCAgKDEpLAorCWludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICAoMiksCisJaW50ZXJ6b25hbE9HQ2FsbHNCYXJyZWQgKDYpLAorCWludGVyem9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg3KSwKKwlpbnRlcnpvbmFsT0dDYWxsc0FuZEludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg4KSwKKwlwcmVtaXVtUmF0ZUluZm9ybWF0aW9uT0dDYWxsc0JhcnJlZCAgKDMpLAorCXByZW1pdW1SYXRlRW50ZXJ0YWluZW1lbnRPR0NhbGxzQmFycmVkICAoNCksCisJc3MtQWNjZXNzQmFycmVkICAoNSksCisJYWxsRUNULUJhcnJlZCAoOSksCisJY2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEwKSwKKwlpbnRlcm5hdGlvbmFsRUNULUJhcnJlZCAoMTEpLAorCWludGVyem9uYWxFQ1QtQmFycmVkICgxMiksCisJZG91Ymx5Q2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEzKSwKKwltdWx0aXBsZUVDVC1CYXJyZWQgKDE0KSwKKwlhbGxQYWNrZXRPcmllbnRlZFNlcnZpY2VzQmFycmVkICgxNSksCisJcm9hbWVyQWNjZXNzVG9IUExNTi1BUC1CYXJyZWQgICgxNiksCisJcm9hbWVyQWNjZXNzVG9WUExNTi1BUC1CYXJyZWQgICgxNyksCisJcm9hbWluZ091dHNpZGVQTE1OT0ctQ2FsbHNCYXJyZWQgICgxOCksCisJYWxsSUMtQ2FsbHNCYXJyZWQgICgxOSksCisJcm9hbWluZ091dHNpZGVQTE1OSUMtQ2FsbHNCYXJyZWQgICgyMCksCisJcm9hbWluZ091dHNpZGVQTE1OSUNvdW50cnlJQy1DYWxsc0JhcnJlZCAgKDIxKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQmFycmVkICAoMjIpLAorCXJvYW1pbmdPdXRzaWRlUExNTi1Db3VudHJ5QmFycmVkICAoMjMpLAorCXJlZ2lzdHJhdGlvbkFsbENGLUJhcnJlZCAgKDI0KSwKKwlyZWdpc3RyYXRpb25DRk5vdFRvSFBMTU4tQmFycmVkICAoMjUpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRi1CYXJyZWQgICgyNiksCisJcmVnaXN0cmF0aW9uSW50ZXJ6b25hbENGTm90VG9IUExNTi1CYXJyZWQgICgyNyksCisJcmVnaXN0cmF0aW9uSW50ZXJuYXRpb25hbENGLUJhcnJlZCAgKDI4KX0gKFNJWkUgKDE1Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUdlbmVyYWxEYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1HZW5lcmFsRGF0YQorCS0tIFdoZW4gdGhlIE9EQi1HZW5lcmFsRGF0YSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgSExSIGZvciBhIGdpdmVuIHN1YnNjcmliZXIsIAorCS0tIGluIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbiBzZW50IHRvd2FyZCB0aGUgZ3NtU0NGIAorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK09EQi1IUExNTi1EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUxICAoMCksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMiAgKDEpLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTMgICgyKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGU0ICAoMyl9IChTSVpFICg0Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUhQTE1OLURhdGEgdHlwZSBzaGFsbCBiZSB0cmVhdGVkIGxpa2UgdW5zdXBwb3J0ZWQgT0RCLUhQTE1OLURhdGEgCisJLS0gV2hlbiB0aGUgT0RCLUhQTE1OLURhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRgorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK0V4dC1TUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlFeHQtU1MtSW5mbworCitFeHQtU1MtSW5mbyA6Oj0gQ0hPSUNFIHsKKwlmb3J3YXJkaW5nSW5mbwlbMF0gRXh0LUZvcndJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gRXh0LUNhbGxCYXJJbmZvLAorCWN1Zy1JbmZvCQlbMl0gQ1VHLUluZm8sCisJc3MtRGF0YQkJWzNdIEV4dC1TUy1EYXRhLAorCWVtbHBwLUluZm8JWzRdIEVNTFBQLUluZm99CisKK0V4dC1Gb3J3SW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtRm9yd0ZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUZvcndGZWF0dXJlCisKK0V4dC1Gb3J3RmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJLS0gV2hlbiB0aGlzIGRhdGEgdHlwZSBpcyBzZW50IGZyb20gYW4gSExSIHdoaWNoIHN1cHBvcnRzIENBTUVMIFBoYXNlIDIKKwktLSB0byBhIFZMUiB0aGF0IHN1cHBvcnRzIENBTUVMIFBoYXNlIDIgdGhlIFZMUiBzaGFsbCBub3QgY2hlY2sgdGhlCisJLS0gZm9ybWF0IG9mIHRoZSBudW1iZXIKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzhdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkaW5nT3B0aW9ucwlbNl0gRXh0LUZvcndPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVsxMF0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitFeHQtRm9yd09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisKKwktLSBPQ1RFVCAxOgorCisJLS0gIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSAgYml0IDY6IG5vdGlmaWNhdGlvbiB0byBjYWxsaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSAgYml0IDU6IDAgKHVudXNlZCkKKworCS0tICBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbAorCisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworRXh0LU5vUmVwQ29uZFRpbWUgOjo9IElOVEVHRVIgKDEuLjEwMCkKKwktLSBPbmx5IHZhbHVlcyA1LTMwIGFyZSB1c2VkLgorCS0tIFZhbHVlcyBpbiB0aGUgcmFuZ2VzIDEtNCBhbmQgMzEtMTAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCS0tIElmIHJlY2VpdmVkOgorCS0tCQl2YWx1ZXMgMS00IHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSA1CisJLS0JCXZhbHVlcyAzMS0xMDAgc2hhbGwgYmUgbWFwcGVkIG9uIHRvIHZhbHVlIDMwCisKK0V4dC1DYWxsQmFySW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhckZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUNhbGxCYXJyaW5nRmVhdHVyZQorCitFeHQtQ2FsbEJhcnJpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIEV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1JbmZvIDo6PSBTRVFVRU5DRSB7CisJY3VnLVN1YnNjcmlwdGlvbkxpc3QJQ1VHLVN1YnNjcmlwdGlvbkxpc3QsCisJY3VnLUZlYXR1cmVMaXN0CUNVRy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1TdWJzY3JpcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkNVRykgT0YKKwkJCQlDVUctU3Vic2NyaXB0aW9uCisKK0NVRy1TdWJzY3JpcHRpb24gOjo9IFNFUVVFTkNFIHsKKwljdWctSW5kZXgJQ1VHLUluZGV4LAorCWN1Zy1JbnRlcmxvY2sJQ1VHLUludGVybG9jaywKKwlpbnRyYUNVRy1PcHRpb25zCUludHJhQ1VHLU9wdGlvbnMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5kZXggOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBFVFMgMzAwIDEzOC4KKworQ1VHLUludGVybG9jayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworSW50cmFDVUctT3B0aW9ucyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9DVUctUmVzdHJpY3Rpb25zICAoMCksCisJY3VnSUMtQ2FsbEJhcnJlZCAgKDEpLAorCWN1Z09HLUNhbGxCYXJyZWQgICgyKX0KKworbWF4TnVtT2ZDVUcgIElOVEVHRVIgOjo9IDEwCisKK0NVRy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNVRy1GZWF0dXJlCisKK0V4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMgIElOVEVHRVIgOjo9IDMyCisKK0NVRy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXByZWZlcmVudGlhbENVRy1JbmRpY2F0b3IJQ1VHLUluZGV4CU9QVElPTkFMLAorCWludGVyQ1VHLVJlc3RyaWN0aW9ucwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ludGVyQ1VHLVJlc3RyaWN0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTQzOiAwMDAwMDAgKHVudXNlZCkKKwktLSBFeGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA4NzY1NDMgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworCS0tIGJpdHMgMjEKKwktLQkwMCAgQ1VHIG9ubHkgZmFjaWxpdGllcworCS0tCTAxICBDVUcgd2l0aCBvdXRnb2luZyBhY2Nlc3MKKwktLQkxMCAgQ1VHIHdpdGggaW5jb21pbmcgYWNjZXNzCisJLS0JMTEgIENVRyB3aXRoIGJvdGggb3V0Z29pbmcgYW5kIGluY29taW5nIGFjY2VzcworCitFeHQtU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCVs0XSBFeHQtU1MtU3RhdHVzLAorCXNzLVN1YnNjcmlwdGlvbk9wdGlvbglTUy1TdWJzY3JpcHRpb25PcHRpb24JT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmFjeUNsYXNzKSBPRgorCQkJCUxDUy1Qcml2YWN5Q2xhc3MKKworbWF4TnVtT2ZQcml2YWN5Q2xhc3MgIElOVEVHRVIgOjo9IDQKKworTENTLVByaXZhY3lDbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCW5vdGlmaWNhdGlvblRvTVNVc2VyCVswXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKKwktLSBub3RpZmljYXRpb25Ub01TVXNlciBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblJlbGF0ZWQKKwktLSBhbmQgY2FsbFNlc3Npb25VbnJlbGF0ZWQuIElmIG5vdCByZWNlaXZlZCBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLAorCS0tIHRoZSBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlcm5hbENsaWVudExpc3QJWzFdIEV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBjYWxsU2Vzc2lvblVucmVsYXRlZCB0byBhCisJLS0gdmlzaXRlZCBub2RlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCS0tIGV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblVucmVsYXRlZCBhbmQKKwktLSBjYWxsU2Vzc2lvblJlbGF0ZWQgdG8gYSB2aXNpdGVkIG5vZGUgdGhhdCBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCXBsbW5DbGllbnRMaXN0CVsyXSBQTE1OQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBwbG1uQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHBsbW5vcGVyYXRvci4KKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXh0LWV4dGVybmFsQ2xpZW50TGlzdAlbNF0gRXh0LUV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBFeHQtZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgdGhlIHZpc2l0ZWQgbm9kZSBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yCisJLS0gbGF0ZXIgdmVyc2lvbnMsIHRoZSB1c2VyIGRpZCBzcGVjaWZ5IG1vcmUgdGhhbiA1IGNsaWVudHMsIGFuZCBXaGl0ZSBCb29rIFNDQ1AgaXMgdXNlZC4KKwlzZXJ2aWNlVHlwZUxpc3QJWzVdCVNlcnZpY2VUeXBlTGlzdAlPUFRJT05BTAorCS0tIHNlcnZpY2VUeXBlTGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHNlcnZpY2VUeXBlIGFuZCBpZiB0aGUgdmlzaXRlZCBub2RlCisJLS0gc3VwcG9ydHMgTENTIFJlbGVhc2UgNSBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSAKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIExDUy1Qcml2YWN5Q2xhc3Mgc2hhbGwgYmUgc2VudCBpbiBvbmUgc2VnbWVudAorfQorCitFeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDAuLm1heE51bU9mRXh0ZXJuYWxDbGllbnQpIE9GCisJCQkJRXh0ZXJuYWxDbGllbnQKKworbWF4TnVtT2ZFeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gNQorCitQTE1OQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQTE1OQ2xpZW50KSBPRgorCQkJCUxDU0NsaWVudEludGVybmFsSUQKKworbWF4TnVtT2ZQTE1OQ2xpZW50ICBJTlRFR0VSIDo6PSA1CisKK0V4dC1FeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50ICBJTlRFR0VSIDo6PSAzNQorCitFeHRlcm5hbENsaWVudCA6Oj0gU0VRVUVOQ0UgeworCWNsaWVudElkZW50aXR5CUxDU0NsaWVudEV4dGVybmFsSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitHTUxDLVJlc3RyaWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlnbWxjLUxpc3QJCSgwKSwKKwlob21lLUNvdW50cnkJKDEpICwKKwkuLi4gfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBHTUxDLVJlc3RyaWN0aW9uLgorCitOb3RpZmljYXRpb25Ub01TVXNlciA6Oj0gRU5VTUVSQVRFRCB7CisJbm90aWZ5TG9jYXRpb25BbGxvd2VkCSgwKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25BbGxvd2VkSWZOb1Jlc3BvbnNlCSgxKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25Ob3RBbGxvd2VkSWZOb1Jlc3BvbnNlCSgyKSwKKwkuLi4sCisJbG9jYXRpb25Ob3RBbGxvd2VkICgzKSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBBdCByZWNlcHRpb24gb2YgYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tIE5vdGlmaWNhdGlvblRvTVNVc2VyLgorCitTZXJ2aWNlVHlwZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU2VydmljZVR5cGUpIE9GCisJCQkJU2VydmljZVR5cGUKKworbWF4TnVtT2ZTZXJ2aWNlVHlwZSAgSU5URUdFUiA6Oj0gMzIKKworU2VydmljZVR5cGUgOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlVHlwZUlkZW50aXR5CUxDU1NlcnZpY2VUeXBlSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitNT0xSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTU9MUi1DbGFzcykgT0YKKwkJCQlNT0xSLUNsYXNzCisKK21heE51bU9mTU9MUi1DbGFzcyAgSU5URUdFUiA6Oj0gMworCitNT0xSLUNsYXNzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlzcy1TdGF0dXMJCUV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitab25lQ29kZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mWm9uZUNvZGVzKQorCQkJCU9GIFpvbmVDb2RlCisKK1pvbmVDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworbWF4TnVtT2Zab25lQ29kZXMgIElOVEVHRVIgOjo9IDEwCisKK0luc2VydFN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJdGVsZXNlcnZpY2VMaXN0CVsxXSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzJdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCXNzLUxpc3QJCVszXSBTUy1MaXN0CU9QVElPTkFMLAorCW9kYi1HZW5lcmFsRGF0YQlbNF0gT0RCLUdlbmVyYWxEYXRhCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJWzVdIFJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXMJWzhdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZEZlYXR1cmVzCVs5XSBTdXBwb3J0ZWRGZWF0dXJlcwlPUFRJT05BTCB9CisKK1JlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UgOjo9IEVOVU1FUkFURUQgeworCW5ldHdvcmtOb2RlLUFyZWFSZXN0cmljdGVkCSgwKSwKKwl0b29NYW55Wm9uZUNvZGVzCSgxKSwKKwl6b25lQ29kZXNDb25mbGljdAkoMiksCisJcmVnaW9uYWxTdWJzY05vdFN1cHBvcnRlZAkoMyl9CisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWJhc2ljU2VydmljZUxpc3QJWzFdIEJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkL25vdCBhbGxvY2F0ZWQKKwktLSBiYXNpY1NlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gNi44LjIKKwlzcy1MaXN0CQlbMl0gU1MtTGlzdAlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbNF0gTlVMTAlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvbklkZW50aWZpZXIJWzVdIFpvbmVDb2RlCU9QVElPTkFMLAorCXZic0dyb3VwSW5kaWNhdGlvbglbN10gTlVMTAkJT1BUSU9OQUwsCisJdmdjc0dyb3VwSW5kaWNhdGlvbglbOF0gTlVMTAkgCU9QVElPTkFMLAorCWNhbWVsU3Vic2NyaXB0aW9uSW5mb1dpdGhkcmF3CVs5XSBOVUxMCSAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxMF0gR1BSU1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwcG9ydGVkRmVhdHVyZSBbMTFdIE5VTEwJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb25XaXRoZHJhdwlbMTJdIExTQUluZm9ybWF0aW9uV2l0aGRyYXcJT1BUSU9OQUwsCisJZ21sYy1MaXN0V2l0aGRyYXcgCVsxM10JTlVMTAkJT1BUSU9OQUwsCisJaXN0SW5mb3JtYXRpb25XaXRoZHJhdwlbMTRdIE5VTEwJCU9QVElPTkFMLAorCXNwZWNpZmljQ1NJLVdpdGhkcmF3CVsxNV0gU3BlY2lmaWNDU0ktV2l0aGRyYXcJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3NXaXRoZHJhdwlbMTZdIE5VTEwJCU9QVElPTkFMLAorCXN0bi1zcldpdGhkcmF3CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJZXBzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxOF0gRVBTLVN1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlhcG4tb2ktcmVwbGFjZW1lbnRXaXRoZHJhdwlbMTldIE5VTEwJCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EZWxldGVkCVsyMF0JTlVMTAkJT1BUSU9OQUwgfQorCitTcGVjaWZpY0NTSS1XaXRoZHJhdyA6Oj0gQklUIFNUUklORyB7CisJby1jc2kgKDApLAorCXNzLWNzaSAoMSksCisJdGlmLWNzaSAoMiksCisJZC1jc2kgKDMpLAorCXZ0LWNzaSAoNCksCisJbW8tc21zLWNzaSAoNSksCisJbS1jc2kgKDYpLAorCWdwcnMtY3NpICg3KSwKKwl0LWNzaSAoOCksCisJbXQtc21zLWNzaSAoOSksCisJbWctY3NpICgxMCksCisJby1JTS1DU0kgKDExKSwgCisJZC1JTS1DU0kgKDEyKSwKKwl2dC1JTS1DU0kgKDEzKSB9IChTSVpFKDguLjMyKSkgCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBiaXRzIDExIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYnkgYSBub24tSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsgZW50aXR5LgorLS0gYml0cyAwLTEwIGFuZCAxNC0zMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGFuIElQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMTEtMTMgYXJlIG9ubHkgYXBwbGljYWJsZSBpbiBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yay4KKy0tIEJpdCA4IGFuZCBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24uCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsR1BSU0RhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0VQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsRVBTLURhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0NvbnRleHRJZExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCUNvbnRleHRJZAorCitMU0FJbmZvcm1hdGlvbldpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbExTQURhdGEJTlVMTCwKKwlsc2FJZGVudGl0eUxpc3QJTFNBSWRlbnRpdHlMaXN0IH0KKworTFNBSWRlbnRpdHlMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBSWRlbnRpdHkKKworQmFzaWNTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VzKSBPRgorCQkJCUV4dC1CYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNzAKKworRGVsZXRlU3Vic2NyaWJlckRhdGFSZXMgOjo9IFNFUVVFTkNFIHsKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVswXSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdIE8tQ1NJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3MtQ1NJCQlbMl0gU1MtQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbNF0gTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzNdIE5VTEwJT1BUSU9OQUwsCisJbS1DU0kJCVs1XSBNLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVs2XSBTTVMtQ1NJCU9QVElPTkFMLAorCXZ0LUNTSQkJWzddIFQtQ1NJCU9QVElPTkFMLAorCXQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs4XSBULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUNTSQkJWzldIEQtQ1NJCU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzEwXSBTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTFdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEKKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVNNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJdHBkdS1UeXBlQ3JpdGVyaW9uCVswXQlUUERVLVR5cGVDcml0ZXJpb24JCU9QVElPTkFMLAorCS4uLiB9CisKK1RQRFUtVHlwZUNyaXRlcmlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUUERVVHlwZXMpIE9GCisJTVQtU01TLVRQRFUtVHlwZQorCisKK21heE51bU9mVFBEVVR5cGVzIElOVEVHRVIgOjo9IDUKKworTVQtU01TLVRQRFUtVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLURFTElWRVIgCSgwKSwKKwlzbXMtU1VCTUlULVJFUE9SVCAJKDEpLAorCXNtcy1TVEFUVVMtUkVQT1JUIAkoMiksCisJLi4uIH0KKworLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JRm9yIFRQRFUtVHlwZUNyaXRlcmlvbiBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0Jb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSAKKy0tCXRoZSB3aG9sZSBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2UuCistLQlJbiBDQU1FTCBwaGFzZSA0LCBzbXMtU1VCTUlULVJFUE9SVCBzaGFsbCBub3QgYmUgdXNlZCBhbmQgYSByZWNlaXZlZCBUUERVLVR5cGVDcml0ZXJpb24KKy0tCXNlcXVlbmNlIGNvbnRhaW5pbmcgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgYmUgd2hvbGx5IGlnbm9yZWQuCisKK0QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CVswXSBEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59IAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBELUNTSSBpcyBzZW50IHRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEQtQ1NJIHNlcXVlbmNlLgorLS0JSWYgRC1DU0kgaXMgc2VnbWVudGVkLCB0aGVuIHRoZSBmaXJzdCBzZWdtZW50IHNoYWxsIGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CistLQlhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcuIFN1YnNlcXVlbnQgc2VnbWVudHMgc2hhbGwgbm90IGNvbnRhaW4KKy0tCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLCBidXQgbWF5IGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0LgorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhKSBPRgorCQkJCURQLUFuYWx5c2VkSW5mb0NyaXRlcml1bQorCittYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIElOVEVHRVIgOjo9IDEwCisKK0RQLUFuYWx5c2VkSW5mb0NyaXRlcml1bSA6Oj0gU0VRVUVOQ0UgeworCWRpYWxsZWROdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzcy1DYW1lbERhdGEJU1MtQ2FtZWxEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW5vdGlmaWNhdGlvblRvQ1NFCVswXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsxXQlOVUxMCQlPUFRJT05BTAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBTUy1DU0kgaXMgc2VudCB0byBWTFIuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCit9CisKK1NTLUNhbWVsRGF0YSAgOjo9IFNFUVVFTkNFIHsKKwlzcy1FdmVudExpc3QJU1MtRXZlbnRMaXN0LAorCWdzbVNDRi1BZGRyZXNzCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4ufQorCitTUy1FdmVudExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsU1NFdmVudHMpIE9GIFNTLUNvZGUKKwktLSBBY3Rpb25zIGZvciB0aGUgZm9sbG93aW5nIFNTLUNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIENBTUVMIFBoYXNlIDM6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwktLSBhbGwgb3RoZXIgU1MgY29kZXMgc2hhbGwgYmUgaWdub3JlZAorCS0tIFdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gdGhlIFZMUiwgaXQgc2hhbGwgbm90IGNvbnRhaW4gYSBtYXJraW5nIGZvciBjY2JzLgorCS0tIElmIHRoZSBWTFIgcmVjZWl2ZXMgU1MtQ1NJIGNvbnRhaW5pbmcgYSBtYXJraW5nIGZvciBjY2JzLCB0aGUgVkxSIHNoYWxsIGRpc2NhcmQgdGhlCisJLS0gY2NicyBtYXJraW5nIGluIFNTLUNTSS4KKworbWF4TnVtT2ZDYW1lbFNTRXZlbnRzIElOVEVHRVIgOjo9IDEwCisKK08tQ1NJIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtQ2FtZWxURFBEYXRhTGlzdAlPLUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJY3NpQWN0aXZlCQlbMl0JTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb250b0NTRSBhbmQgY3NpQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTy1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCU8tQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK08tQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU8tQmNzbUNhbWVsVERQRGF0YQorCS0tIE8tQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tIE8tQmNzbUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisJLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBPLUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tIHdpdGggby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMi4KKworbWF4TnVtT2ZDYW1lbFREUERhdGEgIElOVEVHRVIgOjo9IDEwCisKK08tQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NlcnZpY2VLZXkgOjo9IElOVEVHRVIgKDAuLjIxNDc0ODM2NDcpCisKK08tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJY29sbGVjdGVkSW5mbyAoMiksCisJLi4uLAorCXJvdXRlU2VsZWN0RmFpbHVyZSAoNCkgfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gTy1CY3NtQ2FtZWxURFBEYXRhc2VxdWVuY2UuIAorCS0tIEZvciBPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2UuCisKK08tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSAKKworVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgCisKK08tQmNzbUNhbWVsVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJZGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAJWzBdIERlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzFdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCWNhbGxUeXBlQ3JpdGVyaWEJWzJdIENhbGxUeXBlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uLAorCW8tQ2F1c2VWYWx1ZUNyaXRlcmlhCVszXSBPLUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCB9CisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwl0LUJDU00tVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzBdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCXQtQ2F1c2VWYWx1ZUNyaXRlcmlhCVsxXSBULUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwkuLi4gfQorCitEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhICA6Oj0gU0VRVUVOQ0UgeworCW1hdGNoVHlwZQkJWzBdIE1hdGNoVHlwZSwKKwlkZXN0aW5hdGlvbk51bWJlckxpc3QgCVsxXSBEZXN0aW5hdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CVsyXSBEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QJT1BUSU9OQUwsCisJLS0gb25lIG9yIGJvdGggb2YgZGVzdGluYXRpb25OdW1iZXJMaXN0IGFuZCBkZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgCisJLS0gc2hhbGwgYmUgcHJlc2VudAorCS4uLn0KKworRGVzdGluYXRpb25OdW1iZXJMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRQkoMS4ubWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBUaGUgcmVjZWl2aW5nIGVudGl0eSBzaGFsbCBub3QgY2hlY2sgdGhlIGZvcm1hdCBvZiBhIG51bWJlciBpbgorCS0tIHRoZSBkaWFsbGVkIG51bWJlciBsaXN0CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMpIE9GIAorCQkJCQlJTlRFR0VSKDEuLm1heE51bU9mSVNETi1BZGRyZXNzRGlnaXRzKQorCitCYXNpY1NlcnZpY2VDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ2FtZWxCYXNpY1NlcnZpY2VDcml0ZXJpYSkgT0YKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cyAgSU5URUdFUiA6Oj0gMTUKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycyAgSU5URUdFUiA6Oj0gMTAKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RocyAgSU5URUdFUiA6Oj0gMworCittYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworQ2FsbFR5cGVDcml0ZXJpYSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJZm9yd2FyZGVkIAkoMCksCisJbm90Rm9yd2FyZGVkCSgxKX0KKworTWF0Y2hUeXBlICAgICAgIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmhpYml0aW5nIAkoMCksCisJZW5hYmxpbmcJCSgxKX0KKworTy1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLU8tQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworVC1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworbWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCittYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhdXNlVmFsdWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKKy0tIFR5cGUgZXh0cmFjdGVkIGZyb20gQ2F1c2UgcGFyYW1ldGVyIGluIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuNzYzLgorLS0gRm9yIHRoZSB1c2Ugb2YgY2F1c2UgdmFsdWUgcmVmZXIgdG8gSVRVLVQgUmVjb21tZW5kYXRpb24gUS44NTAuCisKK0RlZmF1bHRDYWxsSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlQ2FsbCAoMCkgLAorCXJlbGVhc2VDYWxsICgxKSAsCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVDYWxsIgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VDYWxsIgorCitDYW1lbENhcGFiaWxpdHlIYW5kbGluZyA6Oj0gSU5URUdFUigxLi4xNikgCisJLS0gdmFsdWUgMSA9IENBTUVMIHBoYXNlIDEsCisJLS0gdmFsdWUgMiA9IENBTUVMIHBoYXNlIDIsCisJLS0gdmFsdWUgMyA9IENBTUVMIFBoYXNlIDMsCisJLS0gdmFsdWUgNCA9IENBTUVMIHBoYXNlIDQ6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gNCBzaGFsbCBiZSB0cmVhdGVkIGFzIENBTUVMIHBoYXNlIDQuCisKK1N1cHBvcnRlZENhbWVsUGhhc2VzIDo6PSBCSVQgU1RSSU5HIHsKKwlwaGFzZTEgKDApLAorCXBoYXNlMiAoMSksCisJcGhhc2UzICgyKSwKKwlwaGFzZTQgKDMpfSAoU0laRSAoMS4uMTYpKSAKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTCBQaGFzZXMgaXQgc3VwcG9ydHMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0Q1NJcyA6Oj0gQklUIFNUUklORyB7IAkKKwlvLWNzaQkJKDApLAorCWQtY3NpCQkoMSksCisJdnQtY3NpCQkoMiksCisJdC1jc2kJCSgzKSwKKwltdC1zbXMtY3NpCSg0KSwKKwltZy1jc2kJCSg1KSwKKwlwc2ktZW5oYW5jZW1lbnRzCSg2KSAKK30gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ2FtZWw0IENTSXMgCistLSBpdCBvZmZlcnMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzIDo6PSBCSVQgU1RSSU5HIHsgCQorCWluaXRpYXRlQ2FsbEF0dGVtcHQJKDApLAorCXNwbGl0TGVnCQkoMSksCisJbW92ZUxlZwkJKDIpLAorCWRpc2Nvbm5lY3RMZWcJKDMpLAorCWVudGl0eVJlbGVhc2VkCSg0KSwKKwlkZmMtV2l0aEFyZ3VtZW50CSg1KSwKKwlwbGF5VG9uZQkJKDYpLAorCWR0bWYtTWlkQ2FsbAkoNyksCisJY2hhcmdpbmdJbmRpY2F0b3IJKDgpLAorCWFsZXJ0aW5nRFAJKDkpLAorCWxvY2F0aW9uQXRBbGVydGluZwkoMTApLAorCWNoYW5nZU9mUG9zaXRpb25EUAkoMTEpLAorCW9yLUludGVyYWN0aW9ucwkoMTIpLAorCXdhcm5pbmdUb25lRW5oYW5jZW1lbnRzCSgxMyksCisJY2YtRW5oYW5jZW1lbnRzCSgxNCksCisJc3Vic2NyaWJlZEVuaGFuY2VkRGlhbGxlZFNlcnZpY2VzIAkoMTUpLAorCXNlcnZpbmdOZXR3b3JrRW5oYW5jZWREaWFsbGVkU2VydmljZXMgKDE2KSwKKwljcml0ZXJpYUZvckNoYW5nZU9mUG9zaXRpb25EUAkoMTcpLAorCXNlcnZpY2VDaGFuZ2VEUAkoMTgpLAorCWNvbGxlY3RJbmZvcm1hdGlvbgkoMTkpCit9IChTSVpFICgxNS4uNjQpKQorLS0gQSBub2RlIHN1cHBvcnRpbmcgQ2FtZWwgcGhhc2UgNCBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTDQgCistLSBmdW5jdGlvbmFsaXRpZXMgaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU01TLUNTSSA6Oj0gU0VRVUVOQ0UgeworCXNtcy1DQU1FTC1URFAtRGF0YUxpc3QJWzBdIFNNUy1DQU1FTC1URFAtRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudAorLS0Jd2hlbiBNTy1TTVMtQ1NJIG9yIE1ULVNNUy1DU0kgaXMgc2VudCB0byBWTFIgb3IgU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgU01TLUNTSSBzZXF1ZW5jZS4KKy0tCUlmIFNNUy1DU0kgaXMgc2VnbWVudGVkLCBzbXMtQ0FNRUwtVERQLURhdGFMaXN0IGFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSAKKy0tCXByZXNlbnQgaW4gdGhlIGZpcnN0IHNlZ21lbnQKKworU01TLUNBTUVMLVREUC1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJU01TLUNBTUVMLVREUC1EYXRhCistLQlTTVMtQ0FNRUwtVERQLURhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCitTTVMtQ0FNRUwtVERQLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVswXSBTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U01TLUhhbmRsaW5nCVszXSBEZWZhdWx0U01TLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLUNvbGxlY3RlZEluZm8gKDEpLAorCS4uLiwKKwlzbXMtRGVsaXZlcnlSZXF1ZXN0ICgyKQorCX0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBTTVMtQ0FNRUwtVERQLURhdGEgYW5kIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgCistLQlwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0JdGhlIHdob2xlIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLUNvbGxlY3RlZEluZm8KKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbW8tc21zLUNTSSwgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKKy0tCWlnbm9yZSB0aGUgd2hvbGUgU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLURlbGl2ZXJ5UmVxdWVzdAorLS0JaW4gYW4gU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiBtdC1zbXMtQ1NJIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitEZWZhdWx0U01TLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLQlyZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK00tQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE0tQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorCitNRy1DU0kgOjo9IFNFUVVFTkNFIHsKKwltb2JpbGl0eVRyaWdnZXJzCU1vYmlsaXR5VHJpZ2dlcnMsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzJdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzNdIE5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTUctQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTW9iaWxpdHlUcmlnZ2VycyAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTW9iaWxpdHlUcmlnZ2VycykgT0YKKwlNTS1Db2RlCisKK21heE51bU9mTW9iaWxpdHlUcmlnZ2VycyBJTlRFR0VSIDo6PSAxMAorCitNTS1Db2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBNb2JpbGl0eSBNYW5hZ2VtZW50IGV2ZW50LgorLS0JQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBNTS1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSA0OgorLS0KKy0tCUNTIGRvbWFpbiBNTSBldmVudHM6CistLQlMb2NhdGlvbi11cGRhdGUtaW4tc2FtZS1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKy0tCUxvY2F0aW9uLXVwZGF0ZS10by1vdGhlci1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAxJ0IKKy0tCUlNU0ktQXR0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMCdCCistLQlNUy1pbml0aWF0ZWQtSU1TSS1EZXRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMDExJ0IKKy0tCU5ldHdvcmstaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDEwMCdCCistLQorLS0JUFMgZG9tYWluIE1NIGV2ZW50czoKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLWluLXNhbWUtU0dTTglNTS1Db2RlIDo6PSAnMTAwMDAwMDAnQgorLS0JUm91dGVpbmctQXJlYS11cGRhdGUtdG8tb3RoZXItU0dTTi11cGRhdGUtZnJvbS1uZXctU0dTTgorLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tZGlzY29ubmVjdC1ieS1kZXRhY2gKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAxMCdCCistLQlHUFJTLUF0dGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAwMTEnQgorLS0JTVMtaW5pdGlhdGVkLUdQUlMtRGV0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDEwMCdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDEnQiAKKy0tCU5ldHdvcmstaW5pdGlhdGVkLXRyYW5zZmVyLXRvLU1TLW5vdC1yZWFjaGFibGUtZm9yLXBhZ2luZworLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMTEwJ0IKKy0tCistLQlJZiB0aGUgTVNDIHJlY2VpdmVzIGFueSBvdGhlciBNTS1jb2RlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUKKy0tCUNTIGRvbWFpbiwgdGhlbiB0aGUgTVNDIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCistLQlJZiB0aGUgU0dTTiByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlQUyBkb21haW4sIHRoZW4gdGhlIFNHU04gc2hhbGwgaWdub3JlIHRoYXQgTU0tY29kZS4KKworVC1DU0kgOjo9IFNFUVVFTkNFIHsKKwl0LUJjc21DYW1lbFREUERhdGFMaXN0CVQtQmNzbUNhbWVsVERQRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzBdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsxXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsyXSBOVUxMCQlPUFRJT05BTH0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gVlQtQ1NJL1QtQ1NJIGlzIHNlbnQKKy0tCXRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JVC1DU0kgc2hhbGwgbm90IGJlIHNlZ21lbnRlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJVC1CY3NtQ2FtZWxURFBEYXRhCisJLS0tIFQtQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tLSBULUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMiwgdGhpcyBtZWFucyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFQtQmNzbUNhbWVsVERQRGF0YSBpcyBhbGxvd2VkCisJLS0tIHdpdGggdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMTIuIAorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMywgbW9yZSBURFCScyBhcmUgYWxsb3dlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0Q2FsbEhhbmRsaW5nCVsxXSBEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwl0ZXJtQXR0ZW1wdEF1dGhvcml6ZWQgKDEyKSwKKwkuLi4gLAorCXRCdXN5ICgxMyksCisJdE5vQW5zd2VyICgxNCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIEZvciBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIKKwktLSB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSwgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUKKwktLSBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2UuCisKKy0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisKK1NlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzCU9QVElPTkFMLCAKKwlnZ3NuLU51bWJlcgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJc2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbW9iaWxlTm90UmVhY2hhYmxlUmVhc29uCQlbMl0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmFpbHVyZSByZXBvcnQgdHlwZXMKKworRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJZ2dzbi1OdW1iZXIJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVSZXBvcnRSZXMgOjo9IFNFUVVFTkNFIHsKKwlnZ3NuLUFkZHJlc3MJCVswXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJc2dzbi1BZGRyZXNzCQlbMV0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZU1zUHJlc2VudEZvckdwcnNSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBmYXVsdCByZWNvdmVyeSB0eXBlcworCitSZXNldEFyZyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWhsci1MaXN0CQlITFItTGlzdAkJT1BUSU9OQUwsCisJLi4ufQorCitSZXN0b3JlRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXZsci1DYXBhYmlsaXR5CVs2XSBWTFItQ2FwYWJpbGl0eQlPUFRJT05BTCB9CisKK1Jlc3RvcmVEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJbXNOb3RSZWFjaGFibGUJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBWQlMvVkdDUyB0eXBlcworVkJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkJTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VCcm9hZGNhc3REYXRhCisKK1ZHQ1NEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZWR0NTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VHcm91cENhbGxEYXRhCisKK21heE51bU9mVkJTR3JvdXBJZHMgIElOVEVHRVIgOjo9IDUwCisKK21heE51bU9mVkdDU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCitWb2ljZUdyb3VwQ2FsbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJZ3JvdXBJZAkJR3JvdXBJZCwgCisJLS0gZ3JvdXBJZCBzaGFsbCBiZSBmaWxsZWQgd2l0aCBzaXggVEJDRCBmaWxsZXJzICgxMTExKWlmIHRoZSBsb25nR3JvdXBJZCBpcyBwcmVzZW50ICAKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsSW5mbwlbMF0gQWRkaXRpb25hbEluZm8JT1BUSU9OQUwsCisJbG9uZ0dyb3VwSWQJWzFdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisKKwktLSBWb2ljZUdyb3VwQ2FsbERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CisJLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0FkZGl0aW9uYWxJbmZvIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4xMzYpKQorLS0JIFJlZmVycyB0byBBZGRpdGlvbmFsIEluZm8gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgNDMuMDY4IAorCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucyA6Oj0gQklUIFNUUklORyB7CisJcHJpdmlsZWdlZFVwbGlua1JlcXVlc3QgKDApLAorCWVtZXJnZW5jeVVwbGlua1JlcXVlc3QgKDEpLAorCWVtZXJnZW5jeVJlc2V0ICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1ZvaWNlQnJvYWRjYXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwaWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudAorCWJyb2FkY2FzdEluaXRFbnRpdGxlbWVudAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0dyb3VwSWQJWzBdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisJCistLSBWb2ljZUJyb2FkY2FzdERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CistLSBpbmRpY2F0ZSBzdXBwb3J0IG9mIGxvbmcgR3JvdXAgSURzIHdpdGhpbiB0aGUgVXBkYXRlIExvY2F0aW9uIG9yIFJlc3RvcmUgRGF0YSAKKwktLSByZXF1ZXN0IG1lc3NhZ2UKKworR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzKSkKKwktLSBXaGVuIEdyb3VwLUlkIGlzIGxlc3MgdGhhbiBzaXggY2hhcmFjdGVycyBpbiBsZW5ndGgsIHRoZSBUQkNEIGZpbGxlciAoMTExMSkKKwktLSBpcyB1c2VkIHRvIGZpbGwgdW51c2VkIGhhbGYgb2N0ZXRzLgorCS0tIFJlZmVycyB0byB0aGUgR3JvdXAgSWRlbnRpZmljYXRpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDAzIAorCS0tIGFuZCAzR1BQIFRTIDQzLjA2OC8gNDMuMDY5CisKK0xvbmctR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg0KSkKKwktLSBXaGVuIExvbmctR3JvdXAtSWQgaXMgbGVzcyB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzCisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCVswXSBJTVNJLAorCWxtc2kJCVsxXSBMTVNJCU9QVElPTkFMLAorCXJlcXVlc3RlZEluZm8JWzJdIFJlcXVlc3RlZEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbGxQcmlvcml0eQlbNF0JRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTdWJzY3JpYmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIExvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBTdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlsb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlbM10gTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJT1BUSU9OQUwsCisJcHMtU3Vic2NyaWJlclN0YXRlCVs0XSBQUy1TdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwltcy1DbGFzc21hcmsyCVs2XSBNUy1DbGFzc21hcmsyCU9QVElPTkFMLAorCWdwcnMtTVMtQ2xhc3MJWzddIEdQUlNNU0NsYXNzCU9QVElPTkFMLAorCW1ucEluZm9SZXMJWzhdIE1OUEluZm9SZXMJT1BUSU9OQUwgfQorCistLQlJZiB0aGUgSExSIHJlY2VpdmVzIGxvY2F0aW9uSW5mb3JtYXRpb24sIHN1YnNjcmliZXJTdGF0ZSBvciBtcy1DbGFzc21hcmsyIGZyb20gYW4gU0dTTgorLS0JaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uR1BSUywgcHMtU3Vic2NyaWJlclN0YXRlIG9yIGdwcnMtTVMtQ2xhc3MgZnJvbQorLS0JYSBWTFIgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBwYXJhbWV0ZXJzIHdoaWNoIGl0IGhhcyBub3QgcmVxdWVzdGVkLCBpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCisKK01OUEluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlyb3V0ZWluZ051bWJlcglbMF0gUm91dGVpbmdOdW1iZXIgCU9QVElPTkFMLAorCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nIAlPUFRJT05BTCwKKwludW1iZXJQb3J0YWJpbGl0eVN0YXR1cwlbM10gTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKy0tCVRoZSBJTVNJIHBhcmFtZXRlciBjb250YWlucyBhIGdlbmVyaWMgSU1TSSwgaS5lLiBpdCBpcyBub3QgdGllZCBuZWNlc3NhcmlseSB0byB0aGUgCistLQlTdWJzY3JpYmVyLiBNQ0MgYW5kIE1OQyB2YWx1ZXMgaW4gdGhpcyBJTVNJIHNoYWxsIHBvaW50IHRvIHRoZSBTdWJzY3JpcHRpb24gTmV0d29yayBvZiAKKy0tCXRoZSBTdWJzY3JpYmVyLiBTZWUgM0dQUCBUUyAyMy4wNjYgWzEwOF0uCisKK1JvdXRlaW5nTnVtYmVyIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uNSkpCisKKworTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW5vdEtub3duVG9CZVBvcnRlZAkoMCksCisJb3duTnVtYmVyUG9ydGVkT3V0CSgxKSwKKwlmb3JlaWduTnVtYmVyUG9ydGVkVG9Gb3JlaWduTmV0d29yawkoMiksCisJLi4uLAorCW93bk51bWJlck5vdFBvcnRlZE91dAkoNCksCisJZm9yZWlnbk51bWJlclBvcnRlZEluCSg1KQorCX0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tICByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIAorCS0tICB3aG9sZSBOdW1iZXJQb3J0YWJpbGl0eVN0YXR1czsKKwktLSAgb3duTnVtYmVyTm90UG9ydGVkT3V0IG9yIGZvcmVpZ25OdW1iZXJQb3J0ZWRJbiBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBbnkgVGltZSAKKwktLSAgSW50ZXJyb2dhdGlvbiBtZXNzYWdlLgorCitNUy1DbGFzc21hcmsyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIENsYXNzbWFyayAyIElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworR1BSU01TQ2xhc3MgOjo9IFNFUVVFTkNFIHsKKwltU05ldHdvcmtDYXBhYmlsaXR5CVswXSBNU05ldHdvcmtDYXBhYmlsaXR5LAorCW1TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5CVsxXSBNU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlPUFRJT05BTAorCX0KKworTVNOZXR3b3JrQ2FwYWJpbGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBOZXR3b3JrIENhcGFiaWxpdHkgSUUgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCQorTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNTApKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4KKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCitSZXF1ZXN0ZWRJbmZvIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25JbmZvcm1hdGlvbglbMF0gTlVMTAkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sIAorCWN1cnJlbnRMb2NhdGlvbglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkRG9tYWluCVs0XSBEb21haW5UeXBlCU9QVElPTkFMLAorCWltZWkJCQlbNl0gTlVMTAkJT1BUSU9OQUwsCisJbXMtY2xhc3NtYXJrCVs1XSBOVUxMCQlPUFRJT05BTCwKKwltbnBSZXF1ZXN0ZWRJbmZvCVs3XSBOVUxMIAkJT1BUSU9OQUwgfQorCistLQljdXJyZW50TG9jYXRpb24gc2hhbGwgYmUgYWJzZW50IGlmIGxvY2F0aW9uSW5mb3JtYXRpb24gaXMgYWJzZW50CisKK0RvbWFpblR5cGUgOjo9ICBFTlVNRVJBVEVEIHsKKwljcy1Eb21haW4JCSgwKSwKKwlwcy1Eb21haW4JCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJ2NzLURvbWFpbicKKworTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzBdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXZsci1udW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbk51bWJlcglbMl0gTG9jYXRpb25OdW1iZXIJT1BUSU9OQUwsCisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJWzNdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc2VsZWN0ZWRMU0EtSWQJWzVdIExTQUlkZW50aXR5CU9QVElPTkFMLAorCW1zYy1OdW1iZXIJWzZdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLCAKKwljdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQJWzhdIE5VTEwJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs5XSBOVUxMCQlPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IAorLS0gaWYgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdlcmUgcmV0cmlldmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bGwgcGFnaW5nLgorCitMb2NhdGlvbkluZm9ybWF0aW9uR1BSUyA6Oj0gU0VRVUVOQ0UgeworCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBPUFRJT05BTCwKKwlyb3V0ZWluZ0FyZWFJZGVudGl0eQlbMV0gUkFJZGVudGl0eQlPUFRJT05BTCwKKwlnZW9ncmFwaGljYWxJbmZvcm1hdGlvbglbMl0gR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZWxlY3RlZExTQUlkZW50aXR5CVs0XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc2FpLVByZXNlbnQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWdlb2RldGljSW5mb3JtYXRpb24JWzddIEdlb2RldGljSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JWzldIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLS0gd2FzIHJldHJpZXZlZCBhZnRlciBzdWNjZXNzZnVsIHBhZ2luZy4KKworUkFJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg2KSkKKy0tIFJvdXRpbmcgQXJlYSBJZGVudGl0eSBpcyBjb2RlZCBpbiBhY2NvcmRhbmNlIHdpdGggM0dQUCBUUyAyOS4wNjAgWzEwNV0uCistLSBJdCBzaGFsbCBjb250YWluIHRoZSB2YWx1ZSBwYXJ0IGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAgb25seS4gSS5lLiB0aGUgM0dQUCBUUyAyOS4wNjAKKy0tIHR5cGUgaWRlbnRpZmllciBvY3RldCBzaGFsbCBub3QgYmUgaW5jbHVkZWQuCisKKworR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCistLQlSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAzMiBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKy0tCVRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyIGlzIGFzIGZvbGxvd3M6CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisKK0dlb2RldGljSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTApKQorLS0JUmVmZXJzIHRvIENhbGxpbmcgR2VvZGV0aWMgTG9jYXRpb24gZGVmaW5lZCBpbiBRLjc2MyAoMTk5OSkuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiBRLjc2MyAoMTk5OSkgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byBRLjc2MyAoMTk5OSkgaXMgYXMgZm9sbG93czoKKy0tCQlTY3JlZW5pbmcgYW5kIHByZXNlbnRhdGlvbiBpbmRpY2F0b3JzCQkxIG9jdGV0CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CistLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisKK0xvY2F0aW9uTnVtYmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjEwKSkKKwktLSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzCisKK1N1YnNjcmliZXJTdGF0ZSA6Oj0gQ0hPSUNFIHsKKwlhc3N1bWVkSWRsZQlbMF0gTlVMTCwKKwljYW1lbEJ1c3kJCVsxXSBOVUxMLAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24sCisJbm90UHJvdmlkZWRGcm9tVkxSCVsyXSBOVUxMfQorCitQUy1TdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJbm90UHJvdmlkZWRGcm9tU0dTTglbMF0gTlVMTCwKKwlwcy1EZXRhY2hlZAlbMV0gTlVMTCwKKwlwcy1BdHRhY2hlZE5vdFJlYWNoYWJsZUZvclBhZ2luZwlbMl0gTlVMTCwKKwlwcy1BdHRhY2hlZFJlYWNoYWJsZUZvclBhZ2luZwlbM10gTlVMTCwKKwlwcy1QRFAtQWN0aXZlTm90UmVhY2hhYmxlRm9yUGFnaW5nCVs0XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCXBzLVBEUC1BY3RpdmVSZWFjaGFibGVGb3JQYWdpbmcJWzVdIFBEUC1Db250ZXh0SW5mb0xpc3QsCisJbmV0RGV0Tm90UmVhY2hhYmxlCU5vdFJlYWNoYWJsZVJlYXNvbiB9CisKK1BEUC1Db250ZXh0SW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0SW5mbworCitQRFAtQ29udGV4dEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwZHAtQ29udGV4dElkZW50aWZpZXIJWzBdIENvbnRleHRJZCwKKwlwZHAtQ29udGV4dEFjdGl2ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJcGRwLVR5cGUJCVsyXSBQRFAtVHlwZSwKKwlwZHAtQWRkcmVzcwlbM10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJYXBuLVN1YnNjcmliZWQJWzRdIEFQTgkJT1BUSU9OQUwsCisJYXBuLUluVXNlCQlbNV0gQVBOCQlPUFRJT05BTCwKKwluc2FwaQkJWzZdIE5TQVBJCQlPUFRJT05BTCwKKwl0cmFuc2FjdGlvbklkCVs3XSBUcmFuc2FjdGlvbklkCU9QVElPTkFMLAorCXRlaWQtRm9yR25BbmRHcAlbOF0gVEVJRAkJT1BUSU9OQUwsCisJdGVpZC1Gb3JJdQlbOV0gVEVJRAkJT1BUSU9OQUwsCisJZ2dzbi1BZGRyZXNzCVsxMF0gR1NOLUFkZHJlc3MgCU9QVElPTkFMLAorCXFvcy1TdWJzY3JpYmVkCVsxMV0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1SZXF1ZXN0ZWQJWzEyXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJcW9zLU5lZ290aWF0ZWQJWzEzXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJY2hhcmdpbmdJZAlbMTRdIEdQUlNDaGFyZ2luZ0lECU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxNV0gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCisJcm5jLUFkZHJlc3MJWzE2XSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzE3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXFvczItU3Vic2NyaWJlZAlbMThdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MyLVJlcXVlc3RlZAlbMTldIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMi1OZWdvdGlhdGVkCVsyMF0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MyLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorCQlxb3MzLVN1YnNjcmliZWQJWzIxXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczMtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCXFvczMtUmVxdWVzdGVkCVsyMl0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVJlcXVlc3RlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMy1OZWdvdGlhdGVkCVsyM10gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTAorCS0tIHFvczMtTmVnb3RpYXRlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorfQorCitOU0FQSSA6Oj0gSU5URUdFUiAoMC4uMTUpCistLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgTmV0d29yayBsYXllciBTZXJ2aWNlIEFjY2VzcyBQb2ludAorCitUcmFuc2FjdGlvbklkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorLS0JVGhpcyB0eXBlIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCBpbiB0aGUgCistLQlzZXNzaW9uIG1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIGFjY2VzcyBpbnRlcmZhY2UuIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIAorLS0JM0dQUCBUUyAyNC4wMDgKKworVEVJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBUdW5uZWwgRW5kcG9pbnQgSWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIAorLS0JZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgdHVubmVscyBiZXR3ZWVuIHRoZSBzYW1lIHBhaXIgb2YgZW50aXRpZXMgd2hpY2ggY29tbXVuaWNhdGUgCistLQl1c2luZyB0aGUgR1BSUyBUdW5uZWxsaW5nIFByb3RvY29sIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitHUFJTQ2hhcmdpbmdJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoZSBDaGFyZ2luZyBJRCBpcyBhIHVuaXF1ZSBmb3VyIG9jdGV0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgR0dTTiB3aGVuIAorLS0JYSBQRFAgQ29udGV4dCBpcyBhY3RpdmF0ZWQuIEEgQ2hhcmdpbmcgSUQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGFjdGl2YXRlZCBjb250ZXh0LgorLS0JVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAuCisKK05vdFJlYWNoYWJsZVJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXNQdXJnZWQgKDApLAorCWltc2lEZXRhY2hlZCAoMSksCisJcmVzdHJpY3RlZEFyZWEgKDIpLAorCW5vdFJlZ2lzdGVyZWQgKDMpfQorCistLSBhbnkgdGltZSBpbnRlcnJvZ2F0aW9uIGluZm8gdHlwZXMKKworQW55VGltZUludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRJbmZvCVsxXSBSZXF1ZXN0ZWRJbmZvLAorCWdzbVNDRi1BZGRyZXNzCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCXJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8JWzFdIFJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8sCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWNhbGxGb3J3YXJkaW5nRGF0YQlbMV0gQ2FsbEZvcndhcmRpbmdEYXRhCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRGF0YQlbMl0gQ2FsbEJhcnJpbmdEYXRhCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbM10gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbNF0gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs1XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNl0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luVkxSCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luU0dTTglbOV0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzEwXSBNU0lTRE4tQlMtTGlzdAlPUFRJT05BTCB9CisKK1JlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRTUy1JbmZvCVsxXSBTUy1Gb3JCUy1Db2RlCU9QVElPTkFMLAorCW9kYgkJCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCVszXSBSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs0XSBOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJWzddIEFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJCQkJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzhdIE5VTEwJCU9QVElPTkFMIH0KKworTVNJU0ROLUJTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTVNJU0ROKSBPRgorCQkJCU1TSVNETi1CUworCittYXhOdW1PZk1TSVNETiAgSU5URUdFUiA6Oj0gNTAKKworCitNU0lTRE4tQlMgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCQlJU0ROLUFkZHJlc3NTdHJpbmcsCQorCWJhc2ljU2VydmljZUxpc3QJWzBdCUJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvLUNTSQkJKDApLAorCXQtQ1NJCQkoMSksCisJdnQtQ1NJCQkoMiksCisJdGlmLUNTSQkJKDMpLAorCWdwcnMtQ1NJCQkoNCksCisJbW8tc21zLUNTSQkoNSksCisJc3MtQ1NJCQkoNiksCisJbS1DU0kJCSg3KSwKKwlkLWNzaQkJKDgpfQorCitBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJbXQtc21zLUNTSQkoMCksCisJbWctY3NpCQkoMSksCisJby1JTS1DU0kgCQkoMiksCisJZC1JTS1DU0kJCSgzKSwKKwl2dC1JTS1DU0kJIAkoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiB1bmtub3duIHZhbHVlcyBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyLgorCitDYWxsRm9yd2FyZGluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDYWxsQmFycmluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVBhc3N3b3JkCQlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyIDo6PSBJTlRFR0VSICgwLi40KQorCitPREItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW9kYi1EYXRhCQlPREItRGF0YSwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdCU8tQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMV0JTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsIAorCWQtQ1NJCQlbMl0JRC1DU0kJT1BUSU9OQUwsCisJdC1DU0kJCVszXQlULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNF0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdnQtQ1NJCQlbNV0JVC1DU0kJT1BUSU9OQUwsCisJdnQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs2XQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwl0aWYtQ1NJCQlbN10JTlVMTAkJT1BUSU9OQUwsCisJdGlmLUNTSS1Ob3RpZmljYXRpb25Ub0NTRQlbOF0JTlVMTAkJT1BUSU9OQUwsCisJZ3Bycy1DU0kJCVs5XQlHUFJTLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVsxMF0JU01TLUNTSQlPUFRJT05BTCwKKwlzcy1DU0kJCVsxMV0JU1MtQ1NJCU9QVElPTkFMLAorCW0tQ1NJCQlbMTJdCU0tQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3BlY2lmaWNDU0lEZWxldGVkTGlzdAlbMTRdCVNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzE1XQlTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTZdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVsxN10JTUctQ1NJCU9QVElPTkFMLAorCW8tSU0tQ1NJCQlbMThdIE8tQ1NJCU9QVElPTkFMLAorCW8tSU0tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMTldIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWQtSU0tQ1NJCQlbMjBdIEQtQ1NJCU9QVElPTkFMLAorCXZ0LUlNLUNTSQkJWzIxXSBULUNTSQlPUFRJT05BTCwKKwl2dC1JTS1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzIyXQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworQW55VGltZU1vZGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0JU3Vic2NyaWJlcklkZW50aXR5LAorCWdzbVNDRi1BZGRyZXNzCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvCVsyXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvCVszXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kJWzRdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs2XQlOVUxMCQlPUFRJT05BTCwKKwkuLi4sCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YQlbN10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSBPUFRJT05BTCwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEJWzhdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YSBPUFRJT05BTCB9CisKK0FueVRpbWVNb2RpZmljYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzcy1JbmZvRm9yLUNTRQlbMF0JRXh0LVNTLUluZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzFdCUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW9kYi1JbmZvCQlbM10JT0RCLUluZm8JT1BUSU9OQUwgfQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzNdCUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs0XQlJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzVdCUV4dC1Ob1JlcENvbmRUaW1lCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs2XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlbMV0JRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbMl0JRXh0LVNTLVN0YXR1cwlPUFRJT05BTCwKKwlwYXNzd29yZAkJWzNdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzRdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzVdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1kYXRhCQlbMF0JT0RCLURhdGEJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzFdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kgOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvCVswXQlSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwltb2RpZnlDU0ktU3RhdGUJWzJdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs0XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMIH0KKy0tIHJlcXVlc3RlZENhbWVsLVN1YnNjcmlwdGlvbkluZm8gc2hhbGwgYmUgZGlzY2FyZGVkIGlmCistLSBhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyBpcyByZWNlaXZlZAorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgOjo9IFNFUVVFTkNFIHsKKwltb2RpZnlSZWdpc3RyYXRpb25TdGF0dXMJWzBdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWRlYWN0aXZhdGUJKDApLAorCWFjdGl2YXRlCQkoMSl9CisKKy0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisKK05vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbMl0gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbM10gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlhbGxJbmZvcm1hdGlvblNlbnQJWzRdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBtb2JpbGl0eSBtYW5hZ2VtZW50IGV2ZW50IG5vdGlmaWNhdGlvb24gaW5mbyB0eXBlcworCitOb3RlTU0tRXZlbnRBcmc6Oj0gU0VRVUVOQ0UgeworCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlldmVudE1ldAkJWzBdCU1NLUNvZGUsCisJaW1zaQkJCVsxXQlJTVNJLAorCW1zaXNkbgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVszXQlMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1cHBvcnRlZENBTUVMUGhhc2VzCVs1XQlTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzddCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJWzhdIE9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJT1BUSU9OQUwKK30KKworTm90ZU1NLUV2ZW50UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtU1MtSW5mb0Zvci1DU0UgOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCisJfQorCitFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVsxXQlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlwYXNzd29yZAkJWzJdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzNdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzRdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDIxNiBAQAorLS0gJElkOiBNQVAtT00tRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gMTcuNy4yCU9wZXJhdGlvbiBhbmQgbWFpbnRlbmFuY2UgZGF0YSB0eXBlcworLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorIAorTUFQLU9NLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1PTS1EYXRhVHlwZXMgKDEyKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCUFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCUFjdGl2YXRlVHJhY2VNb2RlUmVzLAorCURlYWN0aXZhdGVUcmFjZU1vZGVBcmcsCisJRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJTVNJCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworOworCitBY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCXRyYWNlVHlwZQkJWzJdIFRyYWNlVHlwZSwKKwlvbWMtSWQJCVszXSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzVdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZURlcHRoTGlzdAlbNl0gVHJhY2VEZXB0aExpc3QJT1BUSU9OQUwsCisJdHJhY2VORS1UeXBlTGlzdAlbN10gVHJhY2VORS1UeXBlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUludGVyZmFjZUxpc3QJWzhdIFRyYWNlSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUV2ZW50TGlzdAlbOV0gVHJhY2VFdmVudExpc3QJT1BUSU9OQUwKKwl9CisKK1RyYWNlUmVmZXJlbmNlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorCitUcmFjZVJlZmVyZW5jZTIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisKK1RyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKworVHJhY2VUeXBlIDo6PSBJTlRFR0VSCisJKDAuLjI1NSkKKwktLSBUcmFjZSB0eXBlcyBhcmUgZnVsbHkgZGVmaW5lZCBpbiAgM0dQUCBUUyA1Mi4wMDguIFs2MV0KKworVHJhY2VEZXB0aExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1UcmFjZURlcHRoCVswXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVsxXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXNnc24tVHJhY2VEZXB0aAlbMl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlnZ3NuLVRyYWNlRGVwdGgJWzNdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJYm1zYy1UcmFjZURlcHRoCVs1XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2VEZXB0aCA6Oj0gRU5VTUVSQVRFRCB7CisJbWluaW11bSAoMCksCisJbWVkaXVtICgxKSwKKwltYXhpbXVtICgyKSwKKwkuLi59CistLSBUaGUgdmFsdWUgbWVkaXVtIGlzIGFwcGxpY2FibGUgb25seSBmb3IgUk5DLiBGb3Igb3RoZXIgbmV0d29yayBlbGVtZW50cywgaWYgdmFsdWUgbWVkaXVtCistLSBpcyByZWNlaXZlZCwgdmFsdWUgbWluaW11bSBzaGFsbCBiZSBhcHBsaWVkLgorCitUcmFjZU5FLVR5cGVMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltc2MtcyAoMCksCisJbWd3ICgxKSwKKwlzZ3NuICgyKSwKKwlnZ3NuICgzKSwKKwlybmMgKDQpLAorCWJtLXNjICg1KX0gKFNJWkUgKDYuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitUcmFjZUludGVyZmFjZUxpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJc2dzbi1MaXN0CQlbMl0gU0dTTi1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlybmMtTGlzdAkJWzRdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzVdIEJNU0MtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWEgKDApLAorCWl1ICgxKSwKKwltYyAoMiksCisJbWFwLWcgKDMpLAorCW1hcC1iICg0KSwKKwltYXAtZSAoNSksCisJbWFwLWYgKDYpLAorCWNhcCAoNyksCisJbWFwLWQgKDgpLAorCW1hcC1jICg5KX0gKFNJWkUgKDEwLi4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1jICgwKSwKKwluYi11cCAoMSksCisJaXUtdXAgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU0dTTi1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnYiAoMCksCisJaXUgKDEpLAorCWduICgyKSwKKwltYXAtZ3IgKDMpLAorCW1hcC1nZCAoNCksCisJbWFwLWdmICg1KSwKKwlncyAoNiksCisJZ2UgKDcpfSAoU0laRSAoOC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ24gKDApLAorCWdpICgxKSwKKwlnbWIgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworUk5DLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWl1ICgwKSwKKwlpdXIgKDEpLAorCWl1YiAoMiksCisJdXUgKDMpfSAoU0laRSAoNC4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnbWIgKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VFdmVudExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1FdmVudExpc3QJT1BUSU9OQUwsCisJbWd3LUxpc3QJCVsxXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzRdIEJNU0MtRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworTVNDLVMtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltby1tdENhbGwgKDApLAorCW1vLW10LXNtcyAoMSksCisJbHUtaW1zaUF0dGFjaC1pbXNpRGV0YWNoICgyKSwKKwloYW5kb3ZlcnMgKDMpLAorCXNzICg0KX0gKFNJWkUgKDUuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitNR1ctRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwljb250ZXh0ICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlwZHBDb250ZXh0ICgwKSwKKwltby1tdC1zbXMgKDEpLAorCXJhdS1ncHJzQXR0YWNoLWdwcnNEZXRhY2ggKDIpLAorCW1ibXNDb250ZXh0ICgzKX0gKFNJWkUgKDQuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbWJtc0NvbnRleHQgKDEpfSAoU0laRSAoMi4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1ibXNNdWx0aWNhc3RTZXJ2aWNlQWN0aXZhdGlvbiAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCisKK1RyYWNlUHJvcGFnYXRpb25MaXN0IDo6PSBTRVFVRU5DRSB7CisJdHJhY2VSZWZlcmVuY2UJWzBdIFRyYWNlUmVmZXJlbmNlCU9QVElPTkFMLAorCXRyYWNlVHlwZQkJWzFdIFRyYWNlVHlwZQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZTIJWzJdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UJWzNdIFRyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSBPUFRJT05BTCwKKwlybmMtVHJhY2VEZXB0aAlbNF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlybmMtSW50ZXJmYWNlTGlzdAlbNV0gUk5DLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbXNjLXMtVHJhY2VEZXB0aAlbNl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltc2Mtcy1JbnRlcmZhY2VMaXN0CVs3XSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLUV2ZW50TGlzdAlbOF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVs5XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1JbnRlcmZhY2VMaXN0CVsxMF0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbWd3LUV2ZW50TGlzdAlbMTFdIE1HVy1FdmVudExpc3QJT1BUSU9OQUwsCisJLi4ufQorCitBY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVN1cHBvcnRJbmRpY2F0b3IJWzFdCU5VTEwJCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZQlbMV0gVHJhY2VSZWZlcmVuY2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXRyYWNlUmVmZXJlbmNlMglbM10gVHJhY2VSZWZlcmVuY2UyCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmOTQxZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzAgQEAKKy0tICRJZDogTUFQLVNNLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyICBWOC45LjAgKDIwMDktMDQpICAKKy0tIDE3LjcuNglTaG9ydCBtZXNzYWdlIGRhdGEgdHlwZXMKKworTUFQLVNNLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TTS1EYXRhVHlwZXMgKDE2KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvdXRpbmdJbmZvRm9yU00tQXJnLAorCVJvdXRpbmdJbmZvRm9yU00tUmVzLAorCU1PLUZvcndhcmRTTS1BcmcsCisJTU8tRm9yd2FyZFNNLVJlcywKKwlNVC1Gb3J3YXJkU00tQXJnLAorCU1ULUZvcndhcmRTTS1SZXMsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNSZXMsCisJQWxlcnRTZXJ2aWNlQ2VudHJlQXJnLAorCUluZm9ybVNlcnZpY2VDZW50cmVBcmcsCisJUmVhZHlGb3JTTS1BcmcsIAorCVJlYWR5Rm9yU00tUmVzLAorCVNNLURlbGl2ZXJ5T3V0Y29tZSwKKwlBbGVydFJlYXNvbiwKKwlBZGRpdGlvbmFsLU51bWJlciwKKwlNVC1Gb3J3YXJkU00tVkdDUy1BcmcsCisJTVQtRm9yd2FyZFNNLVZHQ1MtUmVzCis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwlTaWduYWxJbmZvLAorCUlNU0ksCisJTE1TSSwKKwlBU0NJLUNhbGxSZWZlcmVuY2UKKworRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorRlJPTSBNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc20tUlAtUFJJCQlbMV0gQk9PTEVBTiwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlbMl0gQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzZdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzU3VwcG9ydEluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU01TLUdNU0Mgc3VwcG9ydHMKKwktLSByZWNlaXZpbmcgb2YgdHdvIG51bWJlcnMgZnJvbSB0aGUgSExSCisJc20tUlAtTVRJCQlbOF0gU00tUlAtTVRJCU9QVElPTkFMLAorCXNtLVJQLVNNRUEJWzldIFNNLVJQLVNNRUEJT1BUSU9OQUwsCisJc20tZGVsaXZlcnlOb3RJbnRlbmRlZAlbMTBdIFNNLURlbGl2ZXJ5Tm90SW50ZW5kZWQJT1BUSU9OQUwgfQorCitTTS1EZWxpdmVyeU5vdEludGVuZGVkIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmx5SU1TSS1yZXF1ZXN0ZWQgICgwKSwKKwlvbmx5TUNDLU1OQy1yZXF1ZXN0ZWQgICgxKSwKKwkuLi59CisKK1NNLVJQLU1USSA6Oj0gSU5URUdFUiAoMC4uMTApCisJLS0gMCBTTVMgRGVsaXZlciAKKwktLSAxIFNNUyBTdGF0dXMgUmVwb3J0CisJLS0gb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQKKworU00tUlAtU01FQSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xMikpCisJLS0gdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgYW4gYWRkcmVzcyBmaWVsZCB3aGljaCBpcyBlbmNvZGVkIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAuIEFuIGFkZHJlc3MgZmllbGQgY29udGFpbnMgMyBlbGVtZW50cyA6CisJLS0gCQlhZGRyZXNzLWxlbmd0aAorCS0tIAkJdHlwZS1vZi1hZGRyZXNzCisJLS0gCQlhZGRyZXNzLXZhbHVlCisKK1JvdXRpbmdJbmZvRm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbG9jYXRpb25JbmZvV2l0aExNU0kJWzBdIExvY2F0aW9uSW5mb1dpdGhMTVNJLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9jYXRpb25JbmZvV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrTm9kZS1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWdwcnNOb2RlSW5kaWNhdG9yCVs1XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzTm9kZUluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU0dTTiBudW1iZXIgaXMgc2VudCBhcyB0aGUgCisJLS0gTmV0d29yayBOb2RlIE51bWJlcgorCWFkZGl0aW9uYWwtTnVtYmVyCVs2XSBBZGRpdGlvbmFsLU51bWJlcglPUFRJT05BTCAKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyIG9yIElQLVNNLUdXCisJLS0gbnVtYmVyIG9yIFNNUyBSb3V0ZXIgbnVtYmVyCisJfQorCitBZGRpdGlvbmFsLU51bWJlciA6Oj0gQ0hPSUNFIHsKKwltc2MtTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2dzbi1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZ30KKwktLSBhZGRpdGlvbmFsLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIKKwktLSBpZiByZWNlaXZlZCBuZXR3b3JrTm9kZS1udW1iZXIgaXMgbXNjLW51bWJlciB0aGVuIHRoZSAJCisJLS0gYWRkaXRpb25hbCBudW1iZXIgaXMgc2dzbi1udW1iZXIgCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIHNnc24tbnVtYmVyIHRoZW4gdGhlIAorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIG1zYy1udW1iZXIgCisKK01PLUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlpbXNpCQkJSU1TSSAJCU9QVElPTkFMIH0KKworTU8tRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvIAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLURBCQlTTS1SUC1EQSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJbW9yZU1lc3NhZ2VzVG9TZW5kCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTTS1SUC1EQSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbG1zaQkJCVsxXSBMTVNJLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzREEJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1EQQlbNV0gTlVMTH0KKworU00tUlAtT0EgOjo9IENIT0lDRSB7CisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzT0EJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1PQQlbNV0gTlVMTH0KKworUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlBZGRyZXNzU3RyaW5nLAorCXNtLURlbGl2ZXJ5T3V0Y29tZQlTTS1EZWxpdmVyeU91dGNvbWUsCisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorCQkJCQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbMl0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzIAorCS0tIGhhbmRsaW5nIG9mIHR3byBkZWxpdmVyeSBvdXRjb21lcworCWRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvcglbM10gCU5VTEwJCU9QVElPTkFMLAorCS0tIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQgd2hlbiB0aGUgU00tRGVsaXZlcnlPdXRjb21lCisJLS0gaXMgZm9yIEdQUlMKKwlhZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lCVs0XSAJU00tRGVsaXZlcnlPdXRjb21lIAlPUFRJT05BTCwKKwktLSBJZiByZWNlaXZlZCwgYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgR1BSUworCS0tIElmIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQsIHRoZW4gQWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbNV0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LUluZGljYXRvcglbNl0gCU5VTEwJCU9QVElPTkFMLAorCS0tIHRoZSBpcC1zbS1ndyBpbmRpY2F0b3IgaW5kaWNhdGVzIGJ5IGl0cyBwcmVzZW5jZSB0aGF0IHNtLWRlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgcHJlc2VudCwgZGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIHNoYWxsIGJlIGFic2VudC4KKwlpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUJWzddIAlTTS1EZWxpdmVyeU91dGNvbWUJT1BUSU9OQUwsIAorCS0tIElmIHJlY2VpdmVkIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzhdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgaXAtc20tZ3ctSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorfQorCitTTS1EZWxpdmVyeU91dGNvbWUgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwlhYnNlbnRTdWJzY3JpYmVyICAoMSksCisJc3VjY2Vzc2Z1bFRyYW5zZmVyICAoMil9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWxlcnRTZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwkuLi59CisKK0luZm9ybVNlcnZpY2VDZW50cmVBcmcgOjo9IFNFUVVFTkNFIHsKKwlzdG9yZWRNU0lTRE4JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW13LVN0YXR1cwlNVy1TdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gbWF5IGJlIHByZXNlbnQgb25seSBpZiAKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIHByZXNlbnQuCisJLS0gaWYgaW5jbHVkZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTIGFuZAorCS0tIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIG5vbi1HUFJTCisKK01XLVN0YXR1cyA6Oj0gQklUIFNUUklORyB7CisJc2MtQWRkcmVzc05vdEluY2x1ZGVkICAoMCksCisJbW5yZi1TZXQgICgxKSwKKwltY2VmLVNldCAgKDIpICwKKwltbnJnLVNldAkgICgzKX0gKFNJWkUgKDYuLjE2KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA0IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlYWR5Rm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWFsZXJ0UmVhc29uCUFsZXJ0UmVhc29uLAorCWFsZXJ0UmVhc29uSW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwktLSBhbGVydFJlYXNvbkluZGljYXRvciBpcyBzZXQgb25seSB3aGVuIHRoZSBhbGVydFJlYXNvbiAKKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgR1BSUworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxBbGVydFJlYXNvbkluZGljYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwKKwktLSBhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24KKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgSVAtU00tR1cKKwl9CisKK1JlYWR5Rm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0UmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwltcy1QcmVzZW50ICAoMCksCisJbWVtb3J5QXZhaWxhYmxlICAoMSl9CisKK01ULUZvcndhcmRTTS1WR0NTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWFzY2lDYWxsUmVmZXJlbmNlCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1WR0NTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlbMF0gU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlkaXNwYXRjaGVyTGlzdAlbMV0gRGlzcGF0Y2hlckxpc3QJT1BUSU9OQUwsCisJb25nb2luZ0NhbGwJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRGlzcGF0Y2hlckxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRGlzcGF0Y2hlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisKK21heE51bU9mRGlzcGF0Y2hlcnMgIElOVEVHRVIgOjo9IDUKKworCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2YyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpAQCAtMCwwICsxLDE5MCBAQAorLS0gJElkOiBNQVAtU1MtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKy0tIDE3LjcuNQlTdXBwbGVtZW50YXJ5IHNlcnZpY2UgY29kZXMKKworTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworU1MtQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UsIGEgZ3JvdXAgb2Ygc3VwcGxlbWVudGFyeSBzZXJ2aWNlcywgb3IKKwktLSBhbGwgc3VwcGxlbWVudGFyeSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFuZCBhYmJyZXZpYXRpb25zCisJLS0gdXNlZCBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwNCBbNV0uIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMKKwktLSBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSwgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCithbGxTUwkJCVNTLUNvZGUgOjo9ICcwMDAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgU1MKKworYWxsTGluZUlkZW50aWZpY2F0aW9uU1MJU1MtQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBsaW5lIGlkZW50aWZpY2F0aW9uIFNTCitjbGlwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAwMSdCCisJLS0gY2FsbGluZyBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY2xpcgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTAnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorY29scAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTEnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY29scgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAxMDAnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9uCittY2kJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1hbGljaW91cyBjYWxsIGlkZW50aWZpY2F0aW9uCisKK2FsbE5hbWVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMTAwMCdCCisJLS0gYWxsIG5hbWUgaWRlbnRpZmljYXRpb24gU1MKK2NuYXAJCQkJU1MtQ29kZSA6Oj0gJzAwMDExMDAxJ0IKKwktLSBjYWxsaW5nIG5hbWUgcHJlc2VudGF0aW9uCisKKwktLSBTUy1Db2RlcyAnMDAwMTEwMTAnQiB0byAnMDAwMTExMTEnQiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAKKwktLSBOYW1lSWRlbnRpZmljYXRpb24gU3VwcGxlbWVudGFyeSBTZXJ2aWNlIHVzZS4KKworYWxsRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMDAwMCdCCisJLS0gYWxsIGZvcndhcmRpbmcgU1MKK2NmdQkJCQlTUy1Db2RlIDo6PSAnMDAxMDAwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyB1bmNvbmRpdGlvbmFsCithbGxDb25kRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMTAwMCdCCisJLS0gYWxsIGNvbmRpdGlvbmFsIGZvcndhcmRpbmcgU1MKK2NmYgkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBidXN5CitjZm5yeQkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMCdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG5vIHJlcGx5CitjZm5yYwkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMSdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG1vYmlsZSBzdWJzY3JpYmVyIG5vdCByZWFjaGFibGUgCitjZAkJCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNhbGwgZGVmbGVjdGlvbgorCithbGxDYWxsT2ZmZXJpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNhbGwgb2ZmZXJpbmcgU1MgaW5jbHVkZXMgYWxzbyBhbGwgZm9yd2FyZGluZyBTUworZWN0CQkJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCisJCS0tIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXIKK21haAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMTAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gbW9iaWxlIGFjY2VzcyBodW50aW5nCisKK2FsbENhbGxDb21wbGV0aW9uU1MJU1MtQ29kZSA6Oj0gJzAxMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBDYWxsIGNvbXBsZXRpb24gU1MKK2N3CQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAwMSdCCisJLS0gY2FsbCB3YWl0aW5nCitob2xkCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAxMCdCCisJLS0gY2FsbCBob2xkCitjY2JzLUEJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTEnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBvcmlnaW5hdGluZyBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSwgRGVsZXRlU3Vic2NyaWJlckRhdGEgCisJLS0gYW5kIEludGVycm9nYXRlU1MKK2NjYnMtQgkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gY29tcGxldGlvbiBvZiBjYWxsIHRvIGJ1c3kgc3Vic2NyaWJlcnMsIGRlc3RpbmF0aW9uIHNpZGUKKwktLSB0aGlzIFNTLUNvZGUgaXMgdXNlZCBvbmx5IGluIEluc2VydFN1YnNjcmliZXJEYXRhIGFuZCBEZWxldGVTdWJzY3JpYmVyRGF0YQorbWMJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAxJ0IKKwktLSBtdWx0aWNhbGwKKworYWxsTXVsdGlQYXJ0eVNTCVNTLUNvZGUgOjo9ICcwMTAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbXVsdGlwYXJ0eSBTUworbXVsdGlQVFkJCQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIG11bHRpcGFydHkKKworYWxsQ29tbXVuaXR5T2ZJbnRlcmVzdC1TUwlTUy1Db2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNvbW11bml0eSBvZiBpbnRlcmVzdCBTUworY3VnCQkJCVNTLUNvZGUgOjo9ICcwMTEwMDAwMSdCCisJLS0gY2xvc2VkIHVzZXIgZ3JvdXAKKworYWxsQ2hhcmdpbmdTUwkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjaGFyZ2luZyBTUworYW9jaQkJCQlTUy1Db2RlIDo6PSAnMDExMTAwMDEnQgorCS0tIGFkdmljZSBvZiBjaGFyZ2UgaW5mb3JtYXRpb24KK2FvY2MJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDEwJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGNoYXJnaW5nCisKK2FsbEFkZGl0aW9uYWxJbmZvVHJhbnNmZXJTUwlTUy1Db2RlIDo6PSAnMTAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdHJhbnNmZXIgU1MKK3V1czEJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKwktLSBVVVMxIHVzZXItdG8tdXNlciBzaWduYWxsaW5nIAordXVzMgkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMTAnQgorCS0tIFVVUzIgdXNlci10by11c2VyIHNpZ25hbGxpbmcKK3V1czMJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKwktLSBVVVMzIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCisKK2FsbEJhcnJpbmdTUwkJU1MtQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKKwktLSBhbGwgYmFycmluZyBTUworYmFycmluZ09mT3V0Z29pbmdDYWxscwlTUy1Db2RlIDo6PSAnMTAwMTAwMDEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgY2FsbHMKK2Jhb2MJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKwktLSBiYXJyaW5nIG9mIGFsbCBvdXRnb2luZyBjYWxscworYm9pYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTAwMTEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscworYm9pY0V4SEMJCQlTUy1Db2RlIDo6PSAnMTAwMTAxMDAnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscyBleGNlcHQgdGhvc2UgZGlyZWN0ZWQKKwktLSB0byB0aGUgaG9tZSBQTE1OIENvdW50cnkKK2JhcnJpbmdPZkluY29taW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDExMDAxJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzCitiYWljCQkJCVNTLUNvZGUgOjo9ICcxMDAxMTAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgaW5jb21pbmcgY2FsbHMKK2JpY1JvYW0JCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTEnQgorCS0tIGJhcnJpbmcgb2YgaW5jb21pbmcgY2FsbHMgd2hlbiByb2FtaW5nIG91dHNpZGUgaG9tZSBQTE1OCisJLS0gQ291bnRyeQorCithbGxQTE1OLXNwZWNpZmljU1MJU1MtQ29kZSA6Oj0gJzExMTEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy0xCVNTLUNvZGUgOjo9ICcxMTExMDAwMSdCCitwbG1uLXNwZWNpZmljU1MtMglTUy1Db2RlIDo6PSAnMTExMTAwMTAnQgorcGxtbi1zcGVjaWZpY1NTLTMJU1MtQ29kZSA6Oj0gJzExMTEwMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy00CVNTLUNvZGUgOjo9ICcxMTExMDEwMCdCCitwbG1uLXNwZWNpZmljU1MtNQlTUy1Db2RlIDo6PSAnMTExMTAxMDEnQgorcGxtbi1zcGVjaWZpY1NTLTYJU1MtQ29kZSA6Oj0gJzExMTEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy03CVNTLUNvZGUgOjo9ICcxMTExMDExMSdCCitwbG1uLXNwZWNpZmljU1MtOAlTUy1Db2RlIDo6PSAnMTExMTEwMDAnQgorcGxtbi1zcGVjaWZpY1NTLTkJU1MtQ29kZSA6Oj0gJzExMTExMDAxJ0IKK3BsbW4tc3BlY2lmaWNTUy1BCVNTLUNvZGUgOjo9ICcxMTExMTAxMCdCCitwbG1uLXNwZWNpZmljU1MtQglTUy1Db2RlIDo6PSAnMTExMTEwMTEnQgorcGxtbi1zcGVjaWZpY1NTLUMJU1MtQ29kZSA6Oj0gJzExMTExMTAwJ0IKK3BsbW4tc3BlY2lmaWNTUy1ECVNTLUNvZGUgOjo9ICcxMTExMTEwMSdCCitwbG1uLXNwZWNpZmljU1MtRQlTUy1Db2RlIDo6PSAnMTExMTExMTAnQgorcGxtbi1zcGVjaWZpY1NTLUYJU1MtQ29kZSA6Oj0gJzExMTExMTExJ0IKKworYWxsQ2FsbFByaW9yaXR5U1MJU1MtQ29kZSA6Oj0gJzEwMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIHByaW9yaXR5IFNTCitlbWxwcAkJCVNTLUNvZGUgOjo9ICcxMDEwMDAwMSdCCisJLS0gZW5oYW5jZWQgTXVsdGlsZXZlbCBQcmVjZWRlbmNlIFByZS1lbXB0aW9uIChFTUxQUCkgc2VydmljZQorCithbGxMQ1NQcml2YWN5RXhjZXB0aW9uCVNTLUNvZGUgOjo9ICcxMDExMDAwMCdCCisJLS0gYWxsIExDUyBQcml2YWN5IEV4Y2VwdGlvbiBDbGFzc2VzCit1bml2ZXJzYWwJCQlTUy1Db2RlIDo6PSAnMTAxMTAwMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGFueSBMQ1MgY2xpZW50CitjYWxsU2Vzc2lvblJlbGF0ZWQJU1MtQ29kZSA6Oj0gJzEwMTEwMDEwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgdmFsdWUgYWRkZWQgTENTIGNsaWVudCB0byB3aGljaCBhIGNhbGwvc2Vzc2lvbiAKKwktLSBpcyBlc3RhYmxpc2hlZCBmcm9tIHRoZSB0YXJnZXQgTVMKK2NhbGxTZXNzaW9uVW5yZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMSdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgZGVzaWduYXRlZCBleHRlcm5hbCB2YWx1ZSBhZGRlZCBMQ1MgY2xpZW50cworcGxtbm9wZXJhdG9yCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDAnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgUExNTiBvcGVyYXRvciBMQ1MgY2xpZW50cyAKK3NlcnZpY2VUeXBlCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IExDUyBjbGllbnRzIG9mIGEgZGVzaWduYXRlZCBMQ1Mgc2VydmljZSB0eXBlCisKK2FsbE1PTFItU1MJCVNTLUNvZGUgOjo9ICcxMTAwMDAwMCdCCisJLS0gYWxsIE1vYmlsZSBPcmlnaW5hdGluZyBMb2NhdGlvbiBSZXF1ZXN0IENsYXNzZXMKK2Jhc2ljU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAwMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCBpdHMgb3duIGxvY2F0aW9uCithdXRvbm9tb3VzU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAxMCdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcGVyZm9ybSBzZWxmIGxvY2F0aW9uIHdpdGhvdXQgaW50ZXJhY3Rpb24KKwktLSB3aXRoIHRoZSBQTE1OIGZvciBhIHByZWRldGVybWluZWQgcGVyaW9kIG9mIHRpbWUKK3RyYW5zZmVyVG9UaGlyZFBhcnR5CVNTLUNvZGUgOjo9ICcxMTAwMDAxMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCB0cmFuc2ZlciBvZiBpdHMgbG9jYXRpb24gdG8gYW5vdGhlciBMQ1MgY2xpZW50CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNmN2YwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDM0MiBAQAorLS0gJElkOiBNQVAtU1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjQJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGRhdGEgdHlwZXMKKyAKK01BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSZWdpc3RlclNTLUFyZywKKwlTUy1JbmZvLAorCVNTLVN0YXR1cywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtRm9yQlMtQ29kZSwKKwlJbnRlcnJvZ2F0ZVNTLVJlcywKKwlVU1NELUFyZywKKwlVU1NELVJlcywgCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCVVTU0QtU3RyaW5nLAorCVBhc3N3b3JkLAorCUd1aWRhbmNlSW5mbywKKwlTUy1MaXN0LAorCVNTLUluZm9MaXN0LAorCU92ZXJyaWRlQ2F0ZWdvcnksCisJQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJTm9SZXBseUNvbmRpdGlvblRpbWUsCisJRm9yd2FyZGluZ09wdGlvbnMsCisJbWF4TnVtT2ZTUywKKwlTUy1EYXRhLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25BcmcsCisJU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcywKKwlDQ0JTLUZlYXR1cmUsCisJUmVnaXN0ZXJDQy1FbnRyeUFyZywKKwlSZWdpc3RlckNDLUVudHJ5UmVzLAorCUVyYXNlQ0MtRW50cnlBcmcsCisJRXJhc2VDQy1FbnRyeVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlNU0ksCisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlBbGVydGluZ1BhdHRlcm4sCisJRU1MUFAtUHJpb3JpdHksIAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHRlcm5hbFNpZ25hbEluZm8KK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUmVnaXN0ZXJTUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs0XSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNl0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJZGVmYXVsdFByaW9yaXR5CVs3XSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbOF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbOV0JTlVMTAkJT1BUSU9OQUwgfQorCitOb1JlcGx5Q29uZGl0aW9uVGltZSA6Oj0gSU5URUdFUiAoNS4uMzApCisKK1NTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEZvcndhcmRpbmdJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gQ2FsbEJhcnJpbmdJbmZvLAorCXNzLURhdGEJCVszXSBTUy1EYXRhfQorCitGb3J3YXJkaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJLi4ufQorCitGb3J3YXJkaW5nRmVhdHVyZUxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUZvcndhcmRpbmdGZWF0dXJlCisKK0ZvcndhcmRpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEZvcndhcmRpbmdPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVs5XSBGVE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1NTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCitGb3J3YXJkaW5nT3B0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDc6IHJlZGlyZWN0aW5nIHByZXNlbnRhdGlvbgorCS0tCTAgbm8gcHJlc2VudGF0aW9uICAKKwktLQkxICBwcmVzZW50YXRpb24KKworCS0tIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDU6IDAgKHVudXNlZCkKKworCS0tIGJpdHMgNDM6IGZvcndhcmRpbmcgcmVhc29uCisJLS0JMDAgIG1zIG5vdCByZWFjaGFibGUKKwktLQkwMSAgbXMgYnVzeQorCS0tCTEwICBubyByZXBseQorCS0tCTExICB1bmNvbmRpdGlvbmFsIHdoZW4gdXNlZCBpbiBhIFNSSSBSZXN1bHQsIAorCS0tCSAgICBvciBjYWxsIGRlZmxlY3Rpb24gd2hlbiB1c2VkIGluIGEgUkNIIEFyZ3VtZW50CisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworQ2FsbEJhcnJpbmdJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZQkJT1BUSU9OQUwsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlDYWxsQmFycmluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQ2FsbEJhcnJpbmdGZWF0dXJlCisKK0NhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlCYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbNV0gTUMtQmVhcmVycwlPUFRJT05BTAorCX0KKworU1MtU3Vic2NyaXB0aW9uT3B0aW9uIDo6PSBDSE9JQ0UgeworCWNsaVJlc3RyaWN0aW9uT3B0aW9uCVsyXSBDbGlSZXN0cmljdGlvbk9wdGlvbiwKKwlvdmVycmlkZUNhdGVnb3J5CVsxXSBPdmVycmlkZUNhdGVnb3J5fQorCitDbGlSZXN0cmljdGlvbk9wdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJcGVybWFuZW50ICAoMCksCisJdGVtcG9yYXJ5RGVmYXVsdFJlc3RyaWN0ZWQgICgxKSwKKwl0ZW1wb3JhcnlEZWZhdWx0QWxsb3dlZCAgKDIpfQorCitPdmVycmlkZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlvdmVycmlkZUVuYWJsZWQgICgwKSwKKwlvdmVycmlkZURpc2FibGVkICAoMSl9CisKK1NTLUZvckJTLUNvZGUgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCS4uLiwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwgfQorCitHZW5lcmljU2VydmljZUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1TdGF0dXMJU1MtU3RhdHVzLAorCWNsaVJlc3RyaWN0aW9uT3B0aW9uCUNsaVJlc3RyaWN0aW9uT3B0aW9uCU9QVElPTkFMLAorCS4uLiwKKwltYXhpbXVtRW50aXRsZWRQcmlvcml0eQlbMF0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJZGVmYXVsdFByaW9yaXR5CVsxXSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwljY2JzLUZlYXR1cmVMaXN0CVsyXSBDQ0JTLUZlYXR1cmVMaXN0CU9QVElPTkFMLAorCW5iclNCCQlbM10gTWF4TUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJVc2VyCQlbNF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJTTgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwgfQorCitDQ0JTLUZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpIE9GCisJCQkJQ0NCUy1GZWF0dXJlCisKK21heE51bU9mQ0NCUy1SZXF1ZXN0cyAgSU5URUdFUiA6Oj0gNQorCitDQ0JTLUZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUluZGV4CVswXSBDQ0JTLUluZGV4CU9QVElPTkFMLAorCWItc3Vic2NyaWJlck51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWItc3Vic2NyaWJlclN1YmFkZHJlc3MJWzJdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cAlbM10gQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi59CisKK0NDQlMtSW5kZXggIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpCisKK0ludGVycm9nYXRlU1MtUmVzIDo6PSBDSE9JQ0UgeworCXNzLVN0YXR1cwkJWzBdIFNTLVN0YXR1cywKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJWzJdIEJhc2ljU2VydmljZUdyb3VwTGlzdCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJWzNdIEZvcndhcmRpbmdGZWF0dXJlTGlzdCwKKwlnZW5lcmljU2VydmljZUluZm8JWzRdCUdlbmVyaWNTZXJ2aWNlSW5mbyB9CisKK1VTU0QtQXJnIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi4gLAorCWFsZXJ0aW5nUGF0dGVybglBbGVydGluZ1BhdHRlcm4JT1BUSU9OQUwsCisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworVVNTRC1SZXMgOjo9IFNFUVVFTkNFIHsKKwl1c3NkLURhdGFDb2RpbmdTY2hlbWUJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCXVzc2QtU3RyaW5nCVVTU0QtU3RyaW5nLAorCS4uLn0KKworVVNTRC1EYXRhQ29kaW5nU2NoZW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBpcyBkZWZpbmVkIGJ5CisJLS0gdGhlIENlbGwgQnJvYWRjYXN0IERhdGEgQ29kaW5nIFNjaGVtZSBhcyBkZXNjcmliZWQgaW4KKwktLSBUUyAzR1BQIFRTIDIzLjAzOCBbMjVdCisKK1VTU0QtU3RyaW5nIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFVTU0QtU3RyaW5nTGVuZ3RoKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgVVNTRC1TdHJpbmcgaXMgZGVwZW5kZW50CisJLS0gb24gdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBhcyBkZXNjcmliZWQgaW4gVFMgM0dQUCBUUyAyMy4wMzggWzI1XS4KKworbWF4VVNTRC1TdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDE2MAorCitQYXNzd29yZCA6Oj0gTnVtZXJpY1N0cmluZworCShGUk9NICgiMCJ8IjEifCIyInwiMyJ8IjQifCI1InwiNiJ8IjcifCI4InwiOSIpKQorCShTSVpFICg0KSkKKworR3VpZGFuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwllbnRlclBXICAoMCksCisJZW50ZXJOZXdQVyAgKDEpLAorCWVudGVyTmV3UFctQWdhaW4gICgyKX0KKwktLSBIb3cgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWFsbHkgZGVsaXZlcmVkIHRvIHRoZSBzdWJzY3JpYmVyCisJLS0gKGRpc3BsYXksIGFubm91bmNlbWVudCwgLi4uKSBpcyBub3QgcGFydCBvZiB0aGlzCisJLS0gc3BlY2lmaWNhdGlvbi4KKworU1MtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1Db2RlCisKK21heE51bU9mU1MgIElOVEVHRVIgOjo9IDMwCisKK1NTLUluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNTKSBPRgorCQkJCVNTLUluZm8KKworQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlCYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAxMworCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzcy1FdmVudAkJWzJdIFNTLUNvZGUsCisJLS0gVGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgYWxsb3dlZCA6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwlzcy1FdmVudFNwZWNpZmljYXRpb24JWzNdIFNTLUV2ZW50U3BlY2lmaWNhdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYi1zdWJzY3JpYmVyTnVtYmVyCVs1XQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJY2Nicy1SZXF1ZXN0U3RhdGUJWzZdCUNDQlMtUmVxdWVzdFN0YXRlCU9QVElPTkFMCisJfQorCitDQ0JTLVJlcXVlc3RTdGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdCAgCSgwKSwKKwlyZWNhbGwgIAkoMSksCisJYWN0aXZlICAJKDIpLAorCWNvbXBsZXRlZAkoMyksCisJc3VzcGVuZGVkCSg0KSwKKwlmcm96ZW4JKDUpLAorCWRlbGV0ZWQJKDYpCisJfQorCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NTLUV2ZW50U3BlY2lmaWNhdGlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4RXZlbnRTcGVjaWZpY2F0aW9uKSBPRgorCQkJCUFkZHJlc3NTdHJpbmcKKworbWF4RXZlbnRTcGVjaWZpY2F0aW9uICBJTlRFR0VSIDo6PSAyCisKK1JlZ2lzdGVyQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLURhdGEJCVsxXQlDQ0JTLURhdGEJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdCUNDQlMtRmVhdHVyZSwKKwl0cmFuc2xhdGVkQi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlSW5kaWNhdG9yCVsyXQlTZXJ2aWNlSW5kaWNhdG9yCU9QVElPTkFMLAorCWNhbGxJbmZvCQlbM10JRXh0ZXJuYWxTaWduYWxJbmZvLAorCW5ldHdvcmtTaWduYWxJbmZvCVs0XQlFeHRlcm5hbFNpZ25hbEluZm8sCisJLi4ufQorCitTZXJ2aWNlSW5kaWNhdG9yIDo6PSBCSVQgU1RSSU5HIHsKKwljbGlyLWludm9rZWQgKDApLAorCWNhbWVsLWludm9rZWQgKDEpfSAoU0laRSgyLi4zMikpIAorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBiaXRzIDIgdG8gMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworUmVnaXN0ZXJDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCWNjYnMtRmVhdHVyZQlbMF0gQ0NCUy1GZWF0dXJlCU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNjYnMtSW5kZXgJWzFdCUNDQlMtSW5kZXgJT1BUSU9OQUwsCisJLi4ufQorCitFcmFzZUNDLUVudHJ5UmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlbMV0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtVFMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCkBAIC0wLDAgKzEsOTIgQEAKKy0tICRJZDogTUFQLVRTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy45CVRlbGVzZXJ2aWNlIENvZGVzCisgCitNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKKzo6PQorCitCRUdJTgorCitUZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworRXh0LVRlbGVzZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSB0ZWxlc2VydmljZSwgYSBncm91cCBvZiB0ZWxlc2VydmljZXMsIG9yIGFsbCB0ZWxlc2VydmljZXMuIFRoZQorCS0tIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIEdTTSAyMi4wMDMgWzRdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisJLS0gT0NURVQgMToKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorIAktLSB0cmVhdGVkIGFjY29yZGluZyB0byB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGRlZmluZWQgZm9yIHRoZQorCS0tIG9wZXJhdGlvbiB0aGF0IHVzZXMgdGhpcyB0eXBlLgorCisJLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIFRlbGVzZXJ2aWNlQ29kZS4KKworYWxsVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDAnQgordGVsZXBob255CQkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDEnQgorZW1lcmdlbmN5Q2FsbHMJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKworYWxsU2hvcnRNZXNzYWdlU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorc2hvcnRNZXNzYWdlTVQtUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorc2hvcnRNZXNzYWdlTU8tUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorCithbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCitmYWNzaW1pbGVHcm91cDNBbmRBbHRlclNwZWVjaAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMSdCCithdXRvbWF0aWNGYWNzaW1pbGVHcm91cDMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMTAnQgorZmFjc2ltaWxlR3JvdXA0CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDExJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwcworLS0gYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKwktLSBhbmQgJ2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzJworYWxsVGVsZXNlcnZpY2VzLUV4ZXB0U01TCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxTcGVlY2hUcmFuc21pc3Npb25TZXJ2aWNlcycgYW5kCisJLS0gJ2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzJworLS0KKy0tIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwIENvZGVzIGFyZSBvbmx5IHVzZWQgaW4gY2FsbAorLS0gaW5kZXBlbmRlbnQgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIG9wZXJhdGlvbnMsIGkuZS4gdGhleQorLS0gYXJlIG5vdCB1c2VkIGluIEluc2VydFN1YnNjcmliZXJEYXRhIG9yIGluCistLSBEZWxldGVTdWJzY3JpYmVyRGF0YSBtZXNzYWdlcy4KKworYWxsVm9pY2VHcm91cENhbGxTZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAwMCdCCit2b2ljZUdyb3VwQ2FsbAkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDEnQgordm9pY2VCcm9hZGNhc3RDYWxsCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKworYWxsUExNTi1zcGVjaWZpY1RTCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy0xCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy0yCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy0zCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy00CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy01CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy02CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy03CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNUUy04CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy05CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1BCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1CCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy1DCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy1ECVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1FCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1GCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFkZTZhCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuCkBAIC0wLDAgKzEsMTQ4OCBAQAorLS0gUlJMUC1Db21wb25lbnRzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gNCBDb21wb25lbnRzCistLSA1IEVsZW1lbnRzIG9mIENvbXBvbmVudHMKKy0tCisKK1JSTFAtQ29tcG9uZW50cworLS0geyBSUkxQLUNvbXBvbmVudHMgfQorCitERUZJTklUSU9OUyBBVVRPTUFUSUMgVEFHUyA6Oj0KKworQkVHSU4KKworSU1QT1JUUworCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQorRlJPTQorCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKy0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlcXVlc3QgY29tcG9uZW50CitNc3JQb3NpdGlvbi1SZXEgOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbkluc3RydWN0CQlQb3NpdGlvbkluc3RydWN0LAorCXJlZmVyZW5jZUFzc2lzdERhdGEJCVJlZmVyZW5jZUFzc2lzdERhdGEJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSA5OCBleHRlbnNpb24gZWxlbWVudAorcmVsOTgtTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwJCisJLS0gUmVsZWFzZSA1IGV4dGVuc2lvbiBlbGVtZW50CityZWw1LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwKKwktLSBSZWxlYXNlIDcgZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDctTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMCit9CisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlc3BvbnNlIGNvbXBvbmVudAorTXNyUG9zaXRpb24tUnNwIDo6PSBTRVFVRU5DRSB7CisJbXVsdGlwbGVTZXRzCQkJTXVsdGlwbGVTZXRzCQkJT1BUSU9OQUwsCisJcmVmZXJlbmNlSWRlbnRpdHkJCVJlZmVyZW5jZUlkZW50aXR5CQlPUFRJT05BTCwKKwlvdGQtTWVhc3VyZUluZm8JCQlPVEQtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkluZm8JCQlMb2NhdGlvbkluZm8JCQlPUFRJT05BTCwKKwlncHMtTWVhc3VyZUluZm8JCQlHUFMtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkVycm9yCQkJTG9jYXRpb25FcnJvcgkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCQorCS0tIFJlbGVhc2UgZXh0ZW5zaW9uIGhlcmUKKwlyZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJCisJCQkJCQkJUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMLAorCXJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwktLSByZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIGFuZCBvdGhlciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9ucworCS0tIGFyZSB0aGUgb25seSBpbmZvcm1hdGlvbiBlbGVtZW50cyB0aGF0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgMm5kCisJLS0gTXNyUG9zaXRpb24tUnNwIGNvbXBvbmVudCB3aGVuIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkCisJcmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgorCQkJCQkJCVJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnQKK0Fzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlQXNzaXN0RGF0YQlSZWZlcmVuY2VBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJbXNyQXNzaXN0RGF0YQkJCU1zckFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlzeXN0ZW1JbmZvQXNzaXN0RGF0YQlTeXN0ZW1JbmZvQXNzaXN0RGF0YQlPUFRJT05BTCwKKwlncHMtQXNzaXN0RGF0YQkJCUdQUy1Bc3Npc3REYXRhCQkJT1BUSU9OQUwsCQorCW1vcmVBc3NEYXRhVG9CZVNlbnQJCU1vcmVBc3NEYXRhVG9CZVNlbnQJCU9QVElPTkFMLAktLSBJZiBub3QgcHJlc2VudCwgaW50ZXJwcmV0IGFzIG9ubHkKKwkJCQkJCQkJCQkJCQkJCQktLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50IHVzZWQgdG8KKwkJCQkJCQkJCQkJCQkJCQktLSBkZWxpdmVyIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorCQkJCQkJCQkJCQkJCQkJCS0tIGRhdGEuCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCVJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKwlyZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKyByZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBPUFRJT05BTAkKK30KKworLS0gUHJvdG9jb2wgRXJyb3IgY29tcG9uZW50CitQcm90b2NvbEVycm9yIDo6PSBTRVFVRU5DRSB7CisJZXJyb3JDYXVzZQkJCQlFcnJvckNvZGVzLAkKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgZXh0ZW5zaW9ucyBoZXJlCisJcmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24gUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIFBvc2l0aW9uIGluc3RydWN0aW9ucworUG9zaXRpb25JbnN0cnVjdCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1ldGhvZCB0eXBlCisJbWV0aG9kVHlwZQkJCQlNZXRob2RUeXBlLAkKKwlwb3NpdGlvbk1ldGhvZAkJCVBvc2l0aW9uTWV0aG9kLAorCW1lYXN1cmVSZXNwb25zZVRpbWUJCU1lYXN1cmVSZXNwb25zZVRpbWUsCQkKKwl1c2VNdWx0aXBsZVNldHMJCQlVc2VNdWx0aXBsZVNldHMsCQkKKwllbnZpcm9ubWVudENoYXJhY3RlcglFbnZpcm9ubWVudENoYXJhY3RlcglPUFRJT05BTAkKK30KKworLS0KK01ldGhvZFR5cGUgOjo9IENIT0lDRSB7CisJbXNBc3Npc3RlZAkJQWNjdXJhY3lPcHQsCS0tIGFjY3VyYWN5IGlzIG9wdGlvbmFsCisJbXNCYXNlZAkJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNCYXNlZFByZWYJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNBc3Npc3RlZFByZWYJQWNjdXJhY3kgCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKK30KKworLS0gQWNjdXJhY3kgb2YgdGhlIGxvY2F0aW9uIGVzdGltYXRpb24KK0FjY3VyYWN5T3B0IDo6PSBTRVFVRU5DRSB7CisJYWNjdXJhY3kJCUFjY3VyYWN5CU9QVElPTkFMCit9CisKKy0tIFRoZSB2YWx1ZXMgb2YgdGhpcyBmaWVsZCBhcmUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiAoVW5jZXJ0YWludHkgY29kZSkKK0FjY3VyYWN5IDo6PSBJTlRFR0VSICgwLi4xMjcpCisKKworLS0gUG9zaXRpb24gTWV0aG9kCitQb3NpdGlvbk1ldGhvZCA6Oj0gRU5VTUVSQVRFRCB7CisJZW90ZCAoMCksCisJZ3BzICgxKSwKKwlncHNPckVPVEQgKDIpCit9CisKKy0tIE1lYXN1cmVtZW50IHJlcXVlc3QgcmVzcG9uc2UgdGltZQorTWVhc3VyZVJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAoMC4uNykKKworLS0gdXNlTXVsdGlwbGUgU2V0cywgRkZTIQorVXNlTXVsdGlwbGVTZXRzIDo6PSBFTlVNRVJBVEVEIHsKKwltdWx0aXBsZVNldHMgKDApLAkJLS0gbXVsdGlwbGUgc2V0cyBhcmUgYWxsb3dlZAorCW9uZVNldCAoMSkJCQkJLS0gc2VuZGluZyBvZiBtdWx0aXBsZSBpcyBub3QgYWxsb3dlZAorfQorCistLSBFbnZpcm9ubWVudCBjaGFyYWN0ZXJpemF0aW9uCitFbnZpcm9ubWVudENoYXJhY3RlciA6Oj0gRU5VTUVSQVRFRCB7CisJYmFkQXJlYSAoMCksCQktLSBiYWQgdXJiYW4gb3Igc3VidXJiYW4sIGhlYXZ5IG11bHRpcGF0aCBhbmQgTkxPUworCW5vdEJhZEFyZWEgKDEpLAkJLS0gbGlnaHQgbXVsdGlwYXRoIGFuZCBOTE9TCisJbWl4ZWRBcmVhICgyKSwJCS0tIG5vdCBkZWZpbmVkIG9yIG1peGVkIGVudmlyb25tZW50CisJLi4uCit9CisKKy0tIEUtT1REIHJlZmVyZW5jZSBCVFMgZm9yIEFzc2l0YW5jZSBkYXRhIElFCitSZWZlcmVuY2VBc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAkJCQkJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCQkJCQkJLS0gQlNJQworCXRpbWVTbG90U2NoZW1lCVRpbWVTbG90U2NoZW1lLCAJCQkJCS0tIFRpbWVzbG90IHNjaGVtZQorCWJ0c1Bvc2l0aW9uCQlCVFNQb3NpdGlvbgkJCU9QVElPTkFMCit9CisKKy0tIGVsbGlwc29pZCBwb2ludCBhbmQKKy0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQgc2hhcGVzIGFyZSBzdXBwb3J0ZWQKK0JUU1Bvc2l0aW9uIDo6PSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KKworLS0gUkYgY2hhbm5lbCBudW1iZXIgb2YgQkNDSAorQkNDSENhcnJpZXIgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEJhc2Ugc3RhdGlvbiBJZGVudGl0eSBDb2RlCitCU0lDIDo6PSBJTlRFR0VSICgwLi42MykKKworLS0gVGltZXNsb3Qgc2NoZW1lCitUaW1lU2xvdFNjaGVtZSA6Oj0gRU5VTUVSQVRFRCB7CisJZXF1YWxMZW5ndGggKDApLAorCXZhcmlvdXNMZW5ndGggKDEpCit9CisKKy0tIFRpbWUgc2xvdCAobW9kdWxvKQorTW9kdWxvVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjMpCisKKy0tIEUtT1REIG1lYXN1cmVtZW50IGFzc2lzdGFuY2UgZGF0YSBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBuZWlnaGJvcnMgaW4gdGhpcyBlbGVtZW50IChNc3JBc3Npc3REYXRhKQorLS0gYW5kIGluIFN5c3RlbUluZm9Bc3Npc3REYXRhIGVsZW1lbnQgKHByZXNlbnRlZCBuZWlnaGJvcnMKKy0tIGNhbiBiZSBhdCBhIG1heGltdW0gMTUhKQorTXNyQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0IFNlcU9mTXNyQXNzaXN0QlRTCit9CitTZXFPZk1zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMKKworTXNyQXNzaXN0QlRTIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwgCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YSBpcyBtb3ZlZCBoZXJlCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gTXVsdGlmcmFtZSBvZmZzZXQKK011bHRpRnJhbWVPZmZzZXQgOjo9IElOVEVHRVIgKDAuLjUxKQorLS0gVGhlIE11bHRpZnJhbWUgT2Zmc2V0IHZhbHVlIDUxIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBSb3VnaCBSVEQgdmFsdWUgYmV0d2VlbiBvbmUgYmFzZSBzdGF0aW9uIGFuZCByZWZlcmVuY2UgQlRTCitSb3VnaFJURCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBSb3VnaFJURCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZCBzaGFsbAorLS0gYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBFLU9URCBNZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBMaXN0IElFCistLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJhc2Ugc3RhdGlvbnMgaW4gdGhpcyBlbGVtZW50IChTeXN0ZW1JbmZvQXNzaXN0RGF0YQorLS0gcHJlc2VudGVkIG5laWdoYm9ycykgYW5kIGluIE1zckFzc2lzdERhdGEgZWxlbWVudCBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1LgorU3lzdGVtSW5mb0Fzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCit9CitTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFM6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBTeXN0ZW1JbmZvQXNzaXN0QlRTCisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEKK30KKworLS0gQWN0dWFsIGFzc2lzdGFuY2UgZGF0YSBmb3Igc3lzdGVtIGluZm9ybWF0aW9uIGJhc2Ugc3RhdGlvbgorQXNzaXN0QlRTRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwJLS0gbXVsdGlmcmFtZSBvZmZzZXQKKwl0aW1lU2xvdFNjaGVtZQkJVGltZVNsb3RTY2hlbWUsCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlyb3VnaFJURAkJCVJvdWdoUlRELAkJCS0tIHJvdWdoIFJURCB2YWx1ZQorCisJLS0gTG9jYXRpb24gQ2FsY3VsYXRpb24gQXNzaXN0YW5jZSBkYXRhCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gRS1PVEQgTG9jYXRpb24gY2FsY3VsYXRpb24gYXNzaXN0YW5jZSBkYXRhLAorLS0gQ2FsY0Fzc2lzdGFuY2VCVFMgZWxlbWVudCBpcyBvcHRpb25hbCBub3Qgc3ViZmllbGRzCitDYWxjQXNzaXN0YW5jZUJUUyA6Oj0gU0VRVUVOQ0UgeworCWZpbmVSVEQJCQkJRmluZVJURCwJCS0tIGZpbmUgUlREIHZhbHVlIGJldHdlZW4gYmFzZSBzdGF0aW9ucworCXJlZmVyZW5jZVdHUzg0CQlSZWZlcmVuY2VXR1M4NAktLSByZWZlcmVuY2UgY29vcmRpbmF0ZXMKK30KKworLS0gQ29vcmRpbmF0ZXMgb2YgbmVpZ2hib3VyIEJUUywgV0dTLTg0IGVsbGlwc29pZAorUmVmZXJlbmNlV0dTODQgOjo9IFNFUVVFTkNFIHsKKwlyZWxhdGl2ZU5vcnRoCVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAoc291dGggbmVnYXRpdmUpCisJcmVsYXRpdmVFYXN0CVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAod2VzdCBuZWdhdGl2ZSkKKwktLSBSZWxhdGl2ZSBBbHRpdHVkZSBpcyBub3QgYWx3YXlzIGtub3duCisJcmVsYXRpdmVBbHQJCVJlbGF0aXZlQWx0CQlPUFRJT05BTAktLSByZWxhdGl2ZSBhbHRpdHVkZQorfQorCistLSBGaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIHRoaXMgQlRTIGFuZCB0aGUgcmVmZXJlbmNlIEJUUwkKK0ZpbmVSVEQgOjo9IElOVEVHRVIgKDAuLjI1NSkKKworLS0gUmVsYXRpdmUgbm9ydGgvZWFzdCBkaXN0YW5jZQorUmVsRGlzdGFuY2UgOjo9IElOVEVHRVIgKC0yMDAwMDAuLjIwMDAwMCkKKworLS0gUmVsYXRpdmUgYWx0aXR1ZGUKK1JlbGF0aXZlQWx0IDo6PSBJTlRFR0VSICgtNDAwMC4uNDAwMCkKKworLS0gTWVhc3VyZSBwb3NpdGlvbiByZXNwb25zZSBJRXMKKy0tIFJlZmVyZW5jZSBJZGVudGl0eQorLS0gTXVsdGlwbGUgc2V0cworTXVsdGlwbGVTZXRzIDo6PSBTRVFVRU5DRSB7CisJLS0gbnVtYmVyIG9mIHJlZmVyZW5jZSBzZXRzCisJbmJyT2ZTZXRzCQkJSU5URUdFUiAoMi4uMyksCQkKKworCS0tIFRoaXMgZmllbGQgYWN0dWFsbHkgdGVsbHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UgQlRTcworCW5ick9mUmVmZXJlbmNlQlRTcwlJTlRFR0VSICgxLi4zKSwKKworCS0tIFRoaXMgZmllbGQgaXMgY29uZGl0aW9uYWwgYW5kIGluY2x1ZGVkIG9wdGlvbmFsbHkgb25seSBpZgorCS0tIG5ick9mU2V0cyBpcyAzIGFuZCBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MgaXMgMi4KKwlyZWZlcmVuY2VSZWxhdGlvbgkJUmVmZXJlbmNlUmVsYXRpb24JCU9QVElPTkFMCit9CisKKy0tIFJlbGF0aW9uIGJldHdlZW4gcmVmZW5jZSBCVFNzIGFuZCBzZXRzCitSZWZlcmVuY2VSZWxhdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJc2Vjb25kQlRTVGhpcmRTZXQgKDApLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAybmQgc2V0cworCXNlY29uZEJUU1NlY29uZFNldCAoMSksCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3QgYW5kIDNyZCBzZXRzCisJZmlyc3RCVFNGaXJzdFNldCAoMikJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBzZXQKK30KKworLS0gUmVmZXJlbmNlIEJUUyBJZGVudGl0eSwgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG51bWJlciBvZgorLS0gQlRTcyB0b2xkIG5ick9mUmVmZXJlbmNlQlRTcyBmaWVsZCBpbiBNdWx0aXBsZSBzZXRzIGVsZW1lbnQpCitSZWZlcmVuY2VJZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCS0tIFJlZmVyZW5jZSBCVFMgbGlzdAorCXJlZkJUU0xpc3QJCVNlcU9mUmVmZXJlbmNlSWRlbnRpdHlUeXBlCit9CitTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZSA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIFJlZmVyZW5jZUlkZW50aXR5VHlwZQorCistLSBDZWxsIGlkZW50aXR5CitSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IENIT0lDRSB7CisJYnNpY0FuZENhcnJpZXIJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCXJlcXVlc3RJbmRleAlSZXF1ZXN0SW5kZXgsCQktLSBJbmRleCB0byBSZXF1ZXN0ZWQgTmVpZ2hib3IgTGlzdAorCXN5c3RlbUluZm9JbmRleAlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiByZWYuIGlkZW50aXR5CisJCQkJCQkJCQkJLS0gc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMgcmVjZWl2ZWQKKwkJCQkJCQkJCQktLSB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IgdGhpcyBjZWxsLgorCWNpQW5kTEFDCQlDZWxsSURBbmRMQUMJCS0tIENJIGFuZCBMQUMKK30KKworQlNJQ0FuZENhcnJpZXIgOjo9IFNFUVVFTkNFIHsKKwljYXJyaWVyCUJDQ0hDYXJyaWVyLAorCWJzaWMJCUJTSUMKK30KKworUmVxdWVzdEluZGV4IDo6PSBJTlRFR0VSICgxLi4xNikKKworU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKworQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKwlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKK30KK0NlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCitMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisKKy0tIE9URC1NZWFzdXJlSW5mbworT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cywgT1RELU1zckVsZW1lbnQgaXMgcmVwZWF0ZWQgbnVtYmVyIG9mIHRpbWVzCisJLS0gdG9sZCBpbiBuYnJPZlJlZmVyZW5jZUJUU3MgaW4gTXVsdGlwbGVTZXRzLCBkZWZhdWx0IHZhbHVlIGlzIDEKKwlvdGRNc3JGaXJzdFNldHMJCU9URC1Nc3JFbGVtZW50Rmlyc3QsCisKKwktLSBpZiBtb3JlIHRoYW4gb25lIHNldHMgYXJlIHByZXNlbnQgdGhpcyBlbGVtZW50IGlzIHJlcGVhdGVkCisJLS0gTnVtYmVyT2ZTZXRzIC0gMSAoLTEgPSBmaXJzdCBzZXQpCisJb3RkTXNyUmVzdFNldHMJCVNlcU9mT1RELU1zckVsZW1lbnRSZXN0CQlPUFRJT05BTAorfQorCitTZXFPZk9URC1Nc3JFbGVtZW50UmVzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIE9URC1Nc3JFbGVtZW50UmVzdAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIGZvciAxIHNldAorT1RELU1zckVsZW1lbnRGaXJzdCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lTnVtYmVyCQkJSU5URUdFUiAoMC4uNDI0MzEpLCAJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJT1BUSU9OQUwsCS0tIFRBIGNvcnJlY3Rpb24KKworCS0tIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycyAJCVNlcU9mT1RELUZpcnN0U2V0TXNycyAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtRmlyc3RTZXRNc3JzCisKKy0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gMiBhbmQgMyBzZXRzIGlmIGV4aXN0CitPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCQktLSBGcmFtZSBudW1iZXIgbW9kdWxvIDQyNDMyCisJcmVmZXJlbmNlVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCXRvYU1lYXN1cmVtZW50c09mUmVmCVRPQS1NZWFzdXJlbWVudHNPZlJlZgkJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1Nc3JzT2ZPdGhlclNldHMgCVNlcU9mT1RELU1zcnNPZk90aGVyU2V0cwlPUFRJT05BTAorfQorU2VxT2ZPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMCkpIE9GIE9URC1Nc3JzT2ZPdGhlclNldHMKKworLS0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBUT0EgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHJlZmVyZW5jZSBCVFMKK1RPQS1NZWFzdXJlbWVudHNPZlJlZiA6Oj0gU0VRVUVOQ0UgeworCXJlZlF1YWxpdHkJCQlSZWZRdWFsaXR5LAorCW51bU9mTWVhc3VyZW1lbnRzCU51bU9mTWVhc3VyZW1lbnRzCit9CisKK1JlZlF1YWxpdHkgOjo9IElOVEVHRVIgKDAuLjMxKQkJCS0tIFN0IERldiBvZiBUT0Egb2YgcmVmZXJlbmNlIGFzIGRlZmluZWQgaW4gYW5uZXgKK051bU9mTWVhc3VyZW1lbnRzIDo6PSBJTlRFR0VSICgwLi43KQktLSBOby4gb2YgbWVhc3VyZW1lbnRzIGZvciBSZWZRdWFsaXR5IGFzIGRlZmluZWQgaW4gYW5uZXgKK1N0ZFJlc29sdXRpb24gOjo9IElOVEVHRVIgKDAuLjMpCQktLSBWYWx1ZXMgb2YgcmVzb2x1dGlvbiBhcmUgZGVmaW5lZCBpbiBhbm5leAorCitPVEQtRmlyc3RTZXRNc3JzIDo6PSBPVEQtTWVhc3VyZW1lbnRXaXRoSUQKKworLS0gTmVpZ2hib3VyIGluZm8gaW4gT1REIG1lYXN1cmVtZW50cyAwLTEwIHRpbWVzIGluIFREIG1lYXN1cmVtZW50IGluZm8KK09URC1Nc3JzT2ZPdGhlclNldHMgOjo9IENIT0lDRSB7CisJaWRlbnRpdHlOb3RQcmVzZW50CU9URC1NZWFzdXJlbWVudCwJCisJaWRlbnRpdHlQcmVzZW50CQlPVEQtTWVhc3VyZW1lbnRXaXRoSUQKK30KKworLS0gRm9yIHRoaXMgT1REIG1lYXN1cmVtZW50IGlkZW50aXR5IGlzIHNhbWUgYXMgdGhlIGlkZW50aXR5IG9mIEJUUworLS0gaW4gdGhlIGZpcnN0IHNldCB3aXRoIHNhbWUgc2VxdWVuY2UgbnVtYmVyCitPVEQtTWVhc3VyZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwluYm9yVGltZVNsb3QJTW9kdWxvVGltZVNsb3QsCisJZW90ZFF1YWxpdHkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQlPVERWYWx1ZQorfQorCistLSBUaGlzIG1lYXN1cmVtZW50IGNvbnRhaW5zIHRoZSBCVFMgaWRlbnRpdHkgYW5kIG1lYXN1cmVtZW50CitPVEQtTWVhc3VyZW1lbnRXaXRoSUQgOjo9U0VRVUVOQ0UgeworCW5laWdoYm9ySWRlbnRpdHkJTmVpZ2hib3JJZGVudGl0eSwKKwluYm9yVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQkJRU9URFF1YWxpdHksCisJb3RkVmFsdWUJCQlPVERWYWx1ZQorfQorCitFT1REUXVhbGl0eSA6Oj0gU0VRVUVOQ0UgeworCW5ick9mTWVhc3VyZW1lbnRzCUlOVEVHRVIJKDAuLjcpLAorCXN0ZE9mRU9URAkJCUlOVEVHRVIgKDAuLjMxKQorfQorCitOZWlnaGJvcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCQlCU0lDQW5kQ2FycmllciwJCS0tIEJTSUMgYW5kIENhcnJpZXIKKwljaQkJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCW11bHRpRnJhbWVDYXJyaWVyCU11bHRpRnJhbWVDYXJyaWVyLCAJLS0gTXVsdGlGcmFtZU9mZmVzdCBhbmQgQlNJQworCXJlcXVlc3RJbmRleAkJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJCVN5c3RlbUluZm9JbmRleCwJLS0gSW5kZXggdG8gU3lzdGVtIGluZm8gbGlzdCwgdGhpcyB0eXBlIG9mIG5laWdoYm91cgorCQkJCQkJCQkJCQktLSBpZGVudGl0eSBzaGFsbCBub3QgYmUgdXNlZCBieSB0aGUgTVMgdW5sZXNzIGl0IGhhcworCQkJCQkJCQkJCQktLSByZWNlaXZlZCB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IKKwkJCQkJCQkJCQkJLS0gdGhpcyBjZWxsLgorCWNpQW5kTEFDCQkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKKy0tIE11bHRpZnJhbWUgYW5kIGNhcnJpZXIKK011bHRpRnJhbWVDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IHZhbHVlIGZvciBuZWlnaGJvdXIKK09URFZhbHVlIDo6PSBJTlRFR0VSICgwLi4zOTk5OSkKKworLS0gTG9jYXRpb24gaW5mb3JtYXRpb24gSUUKK0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSksCQkJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCS0tIElmIHJlZkZyYW1lIGlzIHdpdGhpbiAoNDI0MzIuLjY1NTM1KSwgaXQgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIKKwktLSBpbiB0aGF0IGNhc2UgdGhlIE1TIHNob3VsZCBwcm92aWRlIEdQUyBUT1cgaWYgYXZhaWxhYmxlCisJZ3BzVE9XCQkJSU5URUdFUiAoMC4uMTQzOTk5OTkpCU9QVElPTkFMLAktLSBHUFMgVE9XCisJZml4VHlwZQkJCUZpeFR5cGUsCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCS0tIFBvc3NpYmxlIHNoYXBlcyBjYXJyaWVkIGluIHBvc0VzdGltYXRlIGFyZQorCS0tIGVsbGlwc29pZCBwb2ludCwKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCXBvc0VzdGltYXRlCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworRml4VHlwZSA6Oj0gSU5URUdFUiB7CisJdHdvREZpeCAoMCksCisJdGhyZWVERml4ICgxKQorfSAoMC4uMSkKKworLS0gR1BTLU1lYXN1cmVtZW50IGluZm9ybWF0aW9uCitHUFMtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorCWdwc01zclNldExpc3QJU2VxT2ZHUFMtTXNyU2V0RWxlbWVudAkKK30KK1NlcU9mR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHUFMtTXNyU2V0RWxlbWVudAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBtZXNzYWdlCitHUFMtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSkJT1BUSU9OQUwsIAktLSBSZWZlcmVuY2UgRnJhbWUgbnVtYmVyCisJZ3BzVE9XCQkJR1BTVE9XMjRiLAkJCQkJCS0tIEdQUyBUT1cKKwktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmRnJhbWUgaXMgMCAtIDQyNDMxCisKKy0tTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZ3BzLW1zckxpc3QKKworCWdwcy1tc3JMaXN0CQlTZXFPZkdQUy1Nc3JFbGVtZW50Cit9CisKKy0tIDI0IGJpdCBwcmVzZW50YXRpb24gZm9yIEdQU1RPVworR1BTVE9XMjRiIDo6PSBJTlRFR0VSICgwLi4xNDM5OTk5OSkKKworLS0gbWVhc3VyZWQgZWxlbWVudHMgaW4gbWVhc3VyZW1lbnQgcGFyYW1ldGVycyBmaWVsZAorU2VxT2ZHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHUFMtTXNyRWxlbWVudAorCitHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkJLS0gU2F0ZWxsaXRlIGlkZW50aWZpZXIKKwljTm8JCQkJSU5URUdFUiAoMC4uNjMpLAkJCS0tIGNhcnJpZXIgbm9pc2UgcmF0aW8KKwlkb3BwbGVyCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksIAktLSBkb3BwbGVyLCBtdWxsdGlwbHkgYnkgMC4yCisJd2hvbGVDaGlwcwkJSU5URUdFUiAoMC4uMTAyMiksCQkJLS0gd2hvbGUgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwlmcmFjQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjQpLAkJCS0tIGZyYWN0aW9uYWwgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwkJCQkJCQkJCQkJLS0gYSB2YWx1ZSBvZiAxMDI0IHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSBzZW5kZXIKKwkJCQkJCQkJCQkJLS0gdGhlIHJlY2VpdmVyIHNoYWxsIGNvbnNpZGVyIGEgdmFsdWUgb2YgMTAyNCB0byBiZQorCQkJCQkJCQkJCQktLSBpbnZhbGlkIGRhdGEKKwltcGF0aEluZGljCQlNcGF0aEluZGljLAkJCQkJLS0gbXVsdGlwYXRoIGluZGljYXRvcgorCXBzZXVSYW5nZVJNU0VycglJTlRFR0VSICgwLi42MykJCQkJLS0gaW5kZXgJCQorfQorCistLSBNdWx0aXBhdGggaW5kaWNhdG9yCitNcGF0aEluZGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RNZWFzdXJlZCAoMCksCisJbG93ICgxKSwKKwltZWRpdW0gKDIpLAorCWhpZ2ggKDMpCit9CisKKy0tIExvY2F0aW9uIGVycm9yIElFCitMb2NhdGlvbkVycm9yIDo6PSBTRVFVRU5DRSB7CisJbG9jRXJyb3JSZWFzb24JCQkJTG9jRXJyb3JSZWFzb24sCisJYWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhCUFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlPUFRJT05BTCwKKwkuLi4KK30KKworTG9jRXJyb3JSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCXVuRGVmaW5lZCAoMCksCQorCW5vdEVub3VnaEJUU3MgKDEpLAorCW5vdEVub3VnaFNhdHMgKDIpLAorCWVvdGRMb2NDYWxBc3NEYXRhTWlzc2luZyAoMyksCisJZW90ZEFzc0RhdGFNaXNzaW5nICg0KSwKKwlncHNMb2NDYWxBc3NEYXRhTWlzc2luZyAoNSksCisJZ3BzQXNzRGF0YU1pc3NpbmcgKDYpLAorCW1ldGhvZE5vdFN1cHBvcnRlZCAoNyksCisJbm90UHJvY2Vzc2VkICg4KSwKKwlyZWZCVFNGb3JHUFNOb3RTZXJ2aW5nQlRTICg5KSwKKwlyZWZCVFNGb3JFT1RETm90U2VydmluZ0JUUyAoMTApLAorCS4uLiwKKwlub3RFbm91Z2hHQU5TU1NhdHMgKDExKSwJCisgZ2Fuc3NBc3NEYXRhTWlzc2luZyAoMTIpLAorCXJlZkJUU0ZvckdBTlNTTm90U2VydmluZ0JUUyAoMTMpCit9CisKKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDAKKworCistLSBkZWZpbmVzIGFkZGl0aW9uYWwgYXNzaXN0YW5jZSBkYXRhIG5lZWRlZCBmb3IgYW55IG5ldyBsb2NhdGlvbiBhdHRlbXB0CistLSBNUyBzaGFsbCByZXRhaW4gYW55IGFzc2lzdGFuY2UgZGF0YSBhbHJlYWR5IHJlY2VpdmVkCitBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHNBc3Npc3RhbmNlRGF0YQkJR1BTQXNzaXN0YW5jZURhdGEJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJZ2Fuc3NBc3Npc3RhbmNlRGF0YSBHQU5TU0Fzc2lzdGFuY2VEYXRhIE9QVElPTkFMCit9CisKK0dQU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdQU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdQU0Fzc2lzdGFuY2VEYXRhIGhhcyBpZGVudGljYWwgc3RydWN0dXJlIGFuZCBlbmNvZGluZyB0byBvY3RldHMgMyB0byBuIG9mIHRoZQorLS0gR1BTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHUFNBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCitHQU5TU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdBTlNTQXNzaXN0YW5jZURhdGEpKQorLS0gR0FOU1NBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdBTlNTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHQU5TU0Fzc2lzdGFuY2VEYXRhCUlOVEVHRVIgOjo9IDQwCisKKworLS0gUHJvdG9jb2wgRXJyb3IgQ2F1c2VzCitFcnJvckNvZGVzIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAorbWlzc2luZ0NvbXBvbmV0ICgxKSwJCQkKK2luY29ycmVjdERhdGEgKDIpLAkJCQorbWlzc2luZ0lFb3JDb21wb25lbnRFbGVtZW50ICgzKSwJCQorbWVzc2FnZVRvb1Nob3J0ICg0KSwJCQkKK3Vua25vd1JlZmVyZW5jZU51bWJlciAoNSksCQkKKy4uLgorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKy0tIEdQUyBhc3Npc3RhbmNlIGRhdGEgSUUKK0dQUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJY29udHJvbEhlYWRlcgkJQ29udHJvbEhlYWRlcgorfQorCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBUbyBCZSBTZW50IElFCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBDb21wb25lbnRzIE9uIHRoZSBXYXkgaW5kaWNhdGlvbiBmb3IgZGVsaXZlcnkgb2YgYW4gZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlCistLSBkYXRhIGluIG11bHRpcGxlIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnRzLgorCitNb3JlQXNzRGF0YVRvQmVTZW50IDo6PSBFTlVNRVJBVEVEIHsKKwlub01vcmVNZXNzYWdlcyAoMCksCQkJLS0gVGhpcyBpcyB0aGUgb25seSBvciBsYXN0IEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlIHVzZWQgdG8gZGVsaXZlcgorCQkJCQkJCQktLSB0aGUgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlIGRhdGEuCisJbW9yZU1lc3NhZ2VzT25UaGVXYXkgKDEpCS0tIFRoZSBTTUxDIHdpbGwgc2VuZCBtb3JlIEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlcyBvciBhIGZpbmFsIFJSTFAKKwkJCQkJCQkJLS0gTWVhc3VyZSBQb3NpdGlvbiBSZXF1ZXN0IG1lc3NhZ2UgdG8gZGVsaXZlciB0aGUKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorfQorCistLSBDb250cm9sIGhlYWRlciBvZiB0aGUgR1BTIGFzc2lzdGFuY2UgZGF0YQorQ29udHJvbEhlYWRlciA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmllbGQgdHlwZSBQcmVzZW50IGluZm9ybWF0aW9uCisJcmVmZXJlbmNlVGltZQkJUmVmZXJlbmNlVGltZQkJT1BUSU9OQUwsCisJcmVmTG9jYXRpb24JCQlSZWZMb2NhdGlvbgkJCU9QVElPTkFMLAorCWRncHNDb3JyZWN0aW9ucwkJREdQU0NvcnJlY3Rpb25zCQlPUFRJT05BTCwKKwluYXZpZ2F0aW9uTW9kZWwJCU5hdmlnYXRpb25Nb2RlbAkJT1BUSU9OQUwsCisJaW9ub3NwaGVyaWNNb2RlbAkJSW9ub3NwaGVyaWNNb2RlbAkJT1BUSU9OQUwsCisJdXRjTW9kZWwJCQlVVENNb2RlbAkJCU9QVElPTkFMLAorCWFsbWFuYWMJCQlBbG1hbmFjCQkJT1BUSU9OQUwsCisJYWNxdWlzQXNzaXN0CQlBY3F1aXNBc3Npc3QJCU9QVElPTkFMLAorCXJlYWxUaW1lSW50ZWdyaXR5IFNlcU9mLUJhZFNhdGVsbGl0ZVNldCBPUFRJT05BTAorfQorCitSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ3BzVGltZQkJCQlHUFNUaW1lLAorCWdzbVRpbWUJCQkJR1NNVGltZQkJCQlPUFRJT05BTCwKKwlncHNUb3dBc3Npc3QJCUdQU1RPV0Fzc2lzdAkJT1BUSU9OQUwKK30KKworLS0gR1BTIFRpbWUgaW5jbHVkZXMgd2VlayBudW1iZXIgYW5kIHRpbWUtb2Ytd2VlayAoVE9XKQorR1BTVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RPVzIzYgkJCUdQU1RPVzIzYiwKKwlncHNXZWVrCQkJCUdQU1dlZWsKK30KKworLS0gR1BTVE9XLCByYW5nZSAwLTYwNDc5OS45MiwgcmVzb2x1dGlvbiAwLjA4IHNlYywgMjMtYml0IHByZXNlbnRhdGlvbgorR1BTVE9XMjNiIDo6PSBJTlRFR0VSICgwLi43NTU5OTk5KQorCistLSBHUFMgd2VlayBudW1iZXIKK0dQU1dlZWsgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEdQU1RPV0Fzc2lzdCBjb25zaXN0cyBvZiBUTE0gbWVzc2FnZSwgQW50aS1zcG9vZiBmbGFnLCBBbGVydCBmbGFnLCBhbmQgMiByZXNlcnZlZCBiaXRzIGluIFRMTSBXb3JkCistLSBmb3IgZWFjaCB2aXNpYmxlIHNhdGVsbGl0ZS4KKy0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIEdQU1RPV0Fzc2lzdAorR1BTVE9XQXNzaXN0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMikpIE9GIEdQU1RPV0Fzc2lzdEVsZW1lbnQKKworR1BTVE9XQXNzaXN0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJdGxtV29yZAkJCQlUTE1Xb3JkLAorCWFudGlTcG9vZgkJCUFudGlTcG9vZkZsYWcsCisJYWxlcnQJCQkJQWxlcnRGbGFnLAorCXRsbVJzdmRCaXRzCQkJVExNUmVzZXJ2ZWRCaXRzCit9CisKKy0tIFRMTSBXb3JkLCAxNCBiaXRzCitUTE1Xb3JkIDo6PSBJTlRFR0VSICgwLi4xNjM4MykKKworLS0gQW50aS1TcG9vZiBmbGFnCitBbnRpU3Bvb2ZGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBBbGVydCBmbGFnCitBbGVydEZsYWcgOjo9IElOVEVHRVIgKDAuLjEpCisKKy0tIFJlc2VydmVkIGJpdHMgaW4gVExNIHdvcmQsIE1TQiBvY2N1cnMgZWFybGllciBpbiBUTE0gV29yZCB0cmFuc21pdHRlZCBieSBzYXRlbGxpdGUKK1RMTVJlc2VydmVkQml0cyA6Oj0gSU5URUdFUiAoMC4uMykKKworR1NNVGltZSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCUJTSUMsCQkJLS0gQlNJQworCWZyYW1lTnVtYmVyCQlGcmFtZU51bWJlciwKKwl0aW1lU2xvdAkJVGltZVNsb3QsCisJYml0TnVtYmVyCQlCaXROdW1iZXIKK30KKworLS0gRnJhbWUgbnVtYmVyCitGcmFtZU51bWJlciA6Oj0gSU5URUdFUiAoMC4uMjA5NzE1MSkKKworLS0gVGltZSBzbG90IG51bWJlcgorVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIEJpdCBudW1iZXIKK0JpdE51bWJlciA6Oj0gSU5URUdFUiAoMC4uMTU2KQorCisKKy0tIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBER1BTIENvcnJlY3Rpb25zIElFCitER1BTQ29ycmVjdGlvbnMgOjo9IFNFUVVFTkNFIHsKKworCWdwc1RPVwkJSU5URUdFUiAoMC4uNjA0Nzk5KSwJLS0gREdQUyByZWZlcmVuY2UgdGltZQorCXN0YXR1cwkJSU5URUdFUiAoMC4uNyksCisJLS0gTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2Ygc2F0TGlzdAorCXNhdExpc3QJCVNlcU9mU2F0RWxlbWVudCAJCit9CitTZXFPZlNhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4xNikpIE9GIFNhdEVsZW1lbnQKKworLS0gbnVtYmVyIG9mIGNvcnJlY3Rpb24gZm9yIHNhdGVsbGl0ZXMKK1NhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCisKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgZXBoZW1lcmlzCisJaW9kZSAJCQlJTlRFR0VSICgwLi4yMzkpLAorCS0tIFVzZXIgRGlmZmVyZW50aWFsIFJhbmdlIEVycm9yCisJdWRyZQkJCUlOVEVHRVIgKDAuLjMpLAkJCisKKwktLSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNjU1LjA0IC0gKzY1NS4wNCwKKwlwc2V1ZG9SYW5nZUNvcglJTlRFR0VSICgtMjA0Ny4uMjA0NyksIAkKKworCS0tIFBzZXVkbyBSYW5nZSBSYXRlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTQuMDY0IC0gKzQuMDY0LAorCXJhbmdlUmF0ZUNvcglJTlRFR0VSICgtMTI3Li4xMjcpLAorCistLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAyIAkKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMiAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMgkKKwlkZWx0YVJhbmdlUmF0ZUNvcjIJCUlOVEVHRVIgKC03Li43KSwJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMyAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMworCWRlbHRhUmFuZ2VSYXRlQ29yMwkJSU5URUdFUiAoLTcuLjcpCQkJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCit9CisKK1NhdGVsbGl0ZUlEIDo6PSBJTlRFR0VSICgwLi42MykJLS0gaWRlbnRpZmllcyBzYXRlbGxpdGUKKworLS0gTmF2aWdhdGlvbiBNb2RlbCBJRQorTmF2aWdhdGlvbk1vZGVsIDo6PSBTRVFVRU5DRSB7CisJbmF2TW9kZWxMaXN0CVNlcU9mTmF2TW9kZWxFbGVtZW50CQorfQorCistLSBuYXZpZ2F0aW9uIG1vZGVsIHNhdGVsbGl0ZSBsaXN0CitTZXFPZk5hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBOYXZNb2RlbEVsZW1lbnQKKworTmF2TW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAkJCQorCXNhdFN0YXR1cwkJU2F0U3RhdHVzCQktLSBzYXRlbGxpdGUgc3RhdHVzCit9CisKKy0tIHRoZSBTdGF0dXMgb2YgdGhlIG5hdmlnYXRpb24gbW9kZWwKK1NhdFN0YXR1cyA6Oj0gQ0hPSUNFIHsKKwktLSBOZXcgc2F0ZWxsaXRlLCBuZXcgTmF2aWdhdGlvbiBNb2RlbAorCW5ld1NhdGVsbGl0ZUFuZE1vZGVsVUMJVW5jb21wcmVzc2VkRXBoZW1lcmlzLAorCisJLS0gRXhpc3Rpbmcgc2F0ZWxsaXRlLCBFeGlzdGluZyBOYXZpZ2F0aW9uIE1vZGVsCisJb2xkU2F0ZWxsaXRlQW5kTW9kZWwJTlVMTCwKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdOYXZpTW9kZWxVQwkJCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKwkuLi4KK30KKworLS0gVW5jb21wcmVzc2VkIHNhdGVsbGl0ZSBlbWhlbWVyaXMgYW5kIGNsb2NrIGNvcnJlY3Rpb25zCitVbmNvbXByZXNzZWRFcGhlbWVyaXMgOjo9IFNFUVVFTkNFIHsKKwllcGhlbUNvZGVPbkwyCUlOVEVHRVIgKDAuLjMpLAorCWVwaGVtVVJBCQlJTlRFR0VSICgwLi4xNSksCisJZXBoZW1TVmhlYWx0aAlJTlRFR0VSICgwLi42MyksCisJZXBoZW1JT0RDCQlJTlRFR0VSCSgwLi4xMDIzKSwKKwllcGhlbUwyUGZsYWcJSU5URUdFUiAoMC4uMSksCisJZXBoZW1TRjFSc3ZkCUVwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkLAorCWVwaGVtVGdkCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtVG9jCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1BRjIJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZXBoZW1BRjEJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQUYwCQlJTlRFR0VSICgtMjA5NzE1Mi4uMjA5NzE1MSksCisJZXBoZW1DcnMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtRGVsdGFOCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU0wCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3VjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUUJCQlJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbUN1cwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1BUG93ZXJIYWxmCUlOVEVHRVIgKDAuLjQyOTQ5NjcyOTUpLAorCWVwaGVtVG9lCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1GaXRGbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtQU9EQQkJSU5URUdFUiAoMC4uMzEpLAorCWVwaGVtQ2ljCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU9tZWdhQTAJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ2lzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUkwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3JjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbVcJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1PbWVnYUFEb3QJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWVwaGVtSURvdAkJSU5URUdFUiAoLTgxOTIuLjgxOTEpCit9CisKKy0tIFJlc2VydmVkIGJpdHMgaW4gc3ViZnJhbWUgMSBvZiBuYXZpZ2F0aW9uIG1lc3NhZ2UKK0VwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkIDo6PSBTRVFVRU5DRSB7CisJcmVzZXJ2ZWQxCQlJTlRFR0VSICgwLi44Mzg4NjA3KSwJLS0gMjMtYml0IGZpZWxkCisJcmVzZXJ2ZWQyCQlJTlRFR0VSICgwLi4xNjc3NzIxNSksCS0tIDI0LWJpdCBmaWVsZAorCXJlc2VydmVkMwkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDQJCUlOVEVHRVIgKDAuLjY1NTM1KQkJLS0gMTYtYml0IGZpZWxkCit9CisKKy0tIElvbm9zcGhlcmljIE1vZGVsIElFCitJb25vc3BoZXJpY01vZGVsIDo6PSBTRVFVRU5DRSB7CisJYWxmYTAJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmExCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTMJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLSBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitVVENNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCXV0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCXV0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCXV0Y1RvdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNEZWx0YVRscwkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwl1dGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjRGVsdGFUbHNmCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gQWxtYW5hYywgTG9uZyB0ZXJtIG1vZGVsCistLSBOT1RFOiBUaGVzZSBhcmUgcGFyYW1ldGVycyBhcmUgc3Vic2V0IG9mIHRoZSBlcGhlbWVyaXMKKy0tIE5PVEU6IEJ1dCB3aXRoIHJlZHVjZWQgcmVzb2x1dGlvbiBhbmQgYWNjdXJhY3kKK0FsbWFuYWMgOjo9IFNFUVVFTkNFIHsKKwlhbGFtYW5hY1dOYQkJSU5URUdFUiAoMC4uMjU1KSwJLS0gT25jZSBwZXIgbWVzc2FnZQorCisJLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdC4KKwktLSBUaGUgc2l6ZSBvZiBhbG1hbmFjTGlzdCBpcyBhY3R1YWxseSBOdW1zX1NhdHNfVG90YWwgZmllbGQKKwlhbG1hbmFjTGlzdAkJU2VxT2ZBbG1hbmFjRWxlbWVudAkJCit9CitTZXFPZkFsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42NCkpIE9GIEFsbWFuYWNFbGVtZW50CisKKy0tIEFsbWFuYWMgaW5mbyBvbmNlIHBlciBzYXRlbGxpdGUKK0FsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCQlTYXRlbGxpdGVJRCwKKwlhbG1hbmFjRQkJCUlOVEVHRVIgKDAuLjY1NTM1KSwKKwlhbGFtYW5hY1RvYQkJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0tzaWkJCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWFsbWFuYWNTVmhlYWx0aAkJSU5URUdFUiAoMC4uMjU1KSwKKwlhbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgwLi4xNjc3NzIxNSksCisJYWxtYW5hY09tZWdhMAkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNXCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNNMAkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjQUYwCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpLAorCWFsbWFuYWNBRjEJCQlJTlRFR0VSICgtMTAyNC4uMTAyMykKK30KKworLS0gQWNxdWlzaXRpb24gQXNzaXN0YW5jZQorQWNxdWlzQXNzaXN0IDo6PSBTRVFVRU5DRSB7CisKKwktLSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIGFjcXVpc3RMaXN0CisJdGltZVJlbGF0aW9uCVRpbWVSZWxhdGlvbiwKKworCS0tIEFjcXVpc2l0aW9uIGFzc2lzdGFuY2UgbGlzdAorCS0tIFRoZSBzaXplIG9mIE51bWJlciBvZiBTYXRlbGxpdGVzIGlzIGFjdHVhbGx5IE51bWJlciBvZiBTYXRlbGxpdGVzIGZpZWxkCisJYWNxdWlzTGlzdAkJU2VxT2ZBY3F1aXNFbGVtZW50CQkKK30KK1NlcU9mQWNxdWlzRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBBY3F1aXNFbGVtZW50CisKKy0tIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBHUFMgdGltZSBhbmQgYWlyLWludGVyZmFjZSB0aW1pbmcKK1RpbWVSZWxhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCS0tCisJZ3BzVE9XCQlHUFNUT1cyM2IsCQktLSAyM2IgcHJlc2VudGF0aW9uCisJZ3NtVGltZQkJR1NNVGltZQkJT1BUSU9OQUwKK30KKworLS0gZGF0YSBvY2N1cmluZyBwZXIgbnVtYmVyIG9mIHNhdGVsbGl0ZXMKK0FjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdmlkCQkJCQlTYXRlbGxpdGVJRCwKKworCS0tIERvcHBsZXIgMHRoIG9yZGVyIHRlcm0sCisJLS0gLTUxMjAuMCAtIDUxMTcuNSBIeiAoPSAtMjA0OCAtIDIwNDcgd2l0aCAyLjUgSHogcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OC4uMjA0NyksCQorCWFkZGlvbmFsRG9wcGxlcgkJCUFkZGlvbmFsRG9wcGxlckZpZWxkcwlPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMC4uMTAyMiksCS0tIENvZGUgUGhhc2UKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwLi4xOSksCS0tIEludGVnZXIgQ29kZSBQaGFzZQorCWdwc0JpdE51bWJlcgkJCUlOVEVHRVIgKDAuLjMpLCAJLS0gR1BTIGJpdCBudW1iZXIKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMC4uMTUpLAktLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3cKKwlhZGRpb25hbEFuZ2xlCQkJQWRkaW9uYWxBbmdsZUZpZWxkcwkJT1BUSU9OQUwKK30KKworQWRkaW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTEuMCAtICswLjUgSHovc2VjCisgLS0gKD0gLTQyICsgKDAgdG8gNjMpIHdpdGggMS80MiBIei9zZWMuIHJlc29sdXRpb24pCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNykKKyAtLSBhIHNlbmRlciBzaGFsbCBub3QgZW5jb2RlIGFueSBEb3BwbGVyVW5jZXJ0YWludHkgdmFsdWUgaW4gdGhlIHJhbmdlIDUgdG8gNworIC0tIGEgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIGFueSB2YWx1ZSBiZXR3ZWVuIDUgYW5kIDcuCit9CisKK0FkZGlvbmFsQW5nbGVGaWVsZHMJOjo9IFNFUVVFTkNFIHsKKwktLSBhemltdXRoIGFuZ2xlLCAwIC0gMzQ4Ljc1IGRlZyAoPSAwIC0gMzEgd2l0aCAxMS4yNSBkZWcgcmVzb2x1dGlvbikKKwlhemltdXRoCQkJCQlJTlRFR0VSICgwLi4zMSksCisJLS0gZWxldmF0aW9uIGFuZ2xlLCAwIC0gNzguNzUgZGVnICg9IDAgLSA3IHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJZWxldmF0aW9uCQkJCUlOVEVHRVIgKDAuLjcpCit9CisKKy0tIFJlYWwtVGltZSBJbnRlZ3JpdHkKKy0tIG51bWJlciBvZiBiYWQgc2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZWxlbWVudAorU2VxT2YtQmFkU2F0ZWxsaXRlU2V0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIFNhdGVsbGl0ZUlECisKKy0tIEV4dGVuc2lvbiBFbGVtZW50cworCistLSBSZWxlYXNlIDk4IEV4dGVuc2lvbnMgaGVyZQorUmVsOTgtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLCAKKyBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCisKKy0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorUmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJcmVsOTgtRXh0LUV4cE9URAkJCVJlbDk4LUV4dC1FeHBPVEQJCU9QVElPTkFMLAktLSBFeHBlY3RlZE9URCBleHRlbnNpb24KKwkuLi4sIAorIGdwc1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gUmVsZWFzZSA5OCBFeHBPVEQgZXh0ZW5zaW9uCitSZWw5OC1FeHQtRXhwT1REIDo6PSBTRVFVRU5DRSB7CistLSBJZiBNc3JBc3Npc3RCVFMgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgbXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIHNoYWxsIGJlIGluY2x1ZGVkLgorCW1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU9QVElPTkFMLAorCistLSBJZiBTeXN0ZW1JbmZvQXNzaXN0YURhdGEgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZQorLS0gaW5jbHVkZWQuCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlTeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1RECU9QVElPTkFMCit9CisKKy0tIE1zckFzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorTXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJIG1zckFzc2lzdExpc3QtUjk4LUV4cE9URAkJCSBTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIEluZGV4ZXMgaW4gU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCByZWZlciB0byBTZXFPZk1zckFzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mTXNyQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIE1zckFzc2lzdEJUUyBJRQorTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlleHBlY3RlZE9URAkJCQlFeHBlY3RlZE9URCwKKwlleHBPVERVbmNlcnRhaW50eQkJRXhwT1REVW5jZXJ0YWludHkKK30KKworLS0gU3lzdGVtSW5mb0Fzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCXN5c3RlbUluZm9Bc3Npc3RMaXN0Ujk4LUV4cE9URCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQKK30KKworLS0gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgaW5kZXggcmVmZXIgdG8gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCistLSBJZiB0aGUgaW5kZXggZXhjZWVkcyB0aGUgU2VnT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IENIT0lDRSB7CisJbm90UHJlc2VudAkJTlVMTCwKKwlwcmVzZW50CQkJQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1RECit9CisKKy0tIFRoaXMgZWxlbWVudCBjb21wbGV0ZXMgQXNzaXN0QlRTRGF0YSBJRQorQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REdW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5CS0tIFVuY2VydGFpbnR5IG9mIGV4cGVjdGVkIE9URAorfQorCistLSBFeHBlY3RlZCBPVEQgdmFsdWUgYmV0d2VlbiBuYm9yIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworLS0gYXQgTVMncyBjdXJyZW50IGVzdGltYXRlZCBsb2NhdGlvbi4KK0V4cGVjdGVkT1REIDo6PSBJTlRFR0VSICgwLi4xMjUwKQorLS0gVGhlIEV4cGVjdGVkT1REIHZhbHVlIDEyNTAgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kCistLSBzaGFsbCBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCistLSBVbmNlcnRhaW50eSBvZiBFeHB0ZWN0ZWQgT1REIGluIGJpdHMKK0V4cE9URFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSKDAuLjcpCisKKy0tIFJlbGVhc2UgOTggZXh0ZW5zaW9ucworCitHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgOjo9IElOVEVHRVIgKDAgLi4gMTI3KSAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKK0dQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRnJhbWVNU0IgSU5URUdFUiAoMCAuLiA2MyksIC0tIE1TQiBvZiBmcmFtZSBudW1iZXIKKyBncHNUb3dTdWJtcyBJTlRFR0VSICgwIC4uIDk5OTkpIE9QVElPTkFMLCAtLSBpbiB1bml0cyBvZiAxMDBucywgZm9yIE1TIGJhc2VkIEFHUFMKKyBkZWx0YVRvdyBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsIC0tIGZvciBNUyBhc3Npc3RlZCBBR1BTCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorfQorCitSZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmlyc3QgZXh0ZW5zaW9uIHRvIFJlbGVhc2UgOTgKKwlyZWwtOTgtRXh0LU1lYXN1cmVJbmZvCVNFUVVFTkNFIHsKKwkJb3RkLU1lYXN1cmVJbmZvLVI5OC1FeHQJT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQJCU9QVElPTkFMCisJfSwKKwkuLi4sIAorIHRpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIEdQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIE9QVElPTkFMIAorIC0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBUaGlzIGlzIGFuIGFkZGl0aW9uIHRvIE9URC1NZWFzdXJlSW5mbyBlbGVtZW50IGRlZmluZWQgaW4gb3JpZ2luYWwgbWVzc2FnZSwKKy0tIElmIE9URC1NZWFzdXJlSW5mbyBpcyBhYnNlbnQsIG9yIGlmIG9uZSBvciBtb3JlIE9URC1Nc3JFbGVtZW50UmVzdCBhcmUgcHJlc2VudAorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQgc2hhbGwgYmUgYWJzZW50LgorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQKK09URC1NZWFzdXJlSW5mby1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCW90ZE1zckZpcnN0U2V0cy1SOTgtRXh0CQlPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIEV4dCBmb3IgdGhlIGZpcnN0IHNldCBvbmx5CitPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQgOjo9IFNFUVVFTkNFIHsKKwktLSBhZGRpdGlvbmFsIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycy1SOTgtRXh0IAlTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycy1SOTgtRXh0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi41KSkgT0YgT1RELUZpcnN0U2V0TXNycworCitSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwlleHRlbmRlZC1yZWZlcmVuY2UJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQyBpbiBhIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdC4gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQKKwktLSBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisKKwktLSBleHRlbnNpb24gdG8gUmVsZWFzZSA1LCBmb3IgUlJMUCBwc2V1ZG8tc2VnbWVudGF0aW9uIGhlcmUKKwlvdGQtTWVhc3VyZUluZm8tNS1FeHQJT1RELU1lYXN1cmVJbmZvLTUtRXh0CU9QVElPTkFMLAorCXVsUHNldWRvU2VnSW5kCQkJVWxQc2V1ZG9TZWdJbmQJCQlPUFRJT05BTCwJLS0gSW5jbHVkZWQgd2hlbiB1cGxpbmsgUlJMUAorCS0tIFBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZCwgbm90IGluY2x1ZGVkIHdoZW4gbm8gdXBsaW5rIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCS4uLgorCQkJCQktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKK0V4dGVuZGVkLXJlZmVyZW5jZSA6Oj0gU0VRVUVOQ0UgeworCXNtbGMtY29kZQkJCUlOVEVHRVIgKDAuLjYzKSwKKwl0cmFuc2FjdGlvbi1JRAkJSU5URUdFUiAoMC4uMjYyMTQzKQorfQorCitPVEQtTWVhc3VyZUluZm8tNS1FeHQgOjo9IFNlcU9mT1RELU1zckVsZW1lbnRSZXN0CisJLS0gaWYgbW9yZSB0aGFuIG9uZSBtZWFzdXJlbWVudCBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KSBjb21iaW5lZCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kCisJLS0gT1RELU1lYXN1cmVJbmZvIChlLmcuIGlmIE51bWJlck9mU2V0cyBpcyAzLCB0aGVuIG9uZSBvdGRNc3JSZXN0U2V0cyBtYXkKKwktLSBiZSBzZW50IGluIE9URC1NZWFzdXJlSW5mby01LUV4dCBhbmQgb25lIGluIE9URC1NZWFzdXJlSW5mbykKKworLS0gRmlyc3QgcGFydCBvZiBVcGxpbmsgUlJMUCBQc2V1ZG8tc2VnbWVudGF0aW9uIGluZGljYXRpb24sIHBvc3NpYmx5IG1vcmUgbWF5IGJlIGRlZmluZWQKKy0tIGluIHRoZSBmdXR1cmUgZm9yIHNlZ21lbnRhdGlvbiB3aXRoIG1vcmUgdGhhbiB0d28gc2VnbWVudHMuCitVbFBzZXVkb1NlZ0luZCA6Oj0gRU5VTUVSQVRFRCB7CisJZmlyc3RPZk1hbnkgKDApLAorCXNlY29uZE9mTWFueSgxKQorfQorCitSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSwKKwkuLi4KKworLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbjo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KKwktLSBXaGVuIGluY2x1ZGVkLCB0aGUgdmFsdWUgc2VudCBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLi4uCisKKwktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKKy0tIFJlbGVhc2UgNyBFeHRlbnNpb25zIGhlcmUKKworUmVsNy1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Cit2ZWxvY2l0eVJlcXVlc3RlZAkJIE5VTEwJCSBPUFRJT05BTCwKKyBnYW5zc1Bvc2l0aW9uTWV0aG9kIEdBTlNTUG9zaXRpb25pbmdNZXRob2QgT1BUSU9OQUwsCisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKK3JlcXVpcmVkUmVzcG9uc2VUaW1lCVJlcXVpcmVkUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCS4uLgorCS0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVudGlvbnMgaGVyZQorfQorCistLSBhZGRpdGlvbmFsIHNhdGVsbGl0ZSBzeXN0ZW1zIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sCitHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIDo6PSBCSVQgU1RSSU5HIHsKKwlncHMgKDApLAorCWdhbGlsZW8gKDEpfSAoU0laRSAoMi4uMTYpKQorCitHQU5TUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3MtY29udHJvbEhlYWRlcglHQU5TUy1Db250cm9sSGVhZGVyCit9CisKK0dBTlNTLUNvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0NvbW1vbkFzc2lzdERhdGEgR0FOU1NDb21tb25Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzR2VuZXJpY0Fzc2lzdERhdGFMaXN0IFNlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgQ29tbW9uIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cworR0FOU1NDb21tb25Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZlcmVuY2VUaW1lCQkgR0FOU1NSZWZlcmVuY2VUaW1lCQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZMb2NhdGlvbgkJCUdBTlNTUmVmTG9jYXRpb24JCSBPUFRJT05BTCwKKwlnYW5zc0lvbm9zcGhlcmljTW9kZWwJCUdBTlNTSW9ub3NwaGVyaWNNb2RlbAkgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIExpc3Qgb2YgR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMsIHVwIHRvIDggR0FOU1MKK1NlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi44KSkgT0YgR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQKKworLS0gR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NJRCBJTlRFR0VSICgwLi43KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZU1vZGVsIFNlcU9mR0FOU1NUaW1lTW9kZWwgT1BUSU9OQUwsCisJZ2Fuc3NEaWZmQ29ycmVjdGlvbnMJCSBHQU5TU0RpZmZDb3JyZWN0aW9ucwkgT1BUSU9OQUwsCisJZ2Fuc3NOYXZpZ2F0aW9uTW9kZWwJCSBHQU5TU05hdk1vZGVsIE9QVElPTkFMLAorCWdhbnNzUmVhbFRpbWVJbnRlZ3JpdHkJIEdBTlNTUmVhbFRpbWVJbnRlZ3JpdHkJIE9QVElPTkFMLAorCWdhbnNzRGF0YUJpdEFzc2lzdAkJCSBHQU5TU0RhdGFCaXRBc3Npc3QJCSBPUFRJT05BTCwKKwlnYW5zc1JlZk1lYXN1cmVtZW50QXNzaXN0CSBHQU5TU1JlZk1lYXN1cmVtZW50QXNzaXN0IE9QVElPTkFMLAorIGdhbnNzQWxtYW5hY01vZGVsIEdBTlNTQWxtYW5hY01vZGVsIE9QVElPTkFMLAorIGdhbnNzVVRDTW9kZWwgR0FOU1NVVENNb2RlbCBPUFRJT05BTCwKKwkuLi4KK30KKworLS0gR0FOU1MgQ09NTU9OIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBSZWZlcmVuY2UgVGltZSBJRQorR0FOU1NSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZUaW1lSW5mbwkJCSBHQU5TU1JlZlRpbWVJbmZvLAorCWdhbnNzVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiBHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gT1BUSU9OQUwKK30KKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgaW5jbHVkZXMgR0FOU1MgVE9ELCBHQU5TUyBEYXksIHVuY2VydGFpbnR5CitHQU5TU1JlZlRpbWVJbmZvIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NEYXkJCQkgSU5URUdFUigwIC4uIDgxOTEpIE9QVElPTkFMLAorIGdhbnNzVE9EIEdBTlNTVE9ELAorCWdhbnNzVE9EVW5jZXJ0YWludHkJIEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsCisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiA3KSBPUFRJT05BTAorfQorCistLSBHQU5TUyBUT0QgaW50ZWdlciBzZWNvbmRzCitHQU5TU1RPRCA6Oj0gSU5URUdFUiAoMCAuLiA4NjM5OSkKKworLS0gR0FOU1MgVE9EIHVuY2VydGFpbnR5CitHQU5TU1RPRFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBUT0QtR1NNIFRpbWUgYXNzb2NpYXRpb24gCitHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyLAorIGZyYW1lRHJpZnQgRnJhbWVEcmlmdCBPUFRJT05BTAorfQorCistLSBGcmFtZSBkcmlmdAorRnJhbWVEcmlmdCA6Oj0gSU5URUdFUigtNjQgLi4gNjMpCisKKy0tIEdBTlNTIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorR0FOU1NSZWZMb2NhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCXRocmVlRExvY2F0aW9uCQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKKy0tIEdBTlNTIElvbm9zcGhlcmljIE1vZGVsIElFCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBjb25zaXN0cyBvZiBOZVF1aWNrIG1vZGVsIHBhcmFtZXRlcnMgYW5kIHN0b3JtIGZsYWdzCisKK0dBTlNTSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSW9ub01vZGVsIEdBTlNTSW9ub3NwaGVyZU1vZGVsLAorIGdhbnNzSW9ub1N0b3JtRmxhZ3MgR0FOU1NJb25vU3Rvcm1GbGFncyBPUFRJT05BTCwKKyAuLi4KK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBtb2RlbC4gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leCAKK0dBTlNTSW9ub3NwaGVyZU1vZGVsIDo6PSBTRVFVRU5DRSB7CisgYWkwIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkxIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkyIElOVEVHRVIgKDAgLi4gNDA5NSkKK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBzdG9ybSBmbGFncworR0FOU1NJb25vU3Rvcm1GbGFncyA6Oj0gU0VRVUVOQ0UgeworCWlvbm9TdG9ybUZsYWcxCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzIJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnMwlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc0CUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzUJSU5URUdFUiAoMCAuLiAxKQorfQorCistLSBHQU5TUyBHRU5FUklDIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBUaW1lIE1vZGVsIElFIGNvbnNpc3RzIG9mIHRpbWUgb2Zmc2V0IGFuZCBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIHBhcmFtZXRlcnMgdG8gcmVsYXRlIEdOU1MKKy0tIHNwZWNpZmljIHN5c3RlbSB0aW1lIHRvIHNlbGVjdGVkIHRpbWUgcmVmZXJlbmNlCitTZXFPZkdBTlNTVGltZU1vZGVsIDo6PSBTRVFVRU5DRSAoU0laRSgxLi43KSkgT0YgR0FOU1NUaW1lTW9kZWxFbGVtZW50CisKK0dBTlNTVGltZU1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzVGltZU1vZGVsUmVmVGltZQkJSU5URUdFUigwIC4uIDY1NTM1KSwKKwl0QTAJCSBUQTAsCisJdEExCQkgVEExIE9QVElPTkFMLAorCXRBMgkJIFRBMiBPUFRJT05BTCwKKyBnbnNzVE9JRCBJTlRFR0VSICgwIC4uIDcpLAorIHdlZWtOdW1iZXIgSU5URUdFUiAoMCAuLiA4MTkxKSBPUFRJT05BTCAKK30KKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTAKK1RBMCA6Oj0gSU5URUdFUiAoLTIxNDc0ODM2NDggLi4gMjE0NzQ4MzY0NykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTEKK1RBMSA6Oj0gSU5URUdFUiAoLTgzODg2MDggLi4gODM4ODYwNykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTIKK1RBMiA6Oj0gSU5URUdFUiAoLTY0IC4uIDYzKQorCistLSBER0FOU1MgQ29ycmVjdGlvbnMgSUUKK0dBTlNTRGlmZkNvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisJZGdhbnNzUmVmVGltZQkJSU5URUdFUiAoMCAuLiAxMTkpLAkgLS0gREdBTlNTIHJlZmVyZW5jZSB0aW1lCisKKwktLSBOX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNnblR5cGVMaXN0CisJc2duVHlwZUxpc3QJCSBTZXFPZlNnblR5cGVFbGVtZW50Cit9CisKK1NlcU9mU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4zKSkgT0YgU2duVHlwZUVsZW1lbnQgLS0gbWF4IHRocmVlIHNpZ25hbHMgcGVyIEdOU1MKKworLS0gREdBTlNTIHNpZ25hbCB0eXBlIGVsZW1lbnQsIG9uY2UgcGVyIEdOU1Mgc2lnbmFsIHR5cGUgaW5jbHVkZWQgaW4gREdBTlNTCitTZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzU2lnbmFsSUQJCSBHQU5TU1NpZ25hbElEIE9QVElPTkFMLCAtLSBzaWduYWwgdHlwZSBpZGVudGl0eQorIGdhbnNzU3RhdHVzSGVhbHRoIElOVEVHRVIgKDAgLi4gNyksCisJLS0gTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZGdhbnNzU2duTGlzdAorIGRnYW5zc1Nnbkxpc3QgU2VxT2ZER0FOU1NTZ25FbGVtZW50Cit9CisKK0dBTlNTU2lnbmFsSUQgOjo9IElOVEVHRVIgKDAgLi4gMykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorU2VxT2ZER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBER0FOU1NTZ25FbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzaWduYWxzCitER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZJRAkJIFNWSUQsIC0tIFNhdGVsbGl0ZSBpZGVudGl0eQorCistLS0gU2VxdWVuY2UgbnVtYmVyIGZvciBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIHRoYXQgbWF0Y2hlcyB0aGUgREdBTlNTIGNvcnJlY3Rpb24gc2V0CisJaW9kIAkJCUlOVEVHRVIgKDAgLi4gMTAyMyksCisKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KQorfQorCitTVklEIDo6PSBJTlRFR0VSICgwIC4uIDYzKQktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKKy0tIEdBTlNTIE5hdmlnYXRpb24gTW9kZWwgSUUKK0dBTlNTTmF2TW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBub25Ccm9hZGNhc3RJbmRGbGFnIElOVEVHRVIgKDAgLi4gMSksCisgdG9lTVNCIElOVEVHRVIgKDAgLi4gMzEpIE9QVElPTkFMLCAtLSA1IE1TQiBvZiB0b2UgYW5kIHRvYyAKKyBlTVNCIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKyBzcXJ0QU1CUyBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCwKKwlnYW5zc1NhdGVsbGl0ZUxpc3QgU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQKK30KKworU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgR0FOU1NTYXRlbGxpdGVFbGVtZW50CisKK0dBTlNTU2F0ZWxsaXRlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQgU1ZJRCwKKyBzdkhlYWx0aCBJTlRFR0VSICgtNyAuLiAxMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBpb2QgSU5URUdFUiAoMCAuLiAxMDIzKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzQ2xvY2tNb2RlbCBHQU5TU0Nsb2NrTW9kZWwsIAorIGdhbnNzT3JiaXRNb2RlbCBHQU5TU09yYml0TW9kZWwsIAorIC4uLgorfQorCistLSBHQU5TUyBvcmJpdCBtb2RlbCBmb3IgdGhlIEdOU1Mgc2F0ZWxsaXRlIGFjY29yZGluZyB0byB0aGUgY2hvaWNlCitHQU5TU09yYml0TW9kZWwgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuU2V0CSBOYXZNb2RlbC1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBOYXZpZ2F0aW9uIG1vZGVsIGluIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitOYXZNb2RlbC1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyBrZXBsZXJUb2VMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIGFyZSBnaXZlbiBpbiBHQU5TU05hdmlnYXRpb25Nb2RlbAorCWtlcGxlclcJCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckRlbHRhTgkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyTTAJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyT21lZ2FEb3QJIElOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlrZXBsZXJFTFNCIAkgSU5URUdFUiAoMC4uMzM1NTQ0MzEpLAorCWtlcGxlcklEb3QJCSBJTlRFR0VSICgtODE5Mi4uODE5MSksCisJa2VwbGVyQVBvd2VySGFsZkxTQiBJTlRFR0VSICgwLi4gNjcxMDg4NjMpLAorCWtlcGxlckkwCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhMCBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyQ3JzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2lzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3JjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2ljCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NykKK30KKworLS0gR0FOU1MgY2xvY2sgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NDbG9ja01vZGVsIDo6PSBDSE9JQ0UgeworCXN0YW5kYXJkQ2xvY2tNb2RlbExpc3QJIFNlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCwJCisgLi4uCit9CisKK1NlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIFN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQKKworU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN0YW5DbG9ja1RvY0xTQiBJTlRFR0VSICgwIC4uIDUxMSksIC0tIDlMU0Igb2YgdGltZSBvZiBjbG9jaworIHN0YW5DbG9ja0FGMiBJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwgCisgc3RhbkNsb2NrQUYxIElOVEVHRVIgKC0xMzEwNzIgLi4gMTMxMDcxKSwgCisgc3RhbkNsb2NrQUYwIElOVEVHRVIgKC0xMzQyMTc3MjggLi4gMTM0MjE3NzI3KSwKKyBzdGFuQ2xvY2tUZ2QgSU5URUdFUiAoLTUxMiAuLiA1MTEpIE9QVElPTkFMLAorIHN0YW5Nb2RlbElEIElOVEVHRVIgKDAgLi4gMSkgT1BUSU9OQUwsCisgLi4uCit9IAorCistLSBHQU5TUyBSZWFsLVRpbWUgSW50ZWdyaXR5IElFCitHQU5TU1JlYWxUaW1lSW50ZWdyaXR5IDo6PSBTRVFVRU5DRSB7CisgLS0gbGlzdCBvZiBiYWQgc2lnbmFscworIC0tIE5CUyBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBTZXFPZi1CYWRTaWduYWxTZXQKKyBnYW5zc0JhZFNpZ25hbExpc3QgU2VxT2ZCYWRTaWduYWxFbGVtZW50Cit9CisKK1NlcU9mQmFkU2lnbmFsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBCYWRTaWduYWxFbGVtZW50CisKK0JhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBiYWRTVklEIFNWSUQsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBiYWRTaWduYWxJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK30KKworCistLSBHQU5TUyBEYXRhIEJpdCBBc3Npc3RhbmNlIElFCitHQU5TU0RhdGFCaXRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1RPRCBJTlRFR0VSICgwIC4uIDU5KSwKKyBzdklEIFNWSUQsCisgZ2Fuc3NEYXRhVHlwZUlEIElOVEVHRVIgKDAgLi4gMiksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyAtLSBsaXN0IG9mIG5hdmlnYXRpb24gZGF0YSBiaXRzCisgLS0gTl9CSVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtRGF0YUJpdHMKKyBnYW5zc0RhdGFCaXRzIFNlcU9mLUdBTlNTRGF0YUJpdHMKK30KKworU2VxT2YtR0FOU1NEYXRhQml0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAxMDI0KSkgT0YgR0FOU1NEYXRhQml0CitHQU5TU0RhdGFCaXQgOjo9IElOVEVHRVIoMCAuLiAxKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTWVhc3VyZW1lbnQgQXNzaXN0YW5jZSBJRQorLS0gQ29kZSBhbmQgRG9wcGxlciBhc3Npc3RhbmNlIGZyb20gdGhlIG5ldHdvcmsuIAorR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzUmVmTWVhc0Fzc2l0TGlzdCBTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTYpKSBPRiBHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorCitHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC0xMDI0IG0vcyB0byAxMDIzLjUgbS9zIHdpdGggMC41IG0vcyByZXNvbHV0aW9uKQorCWRvcHBsZXIwCQkJCUlOVEVHRVIgKC0yMDQ4IC4uIDIwNDcpLAktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJYWRkaXRpb25hbERvcHBsZXIJCUFkZGl0aW9uYWxEb3BwbGVyRmllbGRzCSBPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMCAuLiAxMDIyKSwJIC0tIENvZGUgUGhhc2UgaW4gbXMKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwIC4uIDEyNyksCSAtLSBJbnRlZ2VyIENvZGUgUGhhc2UgaW4gbXMKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMCAuLiAzMSksCSAtLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3csIHNlZSBBbm5leAorCWFkZGl0aW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCSBPUFRJT05BTCwKKyAuLi4KK30KKworQWRkaXRpb25hbERvcHBsZXJGaWVsZHMgOjo9IFNFUVVFTkNFIHsKKwktLSBEb3BwbGVyIDFzdCBvcmRlciB0ZXJtLCAtMC4yIC0gKzAuMSBtL3MyCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNCkKK30KKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCBJRQorR0FOU1NBbG1hbmFjTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gMjU1KSwKKyBzdklETWFzayBTVklETUFTSywKKyB0b2EgSU5URUdFUiAoMCAuLiAyNTUpIE9QVElPTkFMLAorIGlvZGEgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNMaXN0IFNlcU9mR0FOU1NBbG1hbmFjRWxlbWVudAorfQorCistLSBTViBJRCBNYXNrLCBMU0IgZm9yIElEIDEgYW5kIE1TQiBmb3IgSUQgMzYKK1NWSURNQVNLIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4zNikpCisKK1NlcU9mR0FOU1NBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAzNikpIE9GIEdBTlNTQWxtYW5hY0VsZW1lbnQKKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCAKK0dBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuQWxtYW5hY1NldAkgQWxtYW5hYy1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBBbG1hbmFjIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitBbG1hbmFjLUtlcGxlcmlhblNldCA6Oj0gU0VRVUVOQ0UgeworIAlrZXBBbG1hbmFjRQkJCSBJTlRFR0VSICgwIC4uIDIwNDcpLAorCWtlcEFsbWFuYWNEZWx0YUkJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorCWtlcEFsbWFuYWNPbWVnYURvdAkJSU5URUdFUiAoLTEwMjQgLi4gMTAyMyksCisga2VwU1ZIZWFsdGggSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlrZXBBbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgtNjU1MzYgLi4gNjU1MzUpLAorCWtlcEFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY1cJCQkgSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjTTAJCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNBRjAJCQlJTlRFR0VSICgtODE5MiAuLiA4MTkxKSwKKwlrZXBBbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEdBTlNTIFVuaXZlcnNhbCBUaW1lIENvb3JkaW5hdGUgTW9kZWwKK0dBTlNTVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1V0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWdhbnNzVXRjQTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZ2Fuc3NVdGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCWdhbnNzVXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0RlbHRhVGxzCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0ROCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlnYW5zc1V0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tUmVxdWlyZWQgTWVhc3VyZW1lbnQgUmVxdWVzdCBSZXNwb25zZSBUaW1lLCByYW5nZSBpcyAxIHRvIDEyOCBzZWNvbmRzLiAKK1JlcXVpcmVkUmVzcG9uc2VUaW1lIDo6PSBJTlRFR0VSICAoMS4uMTI4KQorCitSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwl2ZWxFc3RpbWF0ZSAJVmVsb2NpdHlFc3RpbWF0ZSBPUFRJT05BTCwKKyAtLSBIb3Jpem9udGFsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorIGdhbnNzTG9jYXRpb25JbmZvIEdBTlNTTG9jYXRpb25JbmZvIE9QVElPTkFMLAorIGdhbnNzTWVhc3VyZUluZm8gR0FOU1NNZWFzdXJlSW5mbyBPUFRJT05BTCwKKwkuLi4KKy0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBHQU5TUyBMb2NhdGlvbiBJbmZvcm1hdGlvbiBjb250YWlucyBsb2NhdGlvbiBlc3RpbWF0ZSwgdGltZSBzdGFtcCB3aXRoIHVuY2VydGFpbnR5IAorLS0gYW5kIG9wdGlvbmFsbHkgUmVmZXJlbmNlIEZyYW1lIGZpZWxkCitHQU5TU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR05TUyBUT0QgbW9kdWxvCisgZ2Fuc3NUT0RGcmFjIElOVEVHRVIgKDAgLi4gMTYzODQpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJZ2Fuc3NUT0RVbmNlcnRhaW50eSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWZpeFR5cGUJCQkgRml4VHlwZSwKKyBwb3NEYXRhIFBvc2l0aW9uRGF0YSwKKyBzdGF0aW9uYXJ5SW5kaWNhdGlvbiBJTlRFR0VSKDAgLi4gMSkgT1BUSU9OQUwsIC0tICcwJyBpZiBtb3Zpbmcgb3IgbW90aW9uIG5vdCBrbm93biAKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKyAuLi4KK30KKworUG9zaXRpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKyBlLW90ZCgwKSwKKwlncHMgKDEpLAorCWdhbGlsZW8gKDIpIH0gKFNJWkUgKDMuLjE2KSkKKworCistLSBHQU5TUyBUT0QgbW9kdWxvIDEgaG91cgorR0FOU1NUT0RtIDo6PSBJTlRFR0VSICgwIC4uIDM1OTk5OTkpCisKK1JlZmVyZW5jZUZyYW1lIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRk4gSU5URUdFUiAoMCAuLiA2NTUzNSksCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZmVyZW5jZUZOIGlzIDAgLSA0MjQzMQorIHJlZmVyZW5jZUZOTVNCIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMIC0tIE1TQiBvZiBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCit9CisKKworCistLSBHQU5TUyBNZWFzdXJlbWVudCBJbmZvcm1hdGlvbiAKK0dBTlNTTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorIGdhbnNzTXNyU2V0TGlzdCBTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQKK30KK1NlcU9mR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIEdBTlNTLU1zclNldEVsZW1lbnQKKworLS0gR0FOU1MgbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gMS0zIHRpbWVzIGluIGEgbWVzc2FnZQorR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR0FOU1MgVE9EIG1vZHVsbworIGRlbHRhR05BU1NUT0QgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisKKyAtLU5fU0dOX1RZUEUgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudAorIGdhbnNzLVNnblR5cGVMaXN0IFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byA2IGRpZmZlcmVudCBzaWduYWwgdHlwZXMgCitTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42KSkgT0YgR0FOU1MtU2duVHlwZUVsZW1lbnQKKworR0FOU1MtU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQlJTlRFR0VSICgwIC4uIDE1KSwgLS0gQ29kaW5nIGFjY3JvZGluZyB0byBBbm5leAorIC0tTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25FbGVtZW50CisgZ2Fuc3MtU2duTGlzdCBTZXFPZkdBTlNTLVNnbkVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byAxNiBwZXIgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEdBTlNTLVNnbkVsZW1lbnQKKworCitHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7Cisgc3ZJRCBTVklELAorIGNObyBJTlRFR0VSICgwIC4uIDYzKSwKKyBtcGF0aERldCBNcGF0aEluZGljLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgY2FycmllclF1YWxpdHlJbmQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNvZGVQaGFzZSBJTlRFR0VSICgwIC4uIDIwOTcxNTEpLAorIGludGVnZXJDb2RlUGhhc2UgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisgY29kZVBoYXNlUk1TRXJyb3IgSU5URUdFUiAoMC4uNjMpLCAtLSBDb2RpbmcgYWNjb3JpbmcgdG8gQW5uZXgKKyBkb3BwbGVyIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NykgT1BUSU9OQUwsCisgYWRyIElOVEVHRVIgKDAgLi4gMzM1NTQ0MzEpIE9QVElPTkFMCit9CisKK1JlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKwkuLi4KKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA3IGhlcmUKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpAQCAtMCwwICsxLDM4IEBACistLSBSUkxQLU1lc3NhZ2VzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gMy4xIEdlbmVyYWwgRm9ybWF0IG9mIFJSTFAgTWVzc2FnZQorLS0KKworUlJMUC1NZXNzYWdlcworLS0geyBSUkxQLW1lc3NhZ2VzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlNc3JQb3NpdGlvbi1SZXEsIE1zclBvc2l0aW9uLVJzcCwgQXNzaXN0YW5jZURhdGEsCisJUHJvdG9jb2xFcnJvcgorRlJPTQorCVJSTFAtQ29tcG9uZW50cyAJLS0geyBSUkxQLUNvbXBvbmVudHMgfQorOworCitQRFUgOjo9IFNFUVVFTkNFIHsKKwlyZWZlcmVuY2VOdW1iZXIJCQlJTlRFR0VSICgwLi43KSwKKwljb21wb25lbnQJCQkJUlJMUC1Db21wb25lbnQKK30KKworUlJMUC1Db21wb25lbnQgOjo9IENIT0lDRSB7CisJbXNyUG9zaXRpb25SZXEJCQlNc3JQb3NpdGlvbi1SZXEsCisJbXNyUG9zaXRpb25Sc3AJCQlNc3JQb3NpdGlvbi1Sc3AsCisJYXNzaXN0YW5jZURhdGEJCQlBc3Npc3RhbmNlRGF0YSwKKwlhc3Npc3RhbmNlRGF0YUFjawkJTlVMTCwKKwlwcm90b2NvbEVycm9yCQkJUHJvdG9jb2xFcnJvciwKKwkuLi4KKworfQorCitFTkQKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvcGF0Y2gtcnJscC1jb21wb25lbnRzLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTU1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCkBAIC0wLDAgKzEsMzYgQEAKKy0tLSBSUkxQLUNvbXBvbmVudHMuYXNuCTIwMDktMTAtMjYgMjI6MTA6NDQuMDAwMDAwMDAwICswMTAwCisrKysgUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorQEAgLTE4LDE2ICsxOCwxNiBAQAorIAlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKKyBGUk9NCisgCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjUgKDUpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKyAKKyAJRXh0ZW5zaW9uQ29udGFpbmVyCisgRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uNCAoNCl9CisrCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisrCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisgOworIAorIC0tIEFkZCBoZXJlIG90aGVyIEFTTi4xIGRlZmluaXRpb25zIHByZXNlbnRlZCBiZWxvdworIC0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisgCitAQCAtMzA1LDExICszMDUsMTEgQEAKKyBTeXN0ZW1JbmZvSW5kZXggOjo9IElOVEVHRVIgKDEuLjMyKQorIAorIENlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworLQlyZWZlcmVuY2VMQUMJTEFDLAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKysJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKyAJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5CisgfQorIENlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCistTEFDIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKytMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisgCisgLS0gT1RELU1lYXN1cmVJbmZvCisgT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzIyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpAQCAtMCwwICsxLDU2IEBACitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwkod29ya2luZyBjb3B5KQorQEAgLTIyLDcgKzIyLDcgQEAKKyAJIkVOVU1FUkFURUQiLAkJCS8qIFRoZSBBU04uMSB0eXBlIGlzIHN0aWxsIEVOVU1FUkFURUQgKi8KKyAJIkVOVU1FUkFURUQiLAorIAlOYXRpdmVJbnRlZ2VyX2ZyZWUsCistCU5hdGl2ZUludGVnZXJfcHJpbnQsCisrCU5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQsCisgCWFzbl9nZW5lcmljX25vX2NvbnN0cmFpbnQsCisgCU5hdGl2ZUludGVnZXJfZGVjb2RlX2JlciwKKyAJTmF0aXZlSW50ZWdlcl9lbmNvZGVfZGVyLAorQEAgLTIwNSwzICsyMDUsMzAgQEAKKyAJX0FTTl9FTkNPREVEX09LKGVyKTsKKyB9CisgCisraW50CisrTmF0aXZlRW51bWVyYXRlZF9wcmludChhc25fVFlQRV9kZXNjcmlwdG9yX3QgKnRkLCBjb25zdCB2b2lkICpzcHRyLCBpbnQgaWxldmVsLAorKwlhc25fYXBwX2NvbnN1bWVfYnl0ZXNfZiAqY2IsIHZvaWQgKmFwcF9rZXkpIHsKKysJYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKnNwZWNzPShhc25fSU5URUdFUl9zcGVjaWZpY3NfdCAqKXRkLT5zcGVjaWZpY3M7CisrCWNvbnN0IGxvbmcgKm5hdGl2ZSA9IChjb25zdCBsb25nICopc3B0cjsKKysJY2hhciBzY3JhdGNoWzI1Nl07CisrCWludCByZXQ7CisrCisrCSh2b2lkKXRkOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysJKHZvaWQpaWxldmVsOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysKKysJaWYobmF0aXZlKSB7CisrCQljb25zdCBhc25fSU5URUdFUl9lbnVtX21hcF90ICptYXAgPSBJTlRFR0VSX21hcF92YWx1ZTJlbnVtKHNwZWNzLCAqbmF0aXZlKTsKKysJCWlmIChtYXAgJiYgbWFwLT5lbnVtX2xlbiAmJiBtYXAtPmVudW1fbmFtZSkgeworKwkJCXJldCA9IHNucHJpbnRmKHNjcmF0Y2gsIHNpemVvZihzY3JhdGNoKSwKKysJCQkJIiVzIiwgbWFwLT5lbnVtX25hbWUpOworKwkJfSBlbHNlIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCShzcGVjcyAmJiBzcGVjcy0+ZmllbGRfdW5zaWduZWQpCisrCQkJCT8gIiVsdSIgOiAiJWxkIiwgKm5hdGl2ZSk7CisrCQl9CisrCQlhc3NlcnQocmV0ID4gMCAmJiAoc2l6ZV90KXJldCA8IHNpemVvZihzY3JhdGNoKSk7CisrCQlyZXR1cm4gKGNiKHNjcmF0Y2gsIHJldCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfSBlbHNlIHsKKysJCXJldHVybiAoY2IoIjxhYnNlbnQ+IiwgOCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfQorK30KK0luZGV4OiBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkocmV2aXNpb24gMTQwNykKKysrKyBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCSh3b3JraW5nIGNvcHkpCitAQCAtMjQsNiArMjQsNyBAQAorIHhlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV94ZXI7CisgcGVyX3R5cGVfZGVjb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZGVjb2RlX3VwZXI7CisgcGVyX3R5cGVfZW5jb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZW5jb2RlX3VwZXI7CisrYXNuX3N0cnVjdF9wcmludF9mIE5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQ7CisgCisgI2lmZGVmIF9fY3BsdXNwbHVzCisgfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWMyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAxX2ZpeF9wZXJfZW5jb2RpbmdfZGlldGVyLmRpZmYKQEAgLTAsMCArMSwxNyBAQAorSW5kZXg6IHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHdvcmtpbmcgY29weSkKK0BAIC0zMzYsNyArMzM2LDEyIEBACisgCQlidWZbM10gPSBiaXRzOworIAllbHNlIHsKKyAJCUFTTl9ERUJVRygiLT5bUEVSIG91dCBzcGxpdCAlZF0iLCBvYml0cyk7CisrI2lmIDEgLy8gRGlldGVyCisrCQlwby0+bmJvZmYgLT0gb2JpdHM7IC8vIHVuZG8gaW5jcmVtZW50YXRpb24gZnJvbSBhIGZldyBsaW5lcyBhYm92ZQorKwkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cyA+PiAob2JpdHMgLSAyNCksIDI0KTsgLy8gc2hpZnQgYWNjb3JkaW5nIHRvIHRoZSByZXN0IG9mIHRoZSBiaXRzIAorKyNlbHNlCQkKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gOCwgMjQpOworKyNlbmRpZgorIAkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cywgb2JpdHMgLSAyNCk7CisgCQlBU05fREVCVUcoIjwtW1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworIAl9CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieCBiL3JybHAtZXBoZW1lcmlzL2RhdGEudWJ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2RkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjlmNDNjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworREVWPSQxCitPVVRGPSQyCisKKyMgQ2hhbmdlIG1vZGUKK2VjaG8gLWVuICJcJFBVQlgsNDEsMSwwMDAxLDAwMDEsOTYwMCwwKjE0XHJcbiIgPiAke0RFVn0KKworIyBXYWl0IGEgbGl0dGxlCitzbGVlcCAyCisKKyMgU3RhcnQgZHVtcAorZWNobyAtZW4gIlx4YjVceDYyXHgwMVx4MDJceDAwXHgwMFx4MDNceDBhIiB8IFwKKwlzb2NhdCAtdDUgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+ICR7T1VURn0KK2VjaG8gLWVuICJceGI1XHg2Mlx4MGJceDEwXHgwMFx4MDBceDFiXHg1YyIgfCBcCisJc29jYXQgLXQxMCAke0RFVn0sYjk2MDAscmF3LGNsb2NhbD0xLGVjaG89MCAtID4+ICR7T1VURn0KKwpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gQ09QWUlORwpjb3B5IHRvIHJybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dCBiL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTllZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApAQCAtMCwwICsxLDY3NCBAQAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgorc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAordG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KK3NoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQorc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KK2FueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Cit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKK2NlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoreW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQorb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKK2tub3cgdGhlaXIgcmlnaHRzLgorCisgIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKygxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgorCisgIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAorYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcworY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgorCisgIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgorY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKK3Byb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCitwYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwordXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCitoYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKK3Byb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCitzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgorCisgIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitTdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKK3NvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCithdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKK21ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0CitwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworICAgICAgICAgICAgICAgICAgICAgICBURVJNUyBBTkQgQ09ORElUSU9OUworCisgIDAuIERlZmluaXRpb25zLgorCisgICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgICJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzIG9mCit3b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgorCisgICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCisicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCisKKyAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCitleGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKK2VhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgorCisgIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0CitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCitpbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKK2NvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQorcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgorCisgIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKK3BhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAorYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KKworICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKK3RvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKK2ZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQordGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKK2V4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKK3dvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCit0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQorbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KKworICAxLiBTb3VyY2UgQ29kZS4KKworICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQorZm9ybSBvZiBhIHdvcmsuCisKKyAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKK3N0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKK2ludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0CitpcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KKworICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Cisoa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCisoaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bworcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCisKKyAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQord29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bworY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCitTeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCitwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKK3doaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKK3RoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQorbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQorc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKK2NhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZworU291cmNlLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAorc2FtZSB3b3JrLgorCisgIDIuIEJhc2ljIFBlcm1pc3Npb25zLgorCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCisgIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCitpbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCitvZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCitub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCithbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKK3lvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCisKKyAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKK3RoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAorbWFrZXMgaXQgdW5uZWNlc3NhcnkuCisKKyAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KKworICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKK21lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCitzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCittZWFzdXJlcy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KK2lzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KK3RoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCit1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKK3RlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCisKKyAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KKworICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKK3JlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKK25vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCityZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCithbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgorCisgIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCisgICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgorCisgICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCisgICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KKworICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCisgICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAorICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCisKKyAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQorICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCisgICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCisKKyAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yaworaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisKKyAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKK29mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQorbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAoraW4gb25lIG9mIHRoZXNlIHdheXM6CisKKyAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCisgICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKKyAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCisgICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCisgICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCisgICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCisgICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCisKKyAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQorICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCisgICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKKyAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCisKKyAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAorICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCisgICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KKyAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKKyAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KKyAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgorCisgICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAorICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCisgICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubworICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgorCisgIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KKworICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQordGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKK29yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KK2ludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKK2RvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgorcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCit0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKK29mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCithY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKK2lzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCitjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAordGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCisKKyAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAorcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCithbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCithIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKK3N1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Citjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQorbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCisKKyAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKK3NwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCitwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKK2ZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5CitpZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAorbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcworYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KKworICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKK2ZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCit0aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCituZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAorYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCitwcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgorCisgIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAoraW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQorZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KK3NvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgordW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCisKKyAgNy4gQWRkaXRpb25hbCBUZXJtcy4KKworICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgorQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAordGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKK2FwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKK3VuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKK3RoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCityZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKK2l0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KK3JlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQorYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAorZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQorYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgordGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6CisKKyAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKKyAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgorCisgICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAorICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCisKKyAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCisgICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KKyAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCisKKyAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCisgICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCisKKyAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCisgICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCisKKyAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CisgICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKKyAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCisgICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgorICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KKworICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgorcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKK2dvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgorcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucworYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCitMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKK29mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KKworICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91CittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKK2FkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZword2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KKworICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQorZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKK3RoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KKworICA4LiBUZXJtaW5hdGlvbi4KKworICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKK3Byb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgordGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAorcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgorCisgIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCitsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKK3Byb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKK2ZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKK2hvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCitwcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCisKKyAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKK3Zpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKK3JlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoreW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCisKKyAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKK2xpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQorbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KKworICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbworbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisgIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KKworICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CityZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKK2ZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgorCisgIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KK29yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KK29yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworICAxMS4gUGF0ZW50cy4KKworICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKKyAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCitvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCitoZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKK2J5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKK2J1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCitjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50CitwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKK3RoaXMgTGljZW5zZS4KKworICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCittYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCisKKyAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKK2FncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAorKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bworc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKK3BhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCitwYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCisKKyAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKK2FuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCitwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAordGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbworYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQorcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQorYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCitjb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCitpbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKK2NvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCisKKyAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgorYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQorY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCityZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKK29yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKK3lvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCit3b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KKworICBBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4KK3RoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzCitjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKK3NwZWNpZmljYWxseSBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQKK3dvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzCitpbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50Cit0byB0aGUgdGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZwordGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlCitwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKK3BhdGVudCBsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2NvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5Citmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdAorY29udGFpbiB0aGUgY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LAorb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KKworICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCithbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQorb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgorCisgIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgorCisgIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCitjb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Citub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKK3RvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQordGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCitMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCisKKyAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCB5b3UgaGF2ZQorcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZAordW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQorY29tYmluZWQgd29yaywgYW5kIHRvIGNvbnZleSB0aGUgcmVzdWx0aW5nIHdvcmsuICBUaGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCitidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCitzZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBhcyBzdWNoLgorCisgIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KKworICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQorUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlCitvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZAordmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQordmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKK3B1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UKK3RvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgorCisgIExhdGVyIGxpY2Vuc2UgdmVyc2lvbnMgbWF5IGdpdmUgeW91IGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50CitwZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55CithdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCitsYXRlciB2ZXJzaW9uLgorCisgIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgorCisgIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKK0FQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKK0hPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KK0lTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgorQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KKworICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMKK1RIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCitVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCitEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRAorUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksCitFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRVMuCisKKyAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KKworICBJZiB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBhbmQgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgcHJvdmlkZWQKK2Fib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLAorcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCithbiBhYnNvbHV0ZSB3YWl2ZXIgb2YgYWxsIGNpdmlsIGxpYWJpbGl0eSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCitQcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhCitjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCisgIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKK25vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCittaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCisKKyAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKK2lmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCit0aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAorPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5jIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNTc0OAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogZ3BzLmMKKyAqCisgKiBBIGZldyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImdwcy5oIgorCisKKyNkZWZpbmUgR0VUX0ZJRUxEX1UodywgbmIsIHBvcykgKCgodykgPj4gKHBvcykpICYgKCgxPDwobmIpKS0xKSkKKyNkZWZpbmUgR0VUX0ZJRUxEX1ModywgbmIsIHBvcykgKCgoaW50KSgodykgPDwgKDMyLShuYiktKHBvcykpKSkgPj4gKDMyLShuYikpKQorCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgMSwyLDMgcGF5bG9hZHMgKDMgKiA4IHdvcmRzKQorICoKKyAqIE5vdGU6IGVwaC0+c3ZfaWQgaXMgbm90IGZpbGxlZCBoZXJlIHNpbmNlIG5vdCBwcmVzZW50IGluIHRob3NlIHN1YmZyYW1lcworICoKKyAqIChubyBwYXJpdHkgYml0IGNoZWNraW5nIGlzIGRvbmUsIG9ubHkgdGhlIGxvd2VyIDI0IGJpdHMgb2YgZWFjaCB3b3JkCisgKiAgYXJlIHVzZWQpCisgKi8KK2ludAorZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpCit7CisJdWludDMyX3QgKnNmMSA9ICZzZlswXTsKKwl1aW50MzJfdCAqc2YyID0gJnNmWzhdOworCXVpbnQzMl90ICpzZjMgPSAmc2ZbMTZdOworCisJaW50IGlvZGUxLCBpb2RlMjsKKworCWVwaC0+d2Vla19ubwk9IEdFVF9GSUVMRF9VKHNmMVswXSwgMTAsIDE0KTsKKwllcGgtPmNvZGVfb25fbDIJPSBHRVRfRklFTERfVShzZjFbMF0sICAyLCAxMik7CisJZXBoLT5zdl91cmEJPSBHRVRfRklFTERfVShzZjFbMF0sICA0LCAgOCk7CisJZXBoLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZjFbMF0sICA2LCAgMik7CisJZXBoLT5sMl9wX2ZsYWcJPSBHRVRfRklFTERfVShzZjFbMV0sICAxLCAyMyk7CisJZXBoLT50X2dkCT0gR0VUX0ZJRUxEX1Moc2YxWzRdLCAgOCwgIDApOworCWVwaC0+aW9kYwk9IChHRVRfRklFTERfVShzZjFbMF0sICAyLCAgMCkgPDwgOCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMVs1XSwgIDgsIDE2KTsKKwllcGgtPnRfb2MJPSBHRVRfRklFTERfVShzZjFbNV0sIDE2LCAgMCk7CisJZXBoLT5hX2YyCT0gR0VUX0ZJRUxEX1Moc2YxWzZdLCAgOCwgMTYpOworCWVwaC0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgMTYsICAwKTsKKwllcGgtPmFfZjAJPSBHRVRfRklFTERfUyhzZjFbN10sIDIyLCAgMik7CisKKwlpb2RlMQkJPSBHRVRfRklFTERfVShzZjJbMF0sICA4LCAxNik7CisJZXBoLT5jX3JzCT0gR0VUX0ZJRUxEX1Moc2YyWzBdLCAxNiwgIDApOworCWVwaC0+ZGVsdGFfbgk9IEdFVF9GSUVMRF9TKHNmMlsxXSwgMTYsICA4KTsKKwllcGgtPm1fMAk9IChHRVRfRklFTERfUyhzZjJbMV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbMl0sIDI0LCAgMCk7CisJZXBoLT5jX3VjCT0gR0VUX0ZJRUxEX1Moc2YyWzNdLCAxNiwgIDgpOworCWVwaC0+ZQkJPSAoR0VUX0ZJRUxEX1Uoc2YyWzNdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzRdLCAyNCwgIDApOworCWVwaC0+Y191cwk9IEdFVF9GSUVMRF9TKHNmMls1XSwgMTYsICA4KTsKKwllcGgtPmFfcG93aGFsZgk9IChHRVRfRklFTERfVShzZjJbNV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbNl0sIDI0LCAgMCk7CisJZXBoLT50X29lCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAxNiwgIDgpOworCWVwaC0+Zml0X2ZsYWcJPSBHRVRfRklFTERfVShzZjJbN10sICAxLCAgNyk7CisKKwllcGgtPmNfaWMJPSBHRVRfRklFTERfUyhzZjNbMF0sIDE2LCAgOCk7CisJZXBoLT5vbWVnYV8wCT0gKEdFVF9GSUVMRF9TKHNmM1swXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1sxXSwgMjQsICAwKTsKKwllcGgtPmNfaXMJPSBHRVRfRklFTERfUyhzZjNbMl0sIDE2LCAgOCk7CisJZXBoLT5pXzAJPSAoR0VUX0ZJRUxEX1Moc2YzWzJdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YzWzNdLCAyNCwgIDApOworCWVwaC0+Y19yYwk9IEdFVF9GSUVMRF9TKHNmM1s0XSwgMTYsICA4KTsKKwllcGgtPncJCT0gKEdFVF9GSUVMRF9TKHNmM1s0XSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1s1XSwgMjQsICAwKTsKKwllcGgtPm9tZWdhX2RvdAk9IEdFVF9GSUVMRF9TKHNmM1s2XSwgMjQsICAwKTsKKwlpb2RlMgkJPSBHRVRfRklFTERfVShzZjNbN10sICA4LCAxNik7CisJZXBoLT5pZG90CT0gR0VUX0ZJRUxEX1Moc2YzWzddLCAxNCwgIDIpOworCisJZXBoLT5fcnN2ZDEJPSBHRVRfRklFTERfVShzZjFbMV0sIDIzLCAgMCk7CisJZXBoLT5fcnN2ZDIJPSBHRVRfRklFTERfVShzZjFbMl0sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDMJPSBHRVRfRklFTERfVShzZjFbM10sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDQJPSBHRVRfRklFTERfVShzZjFbNF0sIDE2LCAgOCk7CisJZXBoLT5hb2RvCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgNSwgIDIpOworCisJLyogQ2hlY2sgJiBjcm9zcy12YWxpZGF0ZSBpb2RjWzc6MF0sIGlvZGUxLCBpb2RlMiAqLworCWlmICgoaW9kZTEgIT0gaW9kZTIpIHx8IChpb2RlMSAhPSAoZXBoLT5pb2RjICYgMHhmZikpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgNCBvciA1IEFsbWFuYWMgcGFnZXMgcGF5bG9hZCAoOCB3b3JkcykKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pCit7CisJYWxtLT5zdl9pZCAgICAgID0gR0VUX0ZJRUxEX1Uoc2ZbMF0sICA2LCAxNik7CisKKwlhbG0tPmUJCT0gR0VUX0ZJRUxEX1Uoc2ZbMF0sIDE2LCAgMCk7CisJYWxtLT50X29hCT0gR0VUX0ZJRUxEX1Uoc2ZbMV0sICA4LCAxNik7CisJYWxtLT5rc2lpCT0gR0VUX0ZJRUxEX1Moc2ZbMV0sIDE2LCAgMCk7CisJYWxtLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZlsyXSwgMTYsICA4KTsKKwlhbG0tPnN2X2hlYWx0aAk9IEdFVF9GSUVMRF9VKHNmWzJdLCAgOCwgIDApOworCWFsbS0+YV9wb3doYWxmCT0gR0VUX0ZJRUxEX1Uoc2ZbM10sIDI0LCAgMCk7CisJYWxtLT5vbWVnYV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNF0sIDI0LCAgMCk7CisJYWxtLT53CQk9IEdFVF9GSUVMRF9TKHNmWzVdLCAyNCwgIDApOworCWFsbS0+bV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNl0sIDI0LCAgMCk7CisJYWxtLT5hX2YwCT0gKEdFVF9GSUVMRF9TKHNmWzddLCA4LCAxNikgPDwgMykgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmWzddLCAzLCAgMik7CisJYWxtLT5hX2YxCT0gR0VUX0ZJRUxEX1Moc2ZbN10sIDExLCAgNSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BzLmggYi9ycmxwLWVwaGVtZXJpcy9ncHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFiOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBncHMuaAorICoKKyAqIEhlYWRlciB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0dQU19IX18KKyNkZWZpbmUgX19HUFNfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKyNkZWZpbmUgTUFYX1NWCTY0CisKKworLyogSW9ub3NwZXJpYyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhbHBoYV8wOwkvKiBzIDggICAgICAgMl4tMzAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYWxwaGFfMTsJLyogcyA4ICAgICAgIDJeLTI3ICAgICAgICAgICAgICAgICBzIC8gc2VtaS1jaXJjbGVzICovCisJaW50IGFscGhhXzI7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYWxwaGFfMzsJLyogcyA4ICAgICAgIDJeLTI0ICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworCWludCBiZXRhXzA7CS8qIHMgOCAgICAgICAyXjExICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBiZXRhXzE7CS8qIHMgOCAgICAgICAyXjE0ICAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBiZXRhXzI7CS8qIHMgOCAgICAgICAyXjE2ICAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYmV0YV8zOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4zICovCit9OworCisKKy8qIFVUQyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCB7CisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGEwOwkJLyogcyAzMiAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGExOwkJLyogcyAyNCAgICAgIDJeLTUwICAgICAgICAgICAgICAgICBzZWNvbmRzIC8gc2Vjb25kcyAqLworCWludCBkZWx0YV90X2xzOwkvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgdF9vdDsJLyogdSAgOCAgICAgIDJeMTIgICAgICAgNjAyLDExMiAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHduX3Q7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCB3bl9sc2Y7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCBkbjsJCS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgIDcgICAgZGF5cyAgICAgICAgICAgICAqLworCWludCBkZWx0YV90X2xzZjsvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KK307CisKKworLyogQWxtYW5hY2ggZGF0YSAqLworc3RydWN0IGdwc19hbG1hbmFjX3N2IHsKKwlpbnQgc3ZfaWQ7CisJaW50IHN2X2hlYWx0aDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBlOwkJLyogdSAxNiAgICAgIDJeLTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IHRfb2E7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBrc2lpOwkvKiBzIDE2ICAgICAgMl4tMTkgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgb21lZ2FfZG90OwkvKiBzIDE2ICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKwlpbnQgYV9wb3doYWxmOwkvKiB1IDI0ICAgICAgMl4tMTEgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IHc7CQkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgbV8wOwkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAxMSAgICAgIDJeLTIwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTEgICAgICAyXi0zOCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KK307CisKK3N0cnVjdCBncHNfYWxtYW5hYyB7CisJaW50IHduYTsKKwlpbnQgbl9zdjsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIEVwaGVtZXJpcyBkYXRhICovCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiB7CisJaW50IHN2X2lkOworCisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGNvZGVfb25fbDI7CS8qIHUgIDIgICAgICAxICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB3ZWVrX25vOwkvKiB1IDEwICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWsgICAgICAgICAgICAgKi8KKwlpbnQgbDJfcF9mbGFnOwkvKiB1ICAxICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfdXJhOwkvKiB1ICA0ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfaGVhbHRoOwkvKiB1ICA2ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9nZDsJLyogcyAgOCAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGlvZGM7CS8qIHUgMTAgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB0X29jOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYV9mMjsJLyogcyAgOCAgICAgIDJeLTU1ICAgICAgICAgICAgICAgICBzZWMgLyBzZWNeMiAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VjIC8gc2VjICAgICAgICAqLworCWludCBhX2YwOwkvKiBzIDIyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKworCWludCBjX3JzOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfbjsJLyogcyAxNiAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IG1fMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfdWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBlOwkvKiB1IDMyICAgICAgMl4tMzMgICAgICAwLjAzICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgY191czsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGFfcG93aGFsZjsgLyogdSAzMiAgMl4tMTkgICAgICAgICAgICAgbWV0ZXJzXigxLzIpICAgICAqLworCWludCB0X29lOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgZml0X2ZsYWc7CS8qIHUgIDEgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCisJaW50IGNfaWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBvbWVnYV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgY19pczsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJaW50IGlfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfcmM7CS8qIHMgMTYgICAgICAyXi01ICAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLworCWludCB3OwkJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAyNCAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGlkb3Q7CS8qIHMgMTQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCisJaW50IF9yc3ZkMTsJLyogMjMgYml0cyAqLworCWludCBfcnN2ZDI7CS8qIDI0IGJpdHMgKi8KKwlpbnQgX3JzdmQzOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkNDsJLyogMTYgYml0cyAqLworCWludCBhb2RvOwkvKiA4IGJpdHMgIE5vdCBzdXJlIGl0IG5lZWRzIHRvIGJlIGhlcmUgLi4uICovCit9OworCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpcyB7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIFJlZmVyZW5jZSBwb3NpdGlvbiAqLworc3RydWN0IGdwc19yZWZfcG9zIHsJLyogV1NHODQgZWxsaXBzb2lkICovCisJZG91YmxlIGxhdGl0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgbG9uZ2l0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgYWx0aXR1ZGU7CS8qIG0gYWJvdmUgZWxsaXBzb2lkICovCit9OworCisKKy8qIFJlZmVyZW5jZSB0aW1lICovCitzdHJ1Y3QgZ3BzX3JlZl90aW1lIHsKKwlpbnQgd247CQkJLyogR1BTIHdlZWsgbnVtYmVyICovCisJZG91YmxlIHRvdzsJCS8qIGluIHNlY29uZHMgKi8KK307CisKKworLyogQWxsIGFzc2lzdCBkYXRhICovCisjZGVmaW5lIEdQU19GSUVMRF9JT05PU1BIRVJFCSgxPDwwKQorI2RlZmluZSBHUFNfRklFTERfVVRDCQkoMTw8MSkKKyNkZWZpbmUgR1BTX0ZJRUxEX0FMTUFOQUMJKDE8PDIpCisjZGVmaW5lIEdQU19GSUVMRF9FUEhFTUVSSVMJKDE8PDMpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZQT1MJKDE8PDQpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZUSU1FCSgxPDw1KQorCitzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIHsKKwlpbnQgZmllbGRzOworCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbAlpb25vc3BoZXJlOworCXN0cnVjdCBncHNfdXRjX21vZGVsCQl1dGM7CisJc3RydWN0IGdwc19hbG1hbmFjCQlhbG1hbmFjOworCXN0cnVjdCBncHNfZXBoZW1lcmlzCQllcGhlbWVyaXM7CisJc3RydWN0IGdwc19yZWZfcG9zCQlyZWZfcG9zOworCXN0cnVjdCBncHNfcmVmX3RpbWUJCXJlZl90aW1lOworfTsKKworCisvKiBHUFMgU3ViZnJhbWUgdXRpbGl0eSBtZXRob2RzIChzZWUgZ3BzLmMgZm9yIGRldGFpbHMpICovCitpbnQgZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpOworaW50IGdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dQU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvbWFpbi5jIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDI1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9tYWluLmMKQEAgLTAsMCArMSw5OSBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJ1YnguaCIKKyNpbmNsdWRlICJ1YngtcGFyc2UuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKK3N0YXRpYyBpbnQKK2RvX3VieF9yZWFkKHN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHJ2LCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl2b2lkICpidWY7CisKKwkvKiBMb2FkIGZpbGUgKi8KKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlydiA9IGZzdGF0KGZkLCAmc3QpOworCWlmIChydiA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJYnVmID0gbWFsbG9jKHN0LnN0X3NpemUpOworCWlmICghYnVmKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJ2ID0gcmVhZChmZCwgYnVmLCBzdC5zdF9zaXplKTsKKwlpZiAocnYgIT0gc3Quc3Rfc2l6ZSkgeworCQlmcmVlKGJ1Zik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFBhcnNlIGVhY2ggbWVzc2FnZSAqLworCWZvciAoaT0wOyBpPHN0LnN0X3NpemU7KSB7CisJCWludCBydjsKKwkJcnYgPSB1YnhfbXNnX2Rpc3BhdGNoKHVieF9wYXJzZV9kdCwgYnVmICsgaSwgc3Quc3Rfc2l6ZSAtIGksIGdwcyk7CisJCWlmIChydiA8IDApCisJCQlpKys7CS8qIEludmFsaWQgbWVzc2FnZTogdHJ5IG9uZSBieXRlIGxhdGVyICovCisJCWVsc2UKKwkJCWkgKz0gcnY7CisJfQorCisJLyogRG9uZSAqLworCWZyZWUoYnVmKTsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fcnJscChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMpCit7CisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSBhcjsKKwl2b2lkICpwZHVzWzY0XTsKKwlpbnQgbGVuWzY0XTsKKwlpbnQgaSwgcnY7CisKKwljaGFyICp0ZXN0ID0gIlx4MjhceDAwXHg4MFx4MTBceDAxXHgzMlx4MDBceDE5XHg0Rlx4MDdceDE1XHgwNCI7CisKKwlycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoJmFyLCB0ZXN0LCAxMik7CisJcHJpbnRmKCIlMDh4ICUwMTZsbHhcbiIsIGFyLnJlcV9lbGVtcywgKGxvbmcgbG9uZyB1bnNpZ25lZCkgYXIuZXBoX3N2cyk7CisKKwlhci5yZXFfZWxlbXMgPSAtMTsKKwlhci5lcGhfc3ZzID0gLTFMTDsKKwlydiA9IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKGdwcywgJmFyLCBwZHVzLCBsZW4sIDY0KTsKKwlwcmludGYoIiVkXG4iLCBydik7CisJZm9yIChpPTA7IGk8cnY7IGkrKykgeworCQlwcmludGYoIiVwICVkXG4iLCBwZHVzW2ldLCBsZW5baV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIGdwczsKKwlpbnQgcnY7CisKKwltZW1zZXQoJmdwcywgMHgwMCwgc2l6ZW9mKGdwcykpOworCisJcnYgPSBkb191YnhfcmVhZCgmZ3BzLCAiZGF0YS51YngiKTsKKwkKKwlydiA9IGRvX3JybHAoJmdwcyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvcnJscC5jIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGMzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBycmxwLmMKKyAqCisgKiBSUkxQIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKKyNpbmNsdWRlIDxQRFUuaD4KKyNpbmNsdWRlIDxHUFMtQXNzaXN0RGF0YS5oPgorI2luY2x1ZGUgPE5hdmlnYXRpb25Nb2RlbC5oPgorI2luY2x1ZGUgPElvbm9zcGhlcmljTW9kZWwuaD4KKyNpbmNsdWRlIDxVVENNb2RlbC5oPgorI2luY2x1ZGUgPEFsbWFuYWMuaD4KKyNpbmNsdWRlIDxSZWZMb2NhdGlvbi5oPgorI2luY2x1ZGUgPFJlZmVyZW5jZVRpbWUuaD4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSByZXF1ZXN0IGRlY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisvKiBEZWNvZGUgYW5kIHZhbGlkYXRlIHRoZSBhc3Npc3RhbmNlIGRhdGEgcmVxdWVzdCBtZXNzYWdlcy4KKyAqIFNlZSBzZWN0aW9uIDEwLjEwIG9mCisgKiAgLiBFVFNJIFRTIDE0OSAwMzEgVjguMS4wICgyMDA5LTAxKQorICogIC4gM0dQUCBUUyA0OS4wMzEgdmVyc2lvbiA4LjEuMCBSZWxlYXNlIDgKKyAqLworCisvKiBQYWNrZWQgc3RydWN0dXJlIGZyb20gNDkuMDMxIHNwZWMgKFJHQSA9IFJlcXVlc3QgR1BTIEFzc2lzdGFuY2UpICovCisKKyNkZWZpbmUgUlJMUF9SR0EwX0FMTUFOQUMJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMF9VVENfTU9ERUwJKDE8PDEpCisjZGVmaW5lIFJSTFBfUkdBMF9JT05PX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX1JHQTBfTkFWX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX1JHQTBfREdQUwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfUkdBMF9SRUZfTE9DCSgxPDw1KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX1RJTUUJKDE8PDYpCisjZGVmaW5lIFJSTFBfUkdBMF9BQ1FfQVNTSVNUCSgxPDw3KQorCisjZGVmaW5lIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMV9FUEhfRVhUCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSwkoMTw8MikKKworc3RydWN0IHJybHBfcmdhX2hkciB7CisJdWludDhfdCBpdGVtczA7CisJdWludDhfdCBpdGVtczE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2IHsKKwl1aW50OF90IHN2X2lkOwkJLyogWzc6Nl0gcmVzZXJ2ZWQsIFs1OjBdIHN2X2lkICovCisJdWludDhfdCBpb2RlOwkJLyogbGF0ZXN0IGVwaCBpbiB0aGUgTVMgbWVtb3J5IGluIGhvdXJzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoIHsKKwl1aW50OF90IHduX2hpOwkJLyogWzc6Nl0gPSB3bls5OjhdICovCisJdWludDhfdCB3bl9sbzsJCS8qIHduWzc6MF0gKi8KKwl1aW50OF90IHRvZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworCXVpbnQ4X3QgbnNhdF90bXRvZTsJLyogWzc6NF0gbnN0YXQsIFszOjBdIFQtVG9lIGxpbWl0ICovCisJc3RydWN0IHJybHBfcmdhX2VwaF9zdiBzdnNbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCB7CisJdWludDhfdCB2YWxpZGl0eTsJLyogaW4gNCBob3VycyB1bml0cyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgeworCQkvKiB3ZWVrcyBhcmUgaW4gZ3BzIHdlZWsgbW9kdWxvIDQgKi8KKwl1aW50OF90IHduX2JlZ2luX2VuZDsJLyogWzc6NF0gYmVnaW4sIFszOjBdIGVuZCAqLworCXVpbnQ4X3QgdG93X2JlZ2luOworCXVpbnQ4X3QgdG93X2VuZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGFyc2luZyBmdW5jdGlvbiAqLworCitpbnQKK3JybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdCgKKwlzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKQoreworCXN0cnVjdCBycmxwX3JnYV9oZHIgKmhkciA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaCAqZXBoID0gTlVMTDsKKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCAqZXBoX2V4dCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgKmVwaF9leHRfY2hlY2sgPSBOVUxMOworCWludCBwID0gMDsKKworCS8qIFJlc2V0ICovCisJYXItPnJlcV9lbGVtcyA9IDA7CisJYXItPmVwaF9zdnMgPSAwOworCisJLyogUGFyc2UgbWVzc2FnZSAqLworCWhkciA9IHJlcTsKKwlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfaGRyKTsKKwlpZiAocCA+IHJlcV9sZW4pCisJCXJldHVybiAtMTsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9OQVZfTU9ERUwpIHsKKwkJZXBoID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwkJcCArPSAoZXBoLT5uc2F0X3RtdG9lID4+IDQpICogc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfc3YpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX0VQSF9FWFQpIHsKKwkJZXBoX2V4dCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfZXh0KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUX0NIRUNLKSB7CisJCWVwaF9leHRfY2hlY2sgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dF9jaGVjayk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocCAhPSByZXFfbGVuKQorCQlyZXR1cm4gLTI7IC8qIG5vdCBhbGwgYnl0ZXMgY29uc3VtZWQgPz8/ICovCisKKwkvKiBQcmludCBhIHdhcm5pbmcgZm9yIHVuc3VwcG9ydGVkIHJlcXVlc3RzICovCisJaWYgKChlcGhfZXh0ICE9IE5VTEwpIHx8CisJICAgIChlcGhfZXh0X2NoZWNrICE9IE5VTEwpIHx8CisJICAgIChoZHItPml0ZW1zMCAmIChSUkxQX1JHQTBfREdQUyB8IFJSTFBfUkdBMF9BQ1FfQVNTSVNUKSkgfHwKKwkgICAgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX1JFQUxUSU1FX0lOVCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbd10gVW5zdXBwb3J0ZWQgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3RlZCwgaWdub3JlZCAuLi5cbiIpOworCX0KKworCS8qIENvcHkgdGhlIHJlcXVlc3QgKi8KKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfQUxNQU5BQykKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0FMTUFOQUM7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfVVRDX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfVVRDX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0lPTk9fTU9ERUwpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9JT05PX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9MT0MpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9SRUZfTE9DOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9USU1FKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX1RJTUU7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWludCBpLCBuX3N2cyA9IGVwaC0+bnNhdF90bXRvZSA+PiA0OworCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfRVBIRU1FUklTOworCQlmb3IgKGk9MDsgaTxuX3N2czsgaSsrKQorCQkJYXItPmVwaF9zdnMgfD0gKDFVTEwgPDwgKGVwaC0+c3ZzW2ldLnN2X2lkIC0gMSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgZWxlbWVudHMgZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKKwkvKiBIZWxwZXJzICovCisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2xhdGl0dWRlKGRvdWJsZSBsYXQsIHVpbnQ4X3QgKmIpCit7CisJdWludDMyX3QgeDsKKwl4ID0gKHVpbnQzMl90KSBmbG9vcihmYWJzKGxhdC85MC4wKSAqICgoZG91YmxlKSgxPDwyMykpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gKDE8PDIzKSAtIDE7CisJaWYgKGxhdCA8IDAuMCkKKwkJeCB8PSAoMTw8MjMpOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZG91YmxlIGxvbiwgdWludDhfdCAqYikKK3sKKwlpbnQzMl90IHg7CisJeCA9IGZsb29yKChsb24vMzYwLjApICogKChkb3VibGUpKDE8PDI0KSkpOworCWlmICh4ID49ICgxPDwyMykpCisJCXggPSAweDAwN2ZmZmZmOworCWVsc2UgaWYgKHggPCAtKDE8PDIzKSkKKwkJeCA9IDB4MDA4MDAwMDA7CisJYlswXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisJYlsxXSA9ICh4ID4+ICA4KSAmIDB4ZmY7CisJYlsyXSA9ICB4ICAgICAgICAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2FsdGl0dWRlKGRvdWJsZSBhbHQsIHVpbnQ4X3QgKmIpCit7CisJaW50IGFsdF9pID0gKGludClmYWJzKGFsdCk7CisJYlswXSA9ICgoYWx0X2kgPj4gOCkgJiAweDdmKSB8IChhbHQ8MC4wID8gMHg4MCA6IDB4MDApOworCWJbMV0gPSBhbHRfaSAmIDB4ZmY7Cit9CisKKworCS8qIEZpbGwgbWV0aG9kcyAqLworCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQoCisJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqcnJscF9ubWUsCisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmdwc19lcGhfc3YpCit7CisJc3RydWN0IFVuY29tcHJlc3NlZEVwaGVtZXJpcyAqcnJscF9lcGg7CisKKwlycmxwX25tZS0+c2F0U3RhdHVzLnByZXNlbnQgPSBTYXRTdGF0dXNfUFJfbmV3U2F0ZWxsaXRlQW5kTW9kZWxVQzsKKwlycmxwX25tZS0+c2F0ZWxsaXRlSUQgPSBncHNfZXBoX3N2LT5zdl9pZDsKKworCXJybHBfZXBoID0gJnJybHBfbm1lLT5zYXRTdGF0dXMuY2hvaWNlLm5ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisKKwlycmxwX2VwaC0+ZXBoZW1Db2RlT25MMiAgID0gZ3BzX2VwaF9zdi0+Y29kZV9vbl9sMjsKKwlycmxwX2VwaC0+ZXBoZW1VUkEgICAgICAgID0gZ3BzX2VwaF9zdi0+c3ZfdXJhOworCXJybHBfZXBoLT5lcGhlbVNWaGVhbHRoICAgPSBncHNfZXBoX3N2LT5zdl9oZWFsdGg7CisJcnJscF9lcGgtPmVwaGVtSU9EQyAgICAgICA9IGdwc19lcGhfc3YtPmlvZGM7CisJcnJscF9lcGgtPmVwaGVtTDJQZmxhZyAgICA9IGdwc19lcGhfc3YtPmwyX3BfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1UZ2QgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9nZDsKKwlycmxwX2VwaC0+ZXBoZW1Ub2MgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9vYzsKKwlycmxwX2VwaC0+ZXBoZW1BRjIgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMjsKKwlycmxwX2VwaC0+ZXBoZW1BRjEgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMTsKKwlycmxwX2VwaC0+ZXBoZW1BRjAgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMDsKKwlycmxwX2VwaC0+ZXBoZW1DcnMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19yczsKKwlycmxwX2VwaC0+ZXBoZW1EZWx0YU4gICAgID0gZ3BzX2VwaF9zdi0+ZGVsdGFfbjsKKwlycmxwX2VwaC0+ZXBoZW1NMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+bV8wOworCXJybHBfZXBoLT5lcGhlbUN1YyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VjOworCXJybHBfZXBoLT5lcGhlbUUgICAgICAgICAgPSBncHNfZXBoX3N2LT5lOworCXJybHBfZXBoLT5lcGhlbUN1cyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VzOworCXJybHBfZXBoLT5lcGhlbUFQb3dlckhhbGYgPSBncHNfZXBoX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9lcGgtPmVwaGVtVG9lICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2U7CisJcnJscF9lcGgtPmVwaGVtRml0RmxhZyAgICA9IGdwc19lcGhfc3YtPmZpdF9mbGFnOworCXJybHBfZXBoLT5lcGhlbUFPREEgICAgICAgPSBncHNfZXBoX3N2LT5hb2RvOworCXJybHBfZXBoLT5lcGhlbUNpYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2ljOworCXJybHBfZXBoLT5lcGhlbU9tZWdhQTAgICAgPSBncHNfZXBoX3N2LT5vbWVnYV8wOworCXJybHBfZXBoLT5lcGhlbUNpcyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2lzOworCXJybHBfZXBoLT5lcGhlbUkwICAgICAgICAgPSBncHNfZXBoX3N2LT5pXzA7CisJcnJscF9lcGgtPmVwaGVtQ3JjICAgICAgICA9IGdwc19lcGhfc3YtPmNfcmM7CisJcnJscF9lcGgtPmVwaGVtVyAgICAgICAgICA9IGdwc19lcGhfc3YtPnc7CisJcnJscF9lcGgtPmVwaGVtT21lZ2FBRG90ICA9IGdwc19lcGhfc3YtPm9tZWdhX2RvdDsKKwlycmxwX2VwaC0+ZXBoZW1JRG90ICAgICAgID0gZ3BzX2VwaF9zdi0+aWRvdDsKKworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQxID0gZ3BzX2VwaF9zdi0+X3JzdmQxOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQyID0gZ3BzX2VwaF9zdi0+X3JzdmQyOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQzID0gZ3BzX2VwaF9zdi0+X3JzdmQzOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQ0ID0gZ3BzX2VwaF9zdi0+X3JzdmQ0OworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9hbG1hbmFjX2VsZW1lbnQoCisJc3RydWN0IEFsbWFuYWNFbGVtZW50ICpycmxwX2FlLAorCXN0cnVjdCBncHNfYWxtYW5hY19zdiAqZ3BzX2FsbV9zdikKK3sKKwlycmxwX2FlLT5zYXRlbGxpdGVJRCA9IGdwc19hbG1fc3YtPnN2X2lkOworCisJcnJscF9hZS0+YWxtYW5hY0UgICAgICAgICAgPSBncHNfYWxtX3N2LT5lOworCXJybHBfYWUtPmFsYW1hbmFjVG9hICAgICAgID0gZ3BzX2FsbV9zdi0+dF9vYTsKKwlycmxwX2FlLT5hbG1hbmFjS3NpaSAgICAgICA9IGdwc19hbG1fc3YtPmtzaWk7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhRG90ICAgPSBncHNfYWxtX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9hZS0+YWxtYW5hY1NWaGVhbHRoICAgPSBncHNfYWxtX3N2LT5zdl9oZWFsdGg7CisJcnJscF9hZS0+YWxtYW5hY0FQb3dlckhhbGYgPSBncHNfYWxtX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhMCAgICAgPSBncHNfYWxtX3N2LT5vbWVnYV8wOworCXJybHBfYWUtPmFsbWFuYWNXICAgICAgICAgID0gZ3BzX2FsbV9zdi0+dzsKKwlycmxwX2FlLT5hbG1hbmFjTTAgICAgICAgICA9IGdwc19hbG1fc3YtPm1fMDsKKwlycmxwX2FlLT5hbG1hbmFjQUYwICAgICAgICA9IGdwc19hbG1fc3YtPmFfZjA7CisJcnJscF9hZS0+YWxtYW5hY0FGMSAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YxOworCit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm8sCisJc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsICpncHNfaW9ubykKK3sKKwlycmxwX2lvbm8tPmFsZmEwID0gZ3BzX2lvbm8tPmFscGhhXzA7CisJcnJscF9pb25vLT5hbGZhMSA9IGdwc19pb25vLT5hbHBoYV8xOworCXJybHBfaW9uby0+YWxmYTIgPSBncHNfaW9uby0+YWxwaGFfMjsKKwlycmxwX2lvbm8tPmFsZmEzID0gZ3BzX2lvbm8tPmFscGhhXzM7CisJcnJscF9pb25vLT5iZXRhMCA9IGdwc19pb25vLT5iZXRhXzA7CisJcnJscF9pb25vLT5iZXRhMSA9IGdwc19pb25vLT5iZXRhXzE7CisJcnJscF9pb25vLT5iZXRhMiA9IGdwc19pb25vLT5iZXRhXzI7CisJcnJscF9pb25vLT5iZXRhMyA9IGdwc19pb25vLT5iZXRhXzM7Cit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX3V0Y19tb2RlbCgKKwlzdHJ1Y3QgVVRDTW9kZWwgKnJybHBfdXRjLAorCXN0cnVjdCBncHNfdXRjX21vZGVsICpncHNfdXRjKQoreworCXJybHBfdXRjLT51dGNBMSAgICAgICAgPSBncHNfdXRjLT5hMTsKKwlycmxwX3V0Yy0+dXRjQTAgICAgICAgID0gZ3BzX3V0Yy0+YTA7CisJcnJscF91dGMtPnV0Y1RvdCAgICAgICA9IGdwc191dGMtPnRfb3Q7CisJcnJscF91dGMtPnV0Y1dOdCAgICAgICA9IGdwc191dGMtPnduX3QgJiAweGZmOworCXJybHBfdXRjLT51dGNEZWx0YVRscyAgPSBncHNfdXRjLT5kZWx0YV90X2xzOworCXJybHBfdXRjLT51dGNXTmxzZiAgICAgPSBncHNfdXRjLT53bl9sc2YgJiAweGZmOworCXJybHBfdXRjLT51dGNETiAgICAgICAgPSBncHNfdXRjLT5kbjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHNmID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sc2Y7Cit9CisKKy8qIH19fSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlJMUCBBc3Npc3RhbmNlIFBEVSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS17e3sgKi8KKworc3RydWN0IFBEVSAqCitfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoaW50IHJlZm51bSwgc3RydWN0IEdQU19Bc3Npc3REYXRhICoqb19ncHNfYWQpCit7CisJc3RydWN0IFBEVSAqcGR1OworCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqZ3BzX2FkOworCisJcGR1ID0gY2FsbG9jKDEsIHNpemVvZigqcGR1KSk7CisJaWYgKCFwZHUpCisJCXJldHVybiBOVUxMOworCisJZ3BzX2FkID0gY2FsbG9jKDEsIHNpemVvZigqZ3BzX2FkKSk7CisJaWYgKCFncHNfYWQpIHsKKwkJZnJlZShwZHUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAob19ncHNfYWQpCisJCSpvX2dwc19hZCA9IGdwc19hZDsKKworCXBkdS0+cmVmZXJlbmNlTnVtYmVyID0gcmVmbnVtOworCXBkdS0+Y29tcG9uZW50LnByZXNlbnQgPSBSUkxQX0NvbXBvbmVudF9QUl9hc3Npc3RhbmNlRGF0YTsKKwlwZHUtPmNvbXBvbmVudC5jaG9pY2UuYXNzaXN0YW5jZURhdGEuZ3BzX0Fzc2lzdERhdGEgPSBncHNfYWQ7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IElvbm9zcGhlcmljTW9kZWwgKnJybHBfaW9ubzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0lPTk9TUEhFUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfaW9ubyA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfaW9ubykpOworCWlmICghcnJscF9pb25vKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5pb25vc3BoZXJpY01vZGVsID0gcnJscF9pb25vOworCisJX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbChycmxwX2lvbm8sICZncHNfYWQtPmlvbm9zcGhlcmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF91dGNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1VUQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF91dGMgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3V0YykpOworCWlmICghcnJscF91dGMpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnV0Y01vZGVsID0gcnJscF91dGM7CisKKwlfcnJscF9maWxsX3V0Y19tb2RlbChycmxwX3V0YywgJmdwc19hZC0+dXRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZMb2NhdGlvbiAqcnJscF9yZWZsb2M7CisJdWludDhfdCAqYjsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlBPUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9yZWZsb2MgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZmxvYykpOworCWlmICghcnJscF9yZWZsb2MpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnJlZkxvY2F0aW9uID0gcnJscF9yZWZsb2M7CisKKwliID0gbWFsbG9jKDkpOworCisJYlswXSA9IDB4ODA7IC8qIEVsbGlwc29pZCBQb2ludCB3aXRoIGFsdGl0dWRlICovCisJX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShncHNfYWQtPnJlZl9wb3MubGF0aXR1ZGUsICZiWzFdKTsKKwlfdHNfMjNfMDMyX3N0b3JlX2xvbmdpdHVkZShncHNfYWQtPnJlZl9wb3MubG9uZ2l0dWRlLCAmYls0XSk7CisJX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShncHNfYWQtPnJlZl9wb3MuYWx0aXR1ZGUsICZiWzddKTsKKworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5idWYgPSBiOworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5zaXplID0gOTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX3RpbWUoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFJlZmVyZW5jZVRpbWUgKnJybHBfcmVmdGltZTsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlRJTUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmdGltZSA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfcmVmdGltZSkpOworCWlmICghcnJscF9yZWZ0aW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZlcmVuY2VUaW1lID0gcnJscF9yZWZ0aW1lOworCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1dlZWsgICA9IGdwc19hZC0+cmVmX3RpbWUud24gJiAweDNmZjsgLyogMTBiICovCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1RPVzIzYiA9CisJCSgoaW50KWZsb29yKGdwc19hZC0+cmVmX3RpbWUudG93IC8gMC4wOCkpICYgMHg3ZmZmZmY7ICAvKiAyM2IgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfYWxtYW5hYygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCBBbG1hbmFjICpycmxwX2FsbTsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWMgKmdwc19hbG0gPSAmZ3BzX2FkLT5hbG1hbmFjOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9hbG0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2FsbSkpOworCWlmICghcnJscF9hbG0pCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLmFsbWFuYWMgPSBycmxwX2FsbTsKKworCXJybHBfYWxtLT5hbGFtYW5hY1dOYSA9IGdwc19hbG0tPnduYTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2FsbS0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0OyAoaTwqc3RhcnQrY291bnQpICYmIChpPGdwc19hbG0tPm5fc3YpOyBpKyspIHsKKwkJc3RydWN0IEFsbWFuYWNFbGVtZW50ICphZTsKKwkJYWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCphZSkpOworCQlpZiAoIWFlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCV9ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KGFlLCAmZ3BzX2FsbS0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9hbG0tPmFsbWFuYWNMaXN0Lmxpc3QsIGFlKTsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfYWxtLT5uX3N2OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfZXBoZW1lcmlzKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBpbnQgKnN0YXJ0LCBpbnQgY291bnQsIHVpbnQ2NF90IG1hc2spCit7CisJaW50IGksIGo7CisJc3RydWN0IE5hdmlnYXRpb25Nb2RlbCAqcnJscF9uYXY7CisJc3RydWN0IGdwc19lcGhlbWVyaXMgKmdwc19lcGggPSAmZ3BzX2FkLT5lcGhlbWVyaXM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfbmF2ID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9uYXYpKTsKKwlpZiAoIXJybHBfbmF2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5uYXZpZ2F0aW9uTW9kZWwgPSBycmxwX25hdjsKKworCWlmIChjb3VudCA9PSAtMSkKKwkJY291bnQgPSBncHNfZXBoLT5uX3N2IC0gKnN0YXJ0OworCWZvciAoaT0qc3RhcnQsaj0wOyAoajxjb3VudCkgJiYgKGk8Z3BzX2VwaC0+bl9zdik7IGkrKykgeworCQlpZiAoIShtYXNrICYgKDFVTEw8PChncHNfZXBoLT5zdnNbaV0uc3ZfaWQtMSkpKSkKKwkJCWNvbnRpbnVlOworCQlzdHJ1Y3QgTmF2TW9kZWxFbGVtZW50ICpubWU7CisJCW5tZSA9IGNhbGxvYygxLCBzaXplb2YoKm5tZSkpOworCQlpZiAoIW5tZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX25hdmlnYXRpb25fbW9kZWxfZWxlbWVudChubWUsICZncHNfZXBoLT5zdnNbaV0pOworCQlBU05fU0VRVUVOQ0VfQUREKCZycmxwX25hdi0+bmF2TW9kZWxMaXN0Lmxpc3QsIG5tZSk7CisJCWorKzsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfZXBoLT5uX3N2OworfQorCisKKyNkZWZpbmUgTUFYX1BEVVMgNjQKKworaW50CitycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKQoreworCXN0cnVjdCBQRFUgKmxzdF9wZHVbTUFYX1BEVVNdOworCWludCBsc3RfY250ID0gMDsKKworCXN0cnVjdCBQRFUgKnJybHBfcGR1ID0gTlVMTDsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkID0gTlVMTDsKKwl1aW50MzJfdCByZSA9IHJlcS0+cmVxX2VsZW1zOworCWludCBpLCBydiA9IDA7CisKKwkvKiBJb25vc3BoZXJpY01vZGVsLCBVVENNb2RlbCwgUmVmTG9jYXRpb24sIFJlZmVyZW5jZVRpbWUgKi8KKwlpZiAocmUgJiAoUlJMUF9BUl9JT05PX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9VVENfTU9ERUwgfAorCSAgICAgICAgICBSUkxQX0FSX1JFRl9USU1FIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfTE9DKSkKKwl7CisJCWludCBwZHVfaGFzX2RhdGEgPSAwOworCisJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCWlmICghcnJscF9wZHUpIHsKKwkJCXJ2ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAocmUgJiBSUkxQX0FSX0lPTk9fTU9ERUwpCisJCQlpZiAoIV9ycmxwX2FkZF9pb25vc3BoZXJpY19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfVVRDX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfdXRjX21vZGVsKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfVElNRSkKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfTE9DKQorCQkJaWYgKCFfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHBkdV9oYXNfZGF0YSkgeworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBBbG1hbmFjICovCisJaWYgKHJlICYgUlJMUF9BUl9BTE1BTkFDKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9BTE1BTkFDKSkKKwkJCQlicmVhazsKKworCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCQlydiA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCisJCQlydiA9IF9ycmxwX2FkZF9hbG1hbmFjKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAxMCk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogRXBoZW1lcmlzICovCisJaWYgKHJlICYgUlJMUF9BUl9FUEhFTUVSSVMpIHsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0VQSEVNRVJJUykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfZXBoZW1lcmlzKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAyLCByZXEtPmVwaF9zdnMpOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogU2VyaWFsaXplICYgUmVsZWFzZSBhbGwgUERVcyAqLworCWZvciAoaT0wOyBpPGxzdF9jbnQgJiYgaTxvX21heF9wZHVzOyBpKyspIHsKKwkJLyogUHNldWRvIHNlZ21lbnRhdGlvbiBmbGFncyAqLworCQlNb3JlQXNzRGF0YVRvQmVTZW50X3QgKm1hZCA9IGNhbGxvYygxLCBzaXplb2YoKm1hZCkpOworCQkqbWFkID0gKGkgPT0gKGxzdF9jbnQtMSkpID8KKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X25vTW9yZU1lc3NhZ2VzIDoKKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X21vcmVNZXNzYWdlc09uVGhlV2F5OworCQlsc3RfcGR1W2ldLT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLm1vcmVBc3NEYXRhVG9CZVNlbnQgPSBtYWQ7CisKKwkJLyogU2VyaWFsaXphdGlvbiAqLworCQkvLyBhc25fZnByaW50KHN0ZG91dCwgJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldKTsKKwkJcnYgPSB1cGVyX2VuY29kZV90b19uZXdfYnVmZmVyKCZhc25fREVGX1BEVSwgTlVMTCwgbHN0X3BkdVtpXSwgJm9fcGR1W2ldKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCW9fbGVuW2ldID0gcnY7CisJfQorCisJcnYgPSBsc3RfY250OworCisJLyogUmVsZWFzZSBBU04uMSBvYmplY3RzICovCitlcnJvcjoKKwlpZiAocnJscF9wZHUpCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgKHZvaWQqKXJybHBfcGR1LCAwKTsKKworCWZvciAoaT0wOyBpPGxzdF9jbnQ7IGkrKykKKwkJYXNuX0RFRl9QRFUuZnJlZV9zdHJ1Y3QoJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldLCAwKTsKKworCXJldHVybiBydjsKK30KKworLyogfX19ICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuaCBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBycmxwLmgKKyAqCisgKiBSUkxQIEhlYWRlcgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19SUkxQX0hfXworI2RlZmluZSBfX1JSTFBfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImdwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogT3VyIGludGVybmFsIHNpbXBsaWZpZWQgc3RydWN0dXJlIGZvciByZXF1ZXN0cyAqLworCisjZGVmaW5lIFJSTFBfQVJfUkVGX0xPQwkJKDE8PDApCisjZGVmaW5lIFJSTFBfQVJfUkVGX1RJTUUJKDE8PDEpCisjZGVmaW5lIFJSTFBfQVJfVVRDX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX0FSX0lPTk9fTU9ERUwJKDE8PDMpCisjZGVmaW5lIFJSTFBfQVJfQUxNQU5BQwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfQVJfRVBIRU1FUklTCSgxPDw1KQorCitzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxIHsKKwl1aW50MzJfdCByZXFfZWxlbXM7CisJdWludDY0X3QgZXBoX3N2czsKK307CisKKworLyogTWV0aG9kcyAqLworaW50IHJybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdChzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKTsKKworaW50IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqcmVxLAorCXZvaWQgKipvX3BkdSwgaW50ICpvX2xlbiwgaW50IG9fbWF4X3BkdXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1JSTFBfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMGY3MAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogdWJ4LXBhcnNlLmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdAorICogZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisKKworLyogSGVscGVycyAqLworCitzdGF0aWMgaW50CitmbG9hdF90b19maXhlZHBvaW50KGZsb2F0IGYsIGludCBzZikKK3sKKwlpZiAoc2YgPCAwKSB7CisJCXdoaWxlIChzZisrIDwgMCkKKwkJCWYgKj0gMi4wZjsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlmICo9IDAuNWY7CisJfQorCisJcmV0dXJuIChpbnQpZjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvdWJsZV90b19maXhlZHBvaW50KGRvdWJsZSBkLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlkICo9IDIuMDsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlkICo9IDAuNTsKKwl9CisKKwlyZXR1cm4gKGludClkOworfQorCisKKy8qIFVCWCBtZXNzYWdlIHBhcnNpbmcgdG8gZmlsbCBncHMgYXNzaXN0IGRhdGEgKi8KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfbmF2X3Bvc2xsaCAqbmF2X3Bvc2xsaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBOQVZfUE9TTExIXG4iKTsKKworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZQT1M7CisKKwlncHMtPnJlZl9wb3MubGF0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+bGF0KSAqIDFlLTc7CisJZ3BzLT5yZWZfcG9zLmxvbmdpdHVkZSA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxvbikgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5hbHRpdHVkZSAgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5oZWlnaHQpICogMWUtMzsKK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9pbmkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2luaSAqYWlkX2luaSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSU5JXG4iKTsKKworCS8qIEV4dHJhY3QgaW5mbyBmb3IgIlJlZmVyZW5jZSBUaW1lIiAqLworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZUSU1FOworCisJZ3BzLT5yZWZfdGltZS53biA9IGFpZF9pbmktPnduOworCWdwcy0+cmVmX3RpbWUudG93ID0gKGRvdWJsZSlhaWRfaW5pLT50b3cgKiAxZS0zOworCisJLy8gRklYTUU6IFdlIGNvdWxkIGV4dHJhY3QgcmVmIHBvc2l0aW9uIGFzIHdlbGwgYnV0IHdlIG5lZWQgaXQgaW4KKwkvLyAgICAgICAgV0dTODQgZ2VvZGV0aWMgY29vcmRpbmF0ZXMgYW5kIGl0J3MgcHJvdmlkZWQgYXMgZWNlZiwgc28KKwkvLyAgICAgICAgd2UgbmVlZCBhIGxvdCBvZiBtYXRoIC4uLgorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2h1aShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfaHVpICphaWRfaHVpID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9IVUlcbiIpOworCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgyKSB7IC8qIFVUQyBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfdXRjX21vZGVsICp1dGMgPSAmZ3BzLT51dGM7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1VUQzsKKworCQl1dGMtPmEwICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2EwLCAtMzApOworCQl1dGMtPmExICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2ExLCAtNTApOworCQl1dGMtPmRlbHRhX3RfbHMgID0gYWlkX2h1aS0+dXRjX2xzOworCQl1dGMtPnRfb3QgICAgICAgID0gYWlkX2h1aS0+dXRjX3RvdCA+PiAxMjsKKwkJdXRjLT53bl90ICAgICAgICA9IGFpZF9odWktPnV0Y193bnQ7CisJCXV0Yy0+d25fbHNmICAgICAgPSBhaWRfaHVpLT51dGNfd25mOworCQl1dGMtPmRuICAgICAgICAgID0gYWlkX2h1aS0+dXRjX2RuOworCQl1dGMtPmRlbHRhX3RfbHNmID0gYWlkX2h1aS0+dXRjX2xzZjsKKwl9CisKKwlpZiAoYWlkX2h1aS0+ZmxhZ3MgJiAweDA0KSB7IC8qIEtsb2J1Y2hhciBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqaW9ubyA9ICZncHMtPmlvbm9zcGhlcmU7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0lPTk9TUEhFUkU7CisKKwkJaW9uby0+YWxwaGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMCwgLTMwKTsKKwkJaW9uby0+YWxwaGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMSwgLTI3KTsKKwkJaW9uby0+YWxwaGFfMiA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMiwgLTI0KTsKKwkJaW9uby0+YWxwaGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMywgLTI0KTsKKwkJaW9uby0+YmV0YV8wID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IwLCAxMSk7CisJCWlvbm8tPmJldGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMSwgMTQpOworCQlpb25vLT5iZXRhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjIsIDE2KTsKKwkJaW9uby0+YmV0YV8zID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IzLCAxNik7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2FsbShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfYWxtICphaWRfYWxtID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9BTE0gJWQgLSAlZFxuIiwgYWlkX2FsbS0+c3ZfaWQsIGFpZF9hbG0tPmdwc193ZWVrKTsKKworCWlmIChhaWRfYWxtLT5ncHNfd2VlaykgeworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfQUxNQU5BQzsKKwkJZ3BzLT5hbG1hbmFjLnduYSA9IGFpZF9hbG0tPmdwc193ZWVrICYgMHhmZjsKKwkJZ3BzX3VucGFja19zZjQ1X2FsbWFuYWMoYWlkX2FsbS0+YWxtX3dvcmRzLCAmZ3BzLT5hbG1hbmFjLnN2c1tncHMtPmFsbWFuYWMubl9zdisrXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2VwaChzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfZXBoICphaWRfZXBoID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9FUEggJWQgLSAlc1xuIiwgYWlkX2VwaC0+c3ZfaWQsIGFpZF9lcGgtPnByZXNlbnQgPyAicHJlc2VudCIgOiAibm90IHByZXNlbnQiKTsKKworCWlmIChhaWRfZXBoLT5wcmVzZW50KSB7CisJCWludCBpID0gZ3BzLT5lcGhlbWVyaXMubl9zdisrOworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfRVBIRU1FUklTOworCQlncHMtPmVwaGVtZXJpcy5zdnNbaV0uc3ZfaWQgPSBhaWRfZXBoLT5zdl9pZDsKKwkJZ3BzX3VucGFja19zZjEyMyhhaWRfZXBoLT5lcGhfd29yZHMsICZncHMtPmVwaGVtZXJpcy5zdnNbaV0pOworCX0KK30KKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXSA9IHsKKwlVQlhfRElTUEFUQ0goTkFWLCBQT1NMTEgsIF91YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgpLAorCVVCWF9ESVNQQVRDSChBSUQsIElOSSwgX3VieF9tc2dfcGFyc2VfYWlkX2luaSksCisJVUJYX0RJU1BBVENIKEFJRCwgSFVJLCBfdWJ4X21zZ19wYXJzZV9haWRfaHVpKSwKKwlVQlhfRElTUEFUQ0goQUlELCBBTE0sIF91YnhfbXNnX3BhcnNlX2FpZF9hbG0pLAorCVVCWF9ESVNQQVRDSChBSUQsIEVQSCwgX3VieF9tc2dfcGFyc2VfYWlkX2VwaCksCit9OworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaCBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogdWJ4LXBhcnNlLmgKKyAqCisgKiBIZWFkZXIgZm9yIHBhcnNpbmcgY29kZSBjb252ZXJ0aW5nIFVCWCBtZXNzYWdlcyB0byBHUFMgYXNzaXN0IGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX1BBUlNFX0hfXworI2RlZmluZSBfX1VCWF9QQVJTRV9IX18KKworCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERpc3BhdGNoIHRhYmxlICovCitleHRlcm4gc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfUEFSU0VfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiB1YnguYworICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGdlbmVyaWMgVUJYIGhlbHBlcnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInVieC5oIgorCisKK3N0YXRpYyB2b2lkCit1YnhfY2hlY2tzdW0odWludDhfdCAqZGF0YSwgaW50IGxlbiwgdWludDhfdCAqY2tzdW0pCit7CisJaW50IGk7CisJdWludDhfdCBjazAgPSAwLCBjazEgPSAwOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWNrMCArPSBkYXRhW2ldOworCQljazEgKz0gY2swOworCX0KKwlja3N1bVswXSA9IGNrMDsKKwlja3N1bVsxXSA9IGNrMTsKK30KKworCitzdGF0aWMgdWJ4X21zZ19oYW5kbGVyX3QKK3VieF9maW5kX2hhbmRsZXIoc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsIHVpbnQ4X3QgbXNnX2NsYXNzLCB1aW50OF90IG1zZ19pZCkKK3sKKwl3aGlsZSAoZHQtPmhhbmRsZXIpIHsKKwkJaWYgKChkdC0+bXNnX2NsYXNzID09IG1zZ19jbGFzcykgJiYgKGR0LT5tc2dfaWQgPT0gbXNnX2lkKSkKKwkJCXJldHVybiBkdC0+aGFuZGxlcjsKKwkJZHQrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50Cit1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKQoreworCXN0cnVjdCB1YnhfaGRyICpoZHIgPSBtc2c7CisJdWludDhfdCBja3N1bVsyXSwgKmNrc3VtX3B0cjsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoOworCisJaWYgKChoZHItPnN5bmNbMF0gIT0gVUJYX1NZTkMwKSB8fCAoaGRyLT5zeW5jWzFdICE9IFVCWF9TWU5DMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBzeW5jIGJ5dGVzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXVieF9jaGVja3N1bShtc2cgKyAyLCBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiAtIDIsIGNrc3VtKTsKKwlja3N1bV9wdHIgPSBtc2cgKyAoc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4pOworCWlmICgoY2tzdW1fcHRyWzBdICE9IGNrc3VtWzBdKSB8fCAoY2tzdW1fcHRyWzFdICE9IGNrc3VtWzFdKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlshXSBJbnZhbGlkIGNoZWNrc3VtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWggPSB1YnhfZmluZF9oYW5kbGVyKGR0LCBoZHItPm1zZ19jbGFzcywgaGRyLT5tc2dfaWQpOworCWlmIChoKQorCQloKGhkciwgbXNnICsgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSwgaGRyLT5wYXlsb2FkX2xlbiwgdXNlcmRhdGEpOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuICsgMjsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LmggYi9ycmxwLWVwaGVtZXJpcy91YnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiB1YnguaAorICoKKyAqIEhlYWRlciBmb3IgVUJYIHJlbGF0ZWQgc3R1ZmYKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX0hfXworI2RlZmluZSBfX1VCWF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIENvbnN0YW50cyB1c2VkIGluIFVCWCAqLworCisJLyogU3luYyBieXRlcyAodHdvIGZpcnN0IGJ5dGVzIG9mIGVhY2ggbWVzc2FnZSkgKi8KKyNkZWZpbmUgVUJYX1NZTkMwCQkweGI1CisjZGVmaW5lIFVCWF9TWU5DMQkJMHg2MgorCisJLyogVUJYIG1lc3NhZ2VzIGNsYXNzZXMgKi8KKyNkZWZpbmUgVUJYX0NMQVNTX05BVgkJMHgwMQorI2RlZmluZSBVQlhfQ0xBU1NfUlhNCQkweDAyCisjZGVmaW5lIFVCWF9DTEFTU19JTkYJCTB4MDQKKyNkZWZpbmUgVUJYX0NMQVNTX0FDSwkJMHgwNQorI2RlZmluZSBVQlhfQ0xBU1NfQ0ZHCQkweDA2CisjZGVmaW5lIFVCWF9DTEFTU19VUEQJCTB4MDkKKyNkZWZpbmUgVUJYX0NMQVNTX01PTgkJMHgwYQorI2RlZmluZSBVQlhfQ0xBU1NfQUlECQkweDBiCisjZGVmaW5lIFVCWF9DTEFTU19USU0JCTB4MGQKKworCS8qIFVCWCBtZXNzYWdlcyB0eXBlIElEIChieSBjbGFzcykgKi8KKyNkZWZpbmUgVUJYX05BVl9QT1NFQ0VGCQkweDAxCisjZGVmaW5lIFVCWF9OQVZfUE9TTExICQkweDAyCisjZGVmaW5lIFVCWF9OQVZfU1RBVFVTCQkweDAzCisjZGVmaW5lIFVCWF9OQVZfRE9QCQkweDA0CisjZGVmaW5lIFVCWF9OQVZfU09MCQkweDA2CisjZGVmaW5lIFVCWF9OQVZfUE9TVVRNCQkweDA4CisjZGVmaW5lIFVCWF9OQVZfVkVMRUNFRgkJMHgxMQorI2RlZmluZSBVQlhfTkFWX1ZFTE5FRAkJMHgxMgorI2RlZmluZSBVQlhfTkFWX1RJTUVHUFMJCTB4MjAKKyNkZWZpbmUgVUJYX05BVl9USU1FVVRDCQkweDIxCisjZGVmaW5lIFVCWF9OQVZfQ0xPQ0sJCTB4MjIKKyNkZWZpbmUgVUJYX05BVl9TVklORk8JCTB4MzAKKyNkZWZpbmUgVUJYX05BVl9ER1BTCQkweDMxCisjZGVmaW5lIFVCWF9OQVZfU0JBUwkJMHgzMgorI2RlZmluZSBVQlhfTkFWX0VLRlNUQVRVUwkweDQwCisKKyNkZWZpbmUgVUJYX1JYTV9SQVcJCTB4MTAKKyNkZWZpbmUgVUJYX1JYTV9TRlJCCQkweDExCisjZGVmaW5lIFVCWF9SWE1fU1ZTSQkJMHgyMAorI2RlZmluZSBVQlhfUlhNX1NWU0lfR1BTCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX1JYTV9FUEgJCTB4MzEKKyNkZWZpbmUgVUJYX1JYTV9QT1NSRVEJCTB4NDAKKworI2RlZmluZSBVQlhfSU5GX0VSUk9SCQkweDAwCisjZGVmaW5lIFVCWF9JTkZfV0FSTklORwkJMHgwMQorI2RlZmluZSBVQlhfSU5GX05PVElDRQkJMHgwMgorI2RlZmluZSBVQlhfSU5GX1RFU1QJCTB4MDMKKyNkZWZpbmUgVUJYX0lORl9ERUJVRwkJMHgwNAorI2RlZmluZSBVQlhfSU5GX1VTRVIJCTB4MDcKKworI2RlZmluZSBVQlhfQUNLX05BSwkJMHgwMAorI2RlZmluZSBVQlhfQUNLX0FDSwkJMHgwMQorCisjZGVmaW5lIFVCWF9DRkdfUFJUCQkweDAwCisjZGVmaW5lIFVCWF9DRkdfVVNCCQkweDFiCisjZGVmaW5lIFVCWF9DRkdfTVNHCQkweDAxCisjZGVmaW5lIFVCWF9DRkdfTk1FQQkJMHgxNworI2RlZmluZSBVQlhfQ0ZHX1JBVEUJCTB4MDgKKyNkZWZpbmUgVUJYX0NGR19DRkcJCTB4MDkKKyNkZWZpbmUgVUJYX0NGR19UUAkJMHgwNworI2RlZmluZSBVQlhfQ0ZHX05BVjIJCTB4MWEKKyNkZWZpbmUgVUJYX0NGR19EQVQJCTB4MDYKKyNkZWZpbmUgVUJYX0NGR19JTkYJCTB4MDIKKyNkZWZpbmUgVUJYX0NGR19SU1QJCTB4MDQKKyNkZWZpbmUgVUJYX0NGR19SWE0JCTB4MTEKKyNkZWZpbmUgVUJYX0NGR19BTlQJCTB4MTMKKyNkZWZpbmUgVUJYX0NGR19GWE4JCTB4MGUKKyNkZWZpbmUgVUJYX0NGR19TQkFTCQkweDE2CisjZGVmaW5lIFVCWF9DRkdfTElDCQkweDgwCisjZGVmaW5lIFVCWF9DRkdfVE0JCTB4MTAKKyNkZWZpbmUgVUJYX0NGR19UTTIJCTB4MTkKKyNkZWZpbmUgVUJYX0NGR19UTU9ERQkJMHgxZAorI2RlZmluZSBVQlhfQ0ZHX0VLRgkJMHgxMgorCisjZGVmaW5lIFVCWF9VUERfRE9XTkwJCTB4MDEKKyNkZWZpbmUgVUJYX1VQRF9VUExPQUQJCTB4MDIKKyNkZWZpbmUgVUJYX1VQRF9FWEVDCQkweDAzCisjZGVmaW5lIFVCWF9VUERfTUVNQ1BZCQkweDA0CisKKyNkZWZpbmUgVUJYX01PTl9TQ0hECQkweDAxCisjZGVmaW5lIFVCWF9NT05fSU8JCTB4MDIKKyNkZWZpbmUgVUJYX01PTl9JUEMJCTB4MDMKKyNkZWZpbmUgVUJYX01PTl9WRVIJCTB4MDQKKyNkZWZpbmUgVUJYX01PTl9FWENFUFQJCTB4MDUKKyNkZWZpbmUgVUJYX01PTl9NU0dQUAkJMHgwNgorI2RlZmluZSBVQlhfTU9OX1JYQlVGCQkweDA3CisjZGVmaW5lIFVCWF9NT05fVFhCVUYJCTB4MDgKKyNkZWZpbmUgVUJYX01PTl9IVwkJMHgwOQorI2RlZmluZSBVQlhfTU9OX1VTQgkJMHgwYQorCisjZGVmaW5lIFVCWF9BSURfUkVRCQkweDAwCisjZGVmaW5lIFVCWF9BSURfSU5JCQkweDAxCisjZGVmaW5lIFVCWF9BSURfSFVJCQkweDAyCisjZGVmaW5lIFVCWF9BSURfREFUQQkJMHgxMAorI2RlZmluZSBVQlhfQUlEX0FMTQkJMHgzMAorI2RlZmluZSBVQlhfQUlEX0VQSAkJMHgzMQorCisjZGVmaW5lIFVCWF9USU1fVFAJCTB4MDEKKyNkZWZpbmUgVUJYX1RJTV9UTQkJMHgwMgorI2RlZmluZSBVQlhfVElNX1RNMgkJMHgwMworI2RlZmluZSBVQlhfVElNX1NWSU4JCTB4MDQKKworCisvKiBIZWFkZXIgKi8KK3N0cnVjdCB1YnhfaGRyIHsKKyAgICAgICAgdWludDhfdCAgc3luY1syXTsKKyAgICAgICAgdWludDhfdCAgbXNnX2NsYXNzOworICAgICAgICB1aW50OF90ICBtc2dfaWQ7CisgICAgICAgIHVpbnQxNl90IHBheWxvYWRfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBQYXlsb2FkIGZvcm1hdHMgKHNvbWUgb2YgdGhlbSkgKi8KK3N0cnVjdCB1YnhfbmF2X3Bvc2xsaCB7CisJdWludDMyX3QgaXRvdzsKKwlpbnQzMl90ICBsb247CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGxhdDsJLyogc2NhbGluZyAxZS03ICovCisJaW50MzJfdCAgaGVpZ2h0Oy8qIG1tICovCisJaW50MzJfdCAgaHNsOwkvKiBtbSAqLworCXVpbnQzMl90IGhhY2M7CS8qIG1tICovCisJdWludDMyX3QgdmFjYzsJLyogbW0gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2luaSB7CisJaW50MzJfdCAgeDsKKwlpbnQzMl90ICB5OworCWludDMyX3QgIHo7CisJdWludDMyX3QgcG9zYWNjOworCXVpbnQxNl90IHRtX2NmZzsKKwl1aW50MTZfdCB3bjsKKwl1aW50MzJfdCB0b3c7CisJaW50MzJfdCAgdG93X25zOworCXVpbnQzMl90IHRhY2NfbXM7CisJdWludDMyX3QgdGFjY19uczsKKwlpbnQzMl90ICBjbGtkOworCXVpbnQzMl90IGNsa2RhY2M7CisJdWludDMyX3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9odWkgeworCXVpbnQzMl90IGhlYWx0aDsKKwlkb3VibGUgICB1dGNfYTE7CisJZG91YmxlICAgdXRjX2EwOworCWludDMyX3QgIHV0Y190b3Q7CisJaW50MTZfdCAgdXRjX3dudDsKKwlpbnQxNl90ICB1dGNfbHM7CisJaW50MTZfdCAgdXRjX3duZjsKKwlpbnQxNl90ICB1dGNfZG47CisJaW50MTZfdCAgdXRjX2xzZjsKKwlpbnQxNl90ICB1dGNfc3BhcmU7CisJZmxvYXQgICAga2xvYl9hMDsKKwlmbG9hdCAgICBrbG9iX2ExOworCWZsb2F0ICAgIGtsb2JfYTI7CisJZmxvYXQgICAga2xvYl9hMzsKKwlmbG9hdCAgICBrbG9iX2IwOworCWZsb2F0ICAgIGtsb2JfYjE7CisJZmxvYXQgICAga2xvYl9iMjsKKwlmbG9hdCAgICBrbG9iX2IzOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfYWxtIHsKKwl1aW50MzJfdCBzdl9pZDsKKwl1aW50MzJfdCBncHNfd2VlazsKKwl1aW50MzJfdCBhbG1fd29yZHNbOF07CS8qIFByZXNlbnQgb25seSBpZiAnZ3BzX3dlZWsnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2VwaCB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgcHJlc2VudDsKKwl1aW50MzJfdCBlcGhfd29yZHNbMjRdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ3ByZXNlbnQnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogTWVzc2FnZSBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCp1YnhfbXNnX2hhbmRsZXJfdCkoCisJc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgeworCXVpbnQ4X3QgbXNnX2NsYXNzOworCXVpbnQ4X3QgbXNnX2lkOworCXVieF9tc2dfaGFuZGxlcl90IGhhbmRsZXI7Cit9OworCisjZGVmaW5lIFVCWF9ESVNQQVRDSChrbHMsaWQsaGRsKSB7CQlcCisJLm1zZ19jbGFzcyA9IFVCWF9DTEFTU18gIyMga2xzICwJXAorCS5tc2dfaWQgPSBVQlhfICMjIGtscyAjIyBfICMjIGlkLAlcCisJLmhhbmRsZXIgPSAoaGRsKSwJCQlcCit9CisKKworLyogTWV0aG9kcyAqLworaW50IHVieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfSF9fICovCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaCBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA2YjRkCi0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoCkBAIC0wLDAgKzEsMjE5MiBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNDc0LDYgKzQ3NCw3IEBACisgCXBhY2tldC1nc21fYV9nbS5jCQlcCisgCXBhY2tldC1nc21fYV9ycC5jCQlcCisgCXBhY2tldC1nc21fYV9yci5jCVwKKysJcGFja2V0LWdzbV9hYmlzX29tbC5jCVwKKyAJcGFja2V0LWdzbV9pcGEuYwlcCisgCXBhY2tldC1nc21fYnNzbGFwLmMJCVwKKyAJcGFja2V0LWdzbV9ic3NtYXBfbGUuYwlcCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4yZGU5ZGNhCistLS0gL2Rldi9udWxsCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCitAQCAtMCwwICsxLDEzODIgQEAKKysvKiBwYWNrZXQtYWJpc19vbWwuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBHU00gQS1iaXMgb3ZlciBJUCAoM0dQUCBUUyAxMi4yMSkKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKysgKiBiYXNlZCBvbiBBLWJpcyBPTUwgY29kZSBpbiBPcGVuQlNDCisrICoKKysgKiAkSWQkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysjaW5jbHVkZSA8ZXBhbi9lbWVtLmg+CisrI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisrI2luY2x1ZGUgPGVwYW4vcHJlZnMuaD4KKysKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hYmlzX29tbC5oIgorKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrCisrLyogaW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19hYmlzX29tbCA9IC0xOworKworKy8qIE9NTCBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9tc2dfZGlzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3BsYWNlbWVudCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3NlcXVlbmNlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfbGVuZ3RoID0gLTE7CisrLyogRk9NIGhlYWRlciAqLworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9tc2d0eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX29iamNsYXNzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfYnRzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHJ4ID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHMgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl90YWcgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl92YWwgPSAtMTsKKysvKiBGT00gYXR0cmlidXRlcyAqLworK3N0YXRpYyBpbnQgaGZfYXR0cl9hZG1fc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfb3Blcl9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hdmFpbF9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9ldmVudF90eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3NldmVyaXR5ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JjY2hfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZXN0X25vID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3RzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZWkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX2J0c3AgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX3RzbG90ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9zc2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9nc21fdGltZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9jaGFuX2NvbWIgPSAtMTsKKysvKiBJcGFjY2VzcyAqLworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3Rlc3RfcmVzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZl9lcnIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3J4cXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9ic2ljID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMmJpcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kydGVyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcnNsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3ByaW1fb21sX2lwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X25hbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX252X2ZsYWdzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9tYXNrID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kYWRkciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2VpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc3ZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfYnZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcmFjID0gLTE7CisrCisrLyogaW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBpbnQgZXR0X29tbCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X29tbF9mb20gPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tX2F0dCA9IC0xOworKworKy8qIERlY29kZSB0aGluZ3MgYXMgbmFub0JUUyB0cmFjZXMgKi8KKytzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBGQUxTRTsKKysKKytzdGF0aWMgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA4LjEgLyBUUyAwOC41OSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX21zZ19kaXNjX3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX01ESVNDX0ZPTSwJIkZvcm1hdHRlZCBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NTUksCSJNTUkgVHJhbnNmZXIiIH0sCisrCXsgQUJJU19PTV9NRElTQ19UUkFVLAkiVFJBVSBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NQU5VRiwJIk1hbnVmYWN0dXJlciBzcGVjaWZpYyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xLjEgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9wbGFjZW1lbnRfdmFsc1tdID0geworKwl7IEFCSVNfT01fUExBQ0VNRU5UX09OTFksCSJPbmx5IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNULAkiRmlyc3QiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFLAkiTWlkZGxlIiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0xBU1QsCSJMYXN0IiB9LAorK307CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA5LjIgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fbXNndHlwZV92YWxzW10gPSB7CisrCXsgTk1fTVRfTE9BRF9JTklULAkJIlNvZnR3YXJlIExvYWQgSW5pdCIgfSwKKysJeyBOTV9NVF9MT0FEX0lOSVRfQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBJbml0IE5BQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9TRUcsCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IiB9LAorKwl7IE5NX01UX0xPQURfU0VHX0FDSywJCSJTb2Z0d2FyZSBMb2FkIFNlZ21lbnQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5ELAkJIlNvZnR3YXJlIExvYWQgRW5kIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9FTkRfTkFDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVEsCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX0FDSywJCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1csCQkiQWN0aXZhdGUgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX05BQ0ssCSJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVElWQVRFRF9SRVAsCSJTb2Z0d2FyZSBBY3RpdmF0ZWQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUksCQkiRXN0YWJsaXNoIFRFSSIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywJIkVzdGFibGlzaCBURUkgQUNLIiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUlfTkFDSywJIkVzdGFibGlzaCBURUkgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmciIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR04sCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGLAkJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRiwJCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSLAkJIlNldCBCVFMgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfQUNLLAkiU2V0IEJUUyBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywJIlNldCBCVFMgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSLAkJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSLAkJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNULAkJIlBlcmZvcm0gVGVzdCIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1RfQUNLLAkJIlBlcmZvcm0gVGVzdCBBQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX05BQ0ssCQkiUGVyZm9ybSBUZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfVEVTVF9SRVAsCQkiVGVzdCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUCwJCSJTZW5kIFRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBBQ0siIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBOQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVCwJCSJTdG9wIFRlc3QiIH0sCisrCXsgTk1fTVRfU1RPUF9URVNUX0FDSywJCSJTdG9wIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9OQUNLLAkJIlN0b3AgVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUCwJIlN0YXRlIENoYW5nZWQgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAkiRmFpbHVyZSBFdmVudCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVAsCQkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBOQUNLIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQLAkJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFLAkJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNUywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMiIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIEFDSyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUiwJCSJDaGFuZ2VvdmVyIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfQUNLLAkJIkNoYW5nZW92ZXIgQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfTkFDSywJIkNoYW5nZW92ZXIgTkFDSyIgfSwKKysJeyBOTV9NVF9PUFNUQVJULAkJIk9wc3RhcnQiIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9BQ0ssCQkiT3BzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9OQUNLLAkJIk9wc3RhcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9SRUlOSVQsCQkJIlJlaW5pdGlhbGl6ZSIgfSwKKysJeyBOTV9NVF9SRUlOSVRfQUNLLAkJIlJlaW5pdGlhbGl6ZSBBQ0siIH0sCisrCXsgTk1fTVRfUkVJTklUX05BQ0ssCQkiUmVpbml0aWFsaXplIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VULAkJIlNldCBTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywJIlNldCBTaXRlIE91dHB1dHMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAkiU2V0IFNpdGUgT3V0cHV0cyBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GLAkJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GX0FDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24gTkFDSyIgfSwKKysJeyBOTV9NVF9NRUFTX1JFU19SRVEsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVTUCwJCSJNZWFzdXJlbWVudCBSZXN1bHQgUmVzcG9uc2UiIH0sCisrCXsgTk1fTVRfU1RPUF9NRUFTLAkJIlN0b3AgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfU1RBUlRfTUVBUywJCSJTdGFydCBNZWFzdXJlbWVudCIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUiwJCSJHZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9SRVNQLAkJIkdldCBBdHRyaWJ1dGVzIFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX0dFVF9BVFRSX05BQ0ssCQkiR2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCSJTZXQgQWxhcm0gVGhyZXNob2xkIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywJIlNldCBBbGFybSBUaHJlc2hvbGQgTkFDSyIgfSwKKysJLyogcHJvcHJpZXRhcnksIG5vdCBpbiB0aGUgc3RhbmRhcmQgKi8KKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJULAkJIklQQSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAkiSVBBIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNULAkiSVBBIFJTTCBDb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX0FDSywJIklQQSBSU0wgQ29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywJIklQQSBSU0wgQ29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNULAkiSVBBIFJTTCBEaXNjb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywgIklQQSBSU0wgRGlzY29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywgIklQQSBSU0wgRGlzY29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRiwJIklQQSBDb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAkiSVBBIENvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRiwJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9OQUNLLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19BQ0ssCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSywJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFIsCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSLAkJIklQQSBTZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQsCSJJUEEgQXR0cmlidXRlIENoYW5nZSBFdmVudCIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVCwJCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfTkFDSywJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfTUVBU19SRVNfUkVRX05BQ0ssIklQQSBNZWFzdXJlbWVudCBSZXN1bHQgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywJIklQQSBTdGFydCBNZWFzdXJlbWVudCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUT1BfTUVBU19OQUNLLAkiSVBBIFN0b3AgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFLAkiU0lFIFJlc2V0IFJlc291cmNlIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFgsCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYLAkJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkosCSJTSUUgQ3JlYXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkosCSJTSUUgRGVsZXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURSwJCSJTSUUgR2V0IFN0YXRlIiB9LAorKwl7IE5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSywJIlNJRSBHZXQgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OLAkJIlNJRSBMTVQgTG9nb24iIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAkiU0lFIExNVCBMb2dvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNUQVJULAkJIlNJRSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCSJTSUUgUmVzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ESVNDT05ORUNULAkiU0lFIERpc2Nvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVF9BQ0ssCSJTSUUgRGlzY29ubmVjdCBCVFMgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRiwJIlNJRSBMTVQgTG9nb2ZmIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCSJTSUUgTE1UIExvZ29mZiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1QsCQkiU0lFIFJlY29ubmVjdCBCVFMiIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAkiU0lFIFJlY29ubmVjdCBCVFMgQUNLIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9vYmpjbGFzc192YWxzW10gPSB7CisrCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkJIkJUUyBTaXRlIE1hbmFnZXIiIH0sCisrCXsgTk1fT0NfQlRTLAkJCSJCVFMiIH0sCisrCXsgTk1fT0NfUkFESU9fQ0FSUklFUiwJCSJSYWRpbyBDYXJyaWVyIiB9LAorKwl7IE5NX09DX0NIQU5ORUwsCQkiUmFkaW8gQ2hhbm5lbCIgfSwKKysJeyBOTV9PQ19CQVNFQl9UUkFOU0MsCQkiQmFzZWJhbmQgVHJhbnNjZWl2ZXIiIH0sCisrCS8qIHByb3ByaWV0YXJ5LCB2ZW5kb3Igc3BlY2lmaWMgKi8KKysJeyBOTV9PQ19CUzExX0FESkMsCQkiU0lFIEFkamFjZW5kIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJCSJTSUUgSGFuZG92ZXIiIH0sCisrCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJCSJTSUUgUG93ZXIgQ29udHJvbCIgfSwKKysJeyBOTV9PQ19CUzExX0JUU0UsCQkiU0lFIEJUU0UiIH0sCisrCXsgTk1fT0NfQlMxMV9SQUNLLAkJIlNJRSBSYWNrIiB9LAorKwl7IE5NX09DX0JTMTEsCQkJIlNJRSBTaWVtZW5zSFciIH0sCisrCXsgTk1fT0NfQlMxMV9URVNULAkJIlNJRSBUZXN0IiB9LAorKwl7IE5NX09DX0JTMTFfRU5WQUJUU0UsCQkiU0lFIEVudmFCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfQlBPUlQsCQkiU0lFIEJQb3J0IiB9LAorKwl7IE5NX09DX0dQUlNfTlNFLAkJIkdQUlMgTlNFIiB9LAorKwl7IE5NX09DX0dQUlNfQ0VMTCwJCSJHUFJTIENlbGwiIH0sCisrCXsgTk1fT0NfR1BSU19OU1ZDMCwJCSJHUFJTIE5TVkMwIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzEsCQkiR1BSUyBOU1ZDMSIgfSwKKysJeyBOTV9PQ19OVUxMLAkJCSJOVUxMIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fYXR0cl92YWxzW10gPSB7CisrCXsgTk1fQVRUX0FCSVNfQ0hBTk5FTCwJCSJBLWJpcyBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9BRERfSU5GTywJCSJBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0FUVF9BRERfVEVYVCwJCSJBZGRpdGlvbmFsIFRleHQiIH0sCisrCXsgTk1fQVRUX0FETV9TVEFURSwJCSJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfQVJGQ05fTElTVCwJCSJBUkZDTiBMaXN0IiB9LAorKwl7IE5NX0FUVF9BVVRPTl9SRVBPUlQsCQkiQXV0b25vbW91c2x5IFJlcG9ydCIgfSwKKysJeyBOTV9BVFRfQVZBSUxfU1RBVFVTLAkJIkF2YWlsYWJpbGl0eSBTdGF0dXMiIH0sCisrCXsgTk1fQVRUX0JDQ0hfQVJGQ04sCQkiQkNDSCBBUkZDTiIgfSwKKysJeyBOTV9BVFRfQlNJQywJCQkiQlNJQyIgfSwKKysJeyBOTV9BVFRfQlRTX0FJUl9USU1FUiwJCSJCVFMgQWlyIFRpbWVyIiB9LAorKwl7IE5NX0FUVF9DQ0NIX0xfSV9QLAkJIkNDQ0ggTG9hZCBJbmRpY2F0aW9uIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX1QsCQkiQ0NDSCBMb2FkIFRocmVzaG9sZCIgfSwKKysJeyBOTV9BVFRfQ0hBTl9DT01CLAkJIkNoYW5uZWwgQ29tYmluYXRpb24iIH0sCisrCXsgTk1fQVRUX0NPTk5fRkFJTF9DUklULAkiQ29ubmVjdGlvbiBGYWlsIENyaXRlcmlvbiIgfSwKKysJeyBOTV9BVFRfREVTVCwJCQkiRGVzdGluYXRpb24iIH0sCisrCXsgTk1fQVRUX0VWRU5UX1RZUEUsCQkiRXZlbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfRklMRV9JRCwJCSJGaWxlIElEIiB9LAorKwl7IE5NX0FUVF9GSUxFX1ZFUlNJT04sCQkiRmlsZSBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9HU01fVElNRSwJCSJHU00gVGltZSIgfSwKKysJeyBOTV9BVFRfSFNOLAkJCSJIU04iIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZJRywJCSJIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9IV19ERVNDLAkJIkhXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9JTlRBVkVfUEFSQU0sCQkiSW50YXZlIFBhcmFtZXRlciIgfSwKKysJeyBOTV9BVFRfSU5URVJGX0JPVU5ELAkJIkludGVyZmVyZW5jZSBCb3VuZGFyaWVzIiB9LAorKwl7IE5NX0FUVF9MSVNUX1JFUV9BVFRSLAkJIkxpc3Qgb2YgcmVxdWlyZWQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9BVFRfTUFJTywJCQkiTUFJTyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfU1RBVEUsCQkiTWFudWZhY3R1cmVyIERlcGVuZGVudCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfTUFOVUZfVEhSRVNILAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfSUQsCQkiTWFudWZhY3R1cmVyIElkIiB9LAorKwl7IE5NX0FUVF9NQVhfVEEsCQkiTWF4aW11bSBUaW1pbmcgQWR2YW5jZSIgfSwKKysJeyBOTV9BVFRfTURST1BfTElOSywJCSJNdWx0aS1kcm9wIEJTQyBMaW5rIiB9LAorKwl7IE5NX0FUVF9NRFJPUF9ORVhULAkJIk11bHRpLWRyb3AgbmV4dCBCVFMgTGluayIgfSwKKysJeyBOTV9BVFRfTkFDS19DQVVTRVMsCQkiTkFDSyBDYXVzZXMiIH0sCisrCXsgTk1fQVRUX05ZMSwJCQkiTnkxIiB9LAorKwl7IE5NX0FUVF9PUEVSX1NUQVRFLAkJIk9wZXJhdGlvbmFsIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9PVkVSTF9QRVJJT0QsCQkiT3ZlcmxvYWQgUGVyaW9kIiB9LAorKwl7IE5NX0FUVF9QSFlTX0NPTkYsCQkiUGh5c2ljYWwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9QT1dFUl9DTEFTUywJCSJQb3dlciBDbGFzcyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfVEhSRVNILAkJIlBvd2VyIE91dHB1dCBUaHJlc2hvbGRzIiB9LAorKwl7IE5NX0FUVF9QUk9CX0NBVVNFLAkJIlByb2JhYmxlIENhdXNlIiB9LAorKwl7IE5NX0FUVF9SQUNIX0JfVEhSRVNILAkJIlJBQ0ggQnVzeSBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0xEQVZHX1NMT1RTLAkJIlJBQ0ggTG9hZCBBdmVyYWdpbmcgU2xvdHMiIH0sCisrCXsgTk1fQVRUX1JBRF9TVUJDLAkJIlJhZGlvIFN1YiBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9SRl9NQVhQT1dSX1IsCQkiUkYgTWF4IFBvd2VyIFJlZHVjdGlvbiIgfSwKKysJeyBOTV9BVFRfU0lURV9JTlBVVFMsCQkiU2l0ZSBJbnB1dHMiIH0sCisrCXsgTk1fQVRUX1NJVEVfT1VUUFVUUywJCSJTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fQVRUX1NPVVJDRSwJCSJTb3VyY2UiIH0sCisrCXsgTk1fQVRUX1NQRUNfUFJPQiwJCSJTcGVjaWZpYyBQcm9ibGVtcyIgfSwKKysJeyBOTV9BVFRfU1RBUlRfVElNRSwJCSJTdGFydGluZyBUaW1lIiB9LAorKwl7IE5NX0FUVF9UMjAwLAkJCSJUMjAwIiB9LAorKwl7IE5NX0FUVF9URUksCQkJIlRFSSIgfSwKKysJeyBOTV9BVFRfVEVTVF9EVVIsCQkiVGVzdCBEdXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfVEVTVF9OTywJCSJUZXN0IE5vIiB9LAorKwl7IE5NX0FUVF9URVNUX1JFUE9SVCwJCSJUZXN0IFJlcG9ydCBJbmZvIiB9LAorKwl7IE5NX0FUVF9WU1dSX1RIUkVTSCwJCSJWU1dSIFRocmVzaG9sZHMgIiB9LAorKwl7IE5NX0FUVF9XSU5ET1dfU0laRSwJCSJXaW5kb3cgU2l6ZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9SU1NJX09GRlMsCSJTSUUgUlNTSSBPZmZzZXQiIH0sCisrCXsgTk1fQVRUX0JTMTFfVFhQV1IsCQkiU0lFIFRYIFBvd2VyIiB9LAorKwl7IE5NX0FUVF9CUzExX0RJVkVSU0lUWSwJIlNJRSBEaXZlcnNpdHkiIH0sCisrCXsgTk1fQVRUX1RTQywJCQkiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIgfSwKKysJeyBOTV9BVFRfU1dfQ09ORklHLAkJIlNXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX1NXX0RFU0NSLAkJIlNXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9TRVZFUklUWSwJCSJQZXJjZWl2ZWQgU2V2ZXJpdHkiIH0sCisrCXsgTk1fQVRUX0dFVF9BUkksCQkiR2V0IEFSSSIgfSwKKysJeyBOTV9BVFRfSFdfQ09ORl9DSEcsCQkiSFcgQ29uZmlndXJhdGlvbiBDaGFuZ2UiIH0sCisrCXsgTk1fQVRUX09VVFNUX0FMQVJNLAkJIk91dHN0YW5kaW5nIEFsYXJtIiB9LAorKwl7IE5NX0FUVF9GSUxFX0RBVEEsCQkiRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9NRUFTX1JFUywJCSJNZWFzdXJlbWVudCBSZXN1bHQiIH0sCisrCXsgTk1fQVRUX01FQVNfVFlQRSwJCSJNZWFzdXJlbWVudCBUeXBlIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLAkiU0lFIEVTTiBGVyBDb2RlIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywJIlNJRSBFU04gSFcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwsCSJTSUUgRVNOIFBDQiBTZXJpYWwgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRSwgIlNJRSBFeGNlc3NpdmUgRGlzdGFuY2UiIH0sCisrCXsgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywJIlNJRSBBbGwgVGVzdCBDYXRlZ29yaWVzIiB9LAorKwl7IE5NX0FUVF9CUzExX0JUU0xTX0hPUFBJTkcsCSJTSUUgQlRTIExTIEhvcHBpbmciIH0sCisrCXsgTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwJIlNJRSBDZWxsIEFsbG9jYXRpb24gTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAkiU0lFIENlbGwgR2xvYmFsIElEIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MsCSJTSUUgRW5hYmxlIEludGVyZmVyZW5jZSBDbGFzcyIgfSwKKysJLyogRklYTUUgKi8KKysJeyBOTV9BVFRfQlMxMV9FTkFfTVNfUFdSX0NUUkwsCSJTSUUgRW5hYmxlIE1TIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPLAkiU0lFIEVuYWJsZSBQb3dlciBCdWRnZXQgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPLAkiU0lFIEVuYWJsZSBSeExldmVsIEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWFFVQUxfSE8sCSJTSUUgRW5hYmxlIFJ4UXVhbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9GQUNDSF9RVUFMLAkiU0lFIEZBQ0NIIFF1YWxpdHkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUCwJCSJJUEEgRGVzdGluYXRpb24gSVAgQWRkcmVzcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQsCSJJUEEgRGVzdGlvbmF0aW9uIElQIFBvcnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NTUkMsCQkiSVBBIFJUUCBTU1JDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRSwJIklQQSBSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CQVNFQl9JRCwJIklQQSBCYXNlYmFuZCBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsCSJJUEEgU3RyZWFtIElkZW50aWZpZXIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05WX0ZMQUdTLAkiSVBBIE5WUkFNIEZsYWdzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GUkVRX0NUUkwsCSJJUEEgRnJlcXVlbmN5IENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRywJIklQQSBQcmltYXJ5IE9NTCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHLAkiSVBBIFNlY29uZGFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JUF9JRl9DRkcsCSJJUEEgSVAgSW50ZXJmYWNlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHLAkiSVBBIElQIEdhdGV3YXkgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUsCSJJUEEgSW4gU2VydmljZSBUaW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19UUlhfQlRTX0FTUywJIklQQSBUUlggQlRTIEFzc2lnbm1lbnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OLAkiSVBBIEJUUyBMb2NhdGlvbiBOYW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHLAkiSVBBIFBhZ2luZyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsCSJJUEEgRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VTklUX0lELAkJIklQQSBVbml0IElEIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQVJFTlRfVU5JVF9JRCwJIklQQSBQYXJlbnQgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FLAkiSVBBIFVuaXQgTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU05NUF9DRkcsCSJJUEEgU05NUCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNULCAiSVBBIFByaW1hcnkgT01MIENvbmZpZyBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VULCJJUEEgUHJpbWFyeSBPTUwgRmFsbGJhY2sgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRywJIklQQSBDdXJyZW50IFNvZnR3YXJlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUywJIklQQSBUaW1pbmcgQnVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DR0ksCQkiSVBBIENHSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkFDLAkJIklQQSBSQUMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OLAkiSVBBIE9iamVjdCBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsCSJJUEEgR1BSUyBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNFSSwJCSJJUEEgTlNFSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQlZDSSwJCSJJUEEgQlZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNWQ0ksCQkiSVBBIE5TVkNJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19DRkcsCQkiSVBBIE5TIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywJIklQQSBCU1NHUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywJIklQQSBOUyBMaW5rIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkcsCQkiSVBBIFJMQyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QsCSJJUEEgQWxhcm0gVGhyZXNob2xkIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNULAkiSVBBIE1vbml0b3JlZCBWYWx1ZSBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTCwJIklQQSBUaW1pbmcgSW50ZXJmYWNlIEJ1cyBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTLAkiSVBBIFN1cHBvcnRlZCBGZWF0dXJlcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMsCSJJUEEgQ29kaW5nIFNjaGVtZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMiwJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVCwJIklQQSBIZWFydGJlYXQgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVVBUSU1FLAkJIklQQSBVcHRpbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMywJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU0xfQ0ZHLAkJIklQQSBTU0wgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFLAkiSVBBIFNlY3VyaXR5IFBvc3NpYmxlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFLAkiSVBBIElNTCBTU0wgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JFVk9DX0RBVEUsCSJJUEEgUmV2b2NhdGlvbiBEYXRlIiB9LAorKwkvKiBGSVhNRTogTW9yZSBTSUUgKi8KKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfYWRtX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyBOTV9TVEFURV9MT0NLRUQsCQkiTG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1VOTE9DS0VELAkJIlVubG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1NIVVRET1dOLAkJIlNodXRkb3duIiB9LAorKwl7IE5NX1NUQVRFX05VTEwsCQkiTnVsbCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX29wZXJfc3RhdGVfdmFsc1tdID0geworKwl7IDEsCSJEaXNhYmxlZCIgfSwKKysJeyAyLAkiRW5hYmxlZCIgfSwKKysJeyAweGZmLAkiTlVMTCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjcgQXZhaWxhYmlsaXR5IFN0YXR1cyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2F2YWlsX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAwLAkiSW4gdGVzdCIgfSwKKysJeyAxLAkiRmFpbGVkIiB9LAorKwl7IDIsCSJQb3dlciBvZmYiIH0sCisrCXsgMywJIk9mZiBsaW5lIiB9LAorKwl7IDUsCSJEZXBlbmRlbmN5IiB9LAorKwl7IDYsCSJEZWdyYWRlZCIgfSwKKysJeyA3LCAJIk5vdCBpbnN0YWxsZWQiIH0sCisrCXsgMHhmZiwJIk9LIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9jaGFuX2NvbWJfdmFsc1tdID0geworKwl7IE5NX0NIQU5DX1RDSEZ1bGwsCQkiVENIL0YiIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZiwJCSJUQ0gvSCIgfSwKKysJeyBOTV9DSEFOQ19UQ0hIYWxmMiwJCSJUQ0gvSCAyIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NILAkJIlNEQ0NIIiB9LAorKwl7IE5NX0NIQU5DX21haW5CQ0NILAkJIk1haW4gQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIQ29tYiwJCSJDb21iaW5lZCBCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0gsCQkiQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIX0NCQ0gsCQkiQkNDSCtDQkNIIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NIX0NCQ0gsCQkiU0RDQ0grQ0JDSCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZXZlbnRfdHlwZV92YWxzW10gPSB7CisrCXsgTk1fRVZUX0NPTU1fRkFJTCwJCSJDb21tdW5pY2F0aW9uIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX1FPU19GQUlMLAkJIlFvUyBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9QUk9DX0ZBSUwsCQkiUHJvY2Vzc29yIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VRVUlQX0ZBSUwsCQkiRXF1aXBtZW50IEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VOVl9GQUlMLAkJIkVudmlyb25tZW50IEZhaWx1cmUiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfc2V2ZXJpdHlfdmFsc1tdID0geworKwl7IE5NX1NFVkVSX0NFQVNFRCwJCSJDZWFzZWQiIH0sCisrCXsgTk1fU0VWRVJfQ1JJVElDQUwsCQkiQ3JpdGljYWwiIH0sCisrCXsgTk1fU0VWRVJfTUFKT1IsCQkiTWFqb3IiIH0sCisrCXsgTk1fU0VWRVJfTUlOT1IsCQkiTWlub3IiIH0sCisrCXsgTk1fU0VWRVJfV0FSTklORywJCSJXYXJuaW5nIiB9LAorKwl7IE5NX1NFVkVSX0lOREVURVJNSU5BVEUsCSJJbmRldGVybWluYXRlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfbmFja19jYXVzZVtdID0geworKwl7IE5NX05BQ0tfSU5DT1JSX1NUUlVDVCwJIkluY29ycmVjdCBtZXNzYWdlIHN0cnVjdHVyZSIgfSwKKysJeyBOTV9OQUNLX01TR1RZUEVfSU5WQUwsCSJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX09CSkNMQVNTX0lOVkFMLAkiSW52YWxpZCBPYmplY3QgY2xhc3MgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQLAkiT2JqZWN0IENsYXNzIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19CVFNOUl9VTktOLAkJIkJUUyBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX1RSWE5SX1VOS04sCQkiVFJYIE51bWJlciB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfT0JKSU5TVF9VTktOLAkJIk9iamVjdCBJbnN0YW5jZSB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX0lOVkFMLAkJIkludmFsaWQgQXR0cmlidXRlIElEIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX05PVFNVUFAsCSJBdHRyaWJ1dGUgSUQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX1BBUkFNX1JBTkdFLAkJIlBhcmFtZXRlciB2YWx1ZSBvdXQgb2YgcmFuZ2UiIH0sCisrCXsgTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQsICJJbmNvbnNpc3RlbmN5IGluIEF0dHJpYnV0ZSBsaXN0IiB9LAorKwl7IE5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAsCSJTcGVjaWZpZWQgSW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0NBTlRfUEVSRk9STSwJCSJNZXNzYWdlIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9USU1QTCwJCSJSZXNvdXJjZSBub3QgaW1wbGVtZW50ZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9UQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX0ZSRVFfTk9UQVZBSUwsCSJGcmVxdWVuY3kgbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9UU1VQUCwJCSJUZXN0IG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQVBBQ0lUWV9SRVNUUiwJIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVElOSVQsCQkiVGVzdCBub3QgaW5pdGlhdGVkIiB9LAorKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFLAkiUGh5cyBjb25maWcgY2Fubm90IGJlIHJlc3RvcmVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NVQ0gsCQkiTm8gc3VjaCBUZXN0IiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NUT1AsCQkiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIgfSwKKysJeyBOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHLAkiTWVzc2FnZSBpbmNvbnNpc3RlbiB3aXRoIHBoeXNpY2FsIGNvbmZpZyIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfSU5DT01QTEVURSwJIkNvbXBsZXRlIGZpbGUgbm90IHJlY2VpdmVkIiB9LAorKwl7IE5NX05BQ0tfRklMRV9OT1RBVkFJTCwJIkZpbGUgbm90IGF2YWlsYWJsZSBhdCBkZXN0aW5hdGlvbiIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUsCSJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZWQiIH0sCisrCXsgTk1fTkFDS19SRVFfTk9UX0dSQU5ULAkiUmVxdWVzdCBub3QgZ3JhbnRlZCIgfSwKKysJeyBOTV9OQUNLX1dBSVQsCQkJIldhaXQiIH0sCisrCXsgTk1fTkFDS19OT1RIX1JFUE9SVF9FWElTVCwJIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1VQUCwJCSJNZWFzdXJlbWVudCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfTUVBU19OT1RTVEFSVCwJIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiB9LAorKwl7IDB4ZmYsCQkJCSJOVUxMIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfdGVzdF9ub192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVCwJIlJhZGlvIExvb3AgdGVzdCB2aWEgYW50ZW5uYSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUiwJIlJhZGlvIExvb3AgdGVzdCB2aWEgdHJhbnNjZWl2ZXIiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKLAkiQlRTIEZ1bmN0aW9uYWwgb2JqZWN0IHNlbGYgdGVzdCIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRSwgIkJDQ0ggQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLAkiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLAkiVHJhbnNtaXQgQmVhY29uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IsICJTeXNJbmZvIE1vbml0b3IiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0NIX01PTklUT1IsICJCQ0NIICYgQ0NDSCBNb25pdG9yIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0X3Jlc192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTLAkiU3VjY2VzcyIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQsCSJUaW1lb3V0IiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMsCSJObyBzdWl0YWJsZSBjaGFubmVscyBhdmFpbGFibGUiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMLAkiUGFydGlhbCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQsCSJTdG9wcGVkIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0cmVzX2llX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNULAkiRnJlcXVlbmN5IEVycm9yIExpc3QiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUywiUmVzdWx0IERldGFpbHMiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIsCSJGcmVxdWVuY3kgRXJyb3IiIH0sCisrfTsKKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIEJDQ0ggSW5mb3JtYXRpb24gSUUgZW1iZWRkZWQgaW50byB0aGUgVGVzdAorKyAqIFJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisraXBhY2NfdHJfaWVfYmNjaCh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKKyt7CisrCWd1aW50MTYgYmluZm9fdHlwZSwgdG1wOworKworKwliaW5mb190eXBlID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCW9mZnNldCArPSAyOworKworKwl0bXAgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysKKysJLyogRklYTUU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIGJ1Z3MgcmVtYWluaW5nIGhlcmUgKi8KKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9iX3J4bGV2LAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQkgICAgdHZiLCBvZmZzZXQsIDQsIFRSVUUpOworKwlvZmZzZXQgKz0gNDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCWRlX2xhaSh0dmIsIGF0dF90cmVlLCBvZmZzZXQsIDUsIE5VTEwsIDApOworKwlvZmZzZXQgKz0gNTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJaWYgKGJpbmZvX3R5cGUgJiAweDgwMDApIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDEpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMmJpcywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDIpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAydGVyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDQpIHsKKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBDaGFubmVsIFVzYWdlIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2NoYW5fdXNhZ2UodHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50MTYgcmVzdWx0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhsZXYsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCW9mZnNldCArPSAyOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgZm9ybWF0IG9mIHRoZSBzdGFuZGFyZCB0ZXN0IHJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9pcGFjY190ZXN0X3JlcChwcm90b190cmVlICp0cmVlLCB0dmJ1ZmZfdCAqdHZiKQorK3sKKysJZ2ludCBvZmZzZXQgPSAwOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2F0dHJfaXBhX3Rlc3RfcmVzLCB0dmIsIG9mZnNldCsrLAorKwkJCSAgICAxLCBGQUxTRSk7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQ4IGllID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJZ3VpbnQxNiBsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzEpOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQrKywgMSwgRkFMU0UpOworKwkJYXR0X3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbV9hdHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQsIDIsIGxlbik7CisrCQlvZmZzZXQgKz0gMjsKKysKKysJCXN3aXRjaCAoaWUpIHsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRToKKysJCQlvZmZzZXQgPSBpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YiwKKysJCQkJCQkgCWF0dF90cmVlLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk86CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfYmNjaCh0dmIsCisrCQkJCQkJICBhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogRGlzc2VjdCBPTUwgRk9NIEF0dHJpYnV0ZXMgYWZ0ZXIgT01MICsgRk9NIGhlYWRlciAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9vbWxfYXR0cnModHZidWZmX3QgKnR2YiwgaW50IGJhc2Vfb2ZmcywgcGFja2V0X2luZm8gKnBpbmZvLAorKwkJICBwcm90b190cmVlICp0cmVlKQorK3sKKysJaW50IG9mZnNldCA9IGJhc2Vfb2ZmczsKKysKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludCBpOworKwkJZ3VpbnQ4IHRhZywgdmFsODsKKysJCWd1aW50MTYgdmFsMTY7CisrCQlndWludDMyIHZhbDMyOworKwkJdW5zaWduZWQgaW50IGxlbiwgbGVuX2xlbiwgaGxlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysJCXR2YnVmZl90ICpzdWJfdHZiOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZubV9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9mb21fYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9mb21fYXR0cl9sZW4sIHR2YiwKKysJCQkJICAgIG9mZnNldCsxLCBsZW5fbGVuLCBsZW4pOworKwkJb2Zmc2V0ICs9IGhsZW47CisrCisrCQlzdWJfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQsIGxlbiwgbGVuKTsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQkvKiBwYXJzZSBvbmx5IHRoZSBtb3N0IGNvbW1vbiBJRSBmb3Igbm93ICovCisrCQljYXNlIE5NX0FUVF9BQklTX0NIQU5ORUw6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfYnRzcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfdHNsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMSwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfc3Nsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMiwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BRE1fU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hZG1fc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfYWRtX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BUkZDTl9MSVNUOgorKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworKwkJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQgKyBpKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9hcmZjbiwKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQgKyBpLCAyLCB2YWwxNik7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVZBSUxfU1RBVFVTOgorKwkJCS8qIEF2YWlsYWJpbGl0eSBzdGF0dXMgY2FuIGhhdmUgbGVuZ3RoIDAgKi8KKysJCQlpZiAobGVuKSB7CisrCQkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsCisrCQkJCQkJICAgIGhmX2F0dHJfYXZhaWxfc3RhdGUsIHR2YiwKKysJCQkJCSAgICAJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJfSBlbHNlCisrCQkJCXZhbDggPSAweGZmOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2F2YWlsX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CQ0NIX0FSRkNOOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYmNjaF9hcmZjbiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0JTSUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ic2ljLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQ0hBTl9DT01COgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfY2hhbl9jb21iLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfRVZFTlRfVFlQRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2V2ZW50X3R5cGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9HU01fVElNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2dzbV90aW1lLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfT1BFUl9TVEFURToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX29wZXJfc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfb3Blcl9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVJOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdGVpLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVFNDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdHNjLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfU0VWRVJJVFk6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9zZXZlcml0eSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfUkVQT1JUOgorKwkJCWRpc3NlY3RfaXBhY2NfdGVzdF9yZXAoYXR0X3RyZWUsIHN1Yl90dmIpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVTVF9OTzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3Rlc3Rfbm8sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF90ZXN0X25vX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCisrCQkvKiBwcm9wcmlldGFyeSBpcC5hY2Nlc3MgZXh0ZW5zaW9ucyAqLworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfRFNUX0lQOgorKwkJCXZhbDMyID0gdHZiX2dldF9udG9obCh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXB2NChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDMyKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTE9DQVRJT046CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxLCA0LCBUUlVFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0LAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0KzErNCwgMiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OVl9GTEFHUzoKKysJCQl7CisrCQkJCWd1aW50IGZsYWdzLCBtYXNrOworKwkJCQlmbGFncyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQkJbWFzayA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCQlmbGFncyB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKSA8PCA4OworKwkJCQltYXNrIHw9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpIDw8IDg7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCwgMywgZmxhZ3MpOworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9tYXNrLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCsxLCAzLCBtYXNrKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19SQUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcmFjLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TRUk6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2VpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TVkNJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfQlZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2J2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkc6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCXZhbDMyID0gdHZiX2dldF9pcHY0KHR2Yiwgb2Zmc2V0KzIpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kYWRkciwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzIsIDQsIHZhbDMyKTsKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrNik7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQrNiwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfdmFsLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX2ZvbSh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCisrCQlpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlndWludDggbXNnX3R5cGUsIG9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yOworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqZm9tX3RyZWU7CisrCisrCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwlvYmpfY2xhc3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJYnRzX25yID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCXRyeF9uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpOworKwl0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzQpOworKwlwcm90b19pdGVtX2FwcGVuZF90ZXh0KHRvcF90aSwgIiwgJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX21zZ3R5cGUsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJZm9tX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21fb2JqY2xhc3MsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X2J0cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHJ4LCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF90cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKworKworKwkvKiBkaXNzZWN0IHRoZSBUTFYgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZSBib2R5ICovCisrCW9mZnNldCA9IGRpc3NlY3Rfb21sX2F0dHJzKHR2Yiwgb2Zmc2V0LCBwaW5mbywgZm9tX3RyZWUpOworKworKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgY29uc3QgZ3VpbnQ4IGlwYWNjZXNzX21hZ2ljW10gPSAiY29tLmlwYWNjZXNzIjsKKysKKytzdGF0aWMgaW50CisrZGlzc2VjdF9vbWxfbWFudWYodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJICBpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlpZiAodHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpICE9IDB4MGQgfHwKKysJICAgIHR2Yl9tZW1lcWwodHZiLCBvZmZzZXQrMSwgaXBhY2Nlc3NfbWFnaWMsIHNpemVvZihpcGFjY2Vzc19tYWdpYykpKQorKwkJcmV0dXJuIG9mZnNldDsKKysKKysJb2Zmc2V0ICs9IHNpemVvZihpcGFjY2Vzc19tYWdpYykgKyAxOworKworKwlyZXR1cm4gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgdG9wX3RpKTsKKyt9CisrCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2FiaXNfb21sKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCXByb3RvX2l0ZW0gKnRpOworKwlwcm90b190cmVlICpvbWxfdHJlZTsKKysKKysJaW50IG9mZnNldCA9IDA7CisrCisrCWNvbF9zZXRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX1BST1RPQ09MLCAiT01MIik7CisrCisrCXRvcF90cmVlID0gdHJlZTsKKysJaWYgKHRyZWUpIHsKKysJCXVfaW50OF90IG1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIHByb3RvX2FiaXNfb21sLCB0dmIsIDAsIC0xLCBGQUxTRSk7CisrCQlvbWxfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWwpOworKworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX21zZ19kaXNjLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfcGxhY2VtZW50LCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfc2VxdWVuY2UsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9sZW5ndGgsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysKKysJCXN3aXRjaCAobXNnX2Rpc2MpIHsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19GT006CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIG9tbF90cmVlLAorKwkJCQkJCSBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NQU5VRjoKKysJCQlvZmZzZXQgPSBkaXNzZWN0X29tbF9tYW51Zih0dmIsIHBpbmZvLCBvbWxfdHJlZSwJCQkJCQkJICAgICAgIG9mZnNldCwgdGkpOworKwkJCWJyZWFrOworKwkJY2FzZSBBQklTX09NX01ESVNDX01NSToKKysJCWNhc2UgQUJJU19PTV9NRElTQ19UUkFVOgorKwkJZGVmYXVsdDoKKysJCQlicmVhazsKKysJCX0KKysJfQorK30KKysKKyt2b2lkCisrcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwodm9pZCk7CisrCisrdm9pZAorK3Byb3RvX3JlZ2lzdGVyX2FiaXNfb21sKHZvaWQpCisreworKwlzdGF0aWMgaGZfcmVnaXN0ZXJfaW5mbyBoZltdID0geworKwkJeyAmaGZfb21sX21zZ19kaXNjLAorKwkJCXsgIk1lc3NhZ2UgRGlzY3JpbWluYXRvciIsICJvbWwubXNnX2RzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX21zZ19kaXNjX3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3BsYWNlbWVudCwKKysJCQl7ICJQbGFjZW1lbnQgSW5kaWNhdG9yIiwgIm9tbC5wbGFjZW1lbnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9wbGFjZW1lbnRfdmFscyksIDAsCisrCQkJICAiR1NNIDEyLjIxIFBsYWNlbWVudCBJbmRpY2F0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3NlcXVlbmNlLAorKwkJCXsgIlNlcXVlbmNlIE51bWJlciIsICJvbWwuc2VxdWVuY2UiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlNlcXVlbmNlIE51bWJlciAoaWYgbXVsdGktcGFydCBtc2cpIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9sZW5ndGgsCisrCQkJeyAiTGVuZ3RoIEluZGljYXRvciIsICJvbWwubGVuZ3RoIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJUb3RhbCBsZW5ndGggb2YgcGF5bG9hZCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX21zZ3R5cGUsCisrCQkJeyAiRk9NIE1lc3NhZ2UgVHlwZSIsICJvbWwuZm9tLm1zZ190eXBlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX21zZ3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9vYmpjbGFzcywKKysJCQl7ICJGT00gT2JqZWN0IENsYXNzIiwgIm9tbC5mb20ub2JqX2NsYXNzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX29iamNsYXNzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF9idHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBCVFMiLCAib21sLmZvbS5vYmpfaW5zdC5idHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cngsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUlgiLCAib21sLmZvbS5vYmpfaW5zdC50cngiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cywKKysJCQl7ICJGT00gT2JqZWN0IEluc3RhbmNlIFRTIiwgIm9tbC5mb20ub2JqX2luc3QudHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fYXR0cl90YWcsCisrCQkJeyAiRk9NIEF0dHJpYnV0ZSBJRCIsICJvbWwuZm9tLmF0dHJfaWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9mb21fYXR0cl92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfbGVuLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgTGVuZ3RoIiwgIm9tbC5mb20uYXR0cl9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdmFsLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgVmFsdWUiLCAib21sLmZvbS5hdHRyX3ZhbCIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysKKysKKysKKysJCS8qIE9NTCBBdHRyaWJ1dGVzICovCisrCQl7ICZoZl9hdHRyX2FkbV9zdGF0ZSwKKysJCQl7ICJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIsICJvbWwuZm9tLmF0dHIuYWRtX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYWRtX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS5hdHRyLmFyZmNuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX29wZXJfc3RhdGUsCisrCQkJeyAiT3BlcmF0aW9uYWwgU3RhdGUiLCAib21sLmZvbS5hdHRyLm9wZXJfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9vcGVyX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXZhaWxfc3RhdGUsCisrCQkJeyAiQXZhaWxhYmlsaXR5IFN0YXR1cyIsICJvbWwuZm9tLmF0dHIuYXZhaWxfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9hdmFpbF9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2V2ZW50X3R5cGUsCisrCQkJeyAiRXZlbnQgVHlwZSIsICJvbWwuZm9tLmF0dHIuZXZlbnRfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2V2ZW50X3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9zZXZlcml0eSwKKysJCQl7ICJTZXZlcml0eSIsICJvbWwuZm9tLmF0dHIuc2V2ZXJpdHkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9zZXZlcml0eV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JjY2hfYXJmY24sCisrCQkJeyAiQkNDSCBBUkZDTiIsICJvbWwuZm9tLmF0dHIuYmNjaF9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkFSRkNOIG9mIHRoZSBCQ0NIIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20uYXR0ci5ic2ljIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENkb2UiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZXN0X25vLAorKwkJCXsgIlRlc3QgTnVtYmVyIiwgIm9tbC5mb20uYXR0ci50ZXN0X25vIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfdGVzdF9ub192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RzYywKKysJCQl7ICJUU0MiLCAib21sLmZvbS5hdHRyLnRzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RlaSwKKysJCQl7ICJURUkiLCAib21sLmZvbS5hdHRyLnRlaSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfYnRzcCwKKysJCQl7ICJCVFMgRTEgUG9ydCIsICJvbWwuZm9tLmF0dHIuYWJpc19jaC5idHNfcG9ydCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfdHNsb3QsCisrCQkJeyAiRTEgVGltZXNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2gudGltZXNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3NzbG90LAorKwkJCXsgIkUxIFN1YnNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guc3Vic2xvdCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9nc21fdGltZSwKKysJCQl7ICJHU00gVGltZSIsICJvbWwuZm9tLmF0dHIuZ3NtX3RpbWUiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJHU00gVGltZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2NoYW5fY29tYiwKKysJCQl7ICJDaGFubmVsIENvbWJpbmF0aW9uIiwgIm9tbC5mb20uYXR0ci5jaGFuX2NvbWIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9jaGFuX2NvbWJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJLyogSVAgQWNjZXNzICovCisrCQl7ICZoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV90YWciLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKGlwYWNjX3Rlc3RyZXNfaWVfdmFscyksIDAsCisrCQkJICAiSW5mb3JtYXRpb24gRWxlbWVudCBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0IFJlc3VsdCAiCisrCQkJICAib2YgaXAuYWNjZXNzIEJUUyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSBMZW5ndGgiLAorKwkJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhX2xlbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkxlbmd0aCBvZiBpcC5hY2Nlc3MgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdGVzdF9yZXMsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IiwgIm9tbC5mb20udGVzdHJlcC5yZXN1bHQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKGlwYWNjX3Rlc3RfcmVzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCXsgIlJ4IExldmVsIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfcnhsZXYiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHhmYzAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2X2IiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS50ZXN0cmVwLmlwYV9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAzZmYsICJBUkZDTiIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mX3F1YWwsCisrCQkJeyAiRnJlcXVlbmN5IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmVxX3F1YWwiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweGZjLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJeyAiRnJlcXVlbmN5IEVycm9yIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9lcnIiLAorKwkJCSAgRlRfSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCXsgIlJ4IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5yeF9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHg3LCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcywKKysJCQl7ICJGcmFtZSBPZmZzZXQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZV9vZmZzZXQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQl7ICJGcmFtZSBOdW1iZXIgT2Zmc2V0IiwKKysJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyYW1lbnJfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9ic2ljLAorKwkJCXsgIkJTSUMiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5ic2ljIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHgzZiwKKysJCQkgICJCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9jZWxsX2lkLAorKwkJCXsgIkNlbGwgSUQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5jZWxsX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfaXAsCisrCQkJeyAiQlNDIFJTTCBJUCBBZGRyZXNzIiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgICJJUCBBZGRyZXNzIHRvIHdoaWNoIHRoZSBCVFMgZXN0YWJsaXNoZXMgIgorKwkJCSAgInRoZSBSU0wgbGluayIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfcG9ydCwKKysJCQl7ICJCU0MgUlNMIFRDUCBQb3J0IiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJQb3J0IG51bWJlciB0byB3aGljaCB0aGUgQlNUIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJeyAiUHJpbWFyeSBPTUwgSVAgQWRkcmVzcyIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyBvZiB0aGUgQlNDIGZvciB0aGUgcHJpbWFyeSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQl7ICJQcmltYXJ5IE9NTCBUQ1AgUG9ydCIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVENQIFBvcnQgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcmx5IE9NTCBsaW5rIiwKKysJCQkgIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lLAorKwkJCXsgIkxvY2F0aW9uIE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS5sb2NfbmFtZSIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3VuaXRfbmFtZSwKKysJCQl7ICJVbml0IE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X2lkLAorKwkJCXsgIlVuaXQgSUQiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X2lkIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfZmxhZ3MsCisrCQkJeyAiTlZSQU0gQ29uZmlnIEZsYWdzIiwgIm9tbC5mb20uYXR0ci5pcGEubnZfZmxhZ3MiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQl7ICJOVlJBTSBDb25maWcgTWFzayIsICJvbWwuZm9tLmF0dHIuaXBhLm52X21hc2siLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJiaXMiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJiaXMiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMnRlciIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjLAorKwkJCXsgIkNlbGwgQ2hhbm5lbCBEZXNjcmlwdGlvbiIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEuY2hhbl9kZXNjIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJeyAiTlMgTGluayBJUCBTb3VyY2UgUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX3Nwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJeyAiTlMgTGluayBJUCBEZXN0aW5hdGlvbiBBZGRyIiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5uc2xfZGFkZHIiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2Rwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2VpLAorKwkJCXsgIk5TRUkiLCAib21sLmZvbS5hdHRyLmlwYS5uc2VpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc3ZjaSwKKysJCQl7ICJOU1ZDSSIsICJvbWwuZm9tLmF0dHIuaXBhLm5zdmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9idmNpLAorKwkJCXsgIkJWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5idmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yYWMsCisrCQkJeyAiUkFDIiwgIm9tbC5mb20uYXR0ci5pcGEucmFjIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJSb3V0aW5nIEFyZWEgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCX07CisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfb21sLAorKwkJJmV0dF9vbWxfZm9tLAorKwkJJmV0dF9vbWxfZm9tX2F0dCwKKysJfTsKKysKKysJbW9kdWxlX3QgKm9tbF9tb2R1bGU7CisrCisrCXByb3RvX2FiaXNfb21sID0gcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkdTTSBBLWJpcyBPTUwiLCAiT01MIiwKKysJCQkJCQkgImdzbV9hYmlzX29tbCIpOworKworKwlwcm90b19yZWdpc3Rlcl9maWVsZF9hcnJheShwcm90b19hYmlzX29tbCwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworKworKwlyZWdpc3Rlcl9kaXNzZWN0b3IoImdzbV9hYmlzX29tbCIsIGRpc3NlY3RfYWJpc19vbWwsIHByb3RvX2FiaXNfb21sKTsKKysKKysKKysJb21sX21vZHVsZSA9IHByZWZzX3JlZ2lzdGVyX3Byb3RvY29sKHByb3RvX2FiaXNfb21sLCBwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCk7CisrCXByZWZzX3JlZ2lzdGVyX2Jvb2xfcHJlZmVyZW5jZShvbWxfbW9kdWxlLCAidXNlX2lwYWNjZXNzX29tbCIsCisrCQkgICAgIlVzZSBuYW5vQlRTIGRlZmluaXRpb25zIiwKKysJCSAgICAiVXNlIGlwYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIE9NTCIsCisrCQkgICAgJmdsb2JhbF9vbWxfdXNlX25hbm9fYnRzKTsKKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgYWJpc19vbWxfaGFuZGxlOworKworKwlhYmlzX29tbF9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCWRpc3NlY3Rvcl9hZGQoImxhcGQuZ3NtLnNhcGkiLCBMQVBEX0dTTV9TQVBJX09NX1BST0MsIGFiaXNfb21sX2hhbmRsZSk7CisrfQorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gL2Rldi9udWxsCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK0BAIC0wLDAgKzEsNzg2IEBACisrLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisrICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKysKKysvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKysgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisrICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisrICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKysgKgorKyAqLworKworKyNpZm5kZWYgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrI2RlZmluZSBfX1BBQ0tFVF9BQklTX09NTF9IX18KKysKKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmggKi8KKysKKysvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KKytzdHJ1Y3QgYWJpc19vbV9oZHIgeworKwlndWludDgJbWRpc2M7CisrCWd1aW50OAlwbGFjZW1lbnQ7CisrCWd1aW50OAlzZXF1ZW5jZTsKKysJZ3VpbnQ4CWxlbmd0aDsKKysJZ3VpbnQ4CWRhdGFbMF07CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrI2RlZmluZSBBQklTX09NX01ESVNDX0ZPTQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NTUkJCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NQU5VRgkJMHgxMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfT05MWQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX01JRERMRQkweDIwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9MQVNUCQkweDEwCisrCisrc3RydWN0IGFiaXNfb21fb2JqX2luc3QgeworKwlndWludDgJYnRzX25yOworKwlndWludDgJdHJ4X25yOworKwlndWludDgJdHNfbnI7CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrc3RydWN0IGFiaXNfb21fZm9tX2hkciB7CisrCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW9ial9jbGFzczsKKysJc3RydWN0IGFiaXNfb21fb2JqX2luc3QJb2JqX2luc3Q7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9GT01fSERSX1NJWkUJKHNpemVvZihzdHJ1Y3QgYWJpc19vbV9oZHIpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpKQorKworKy8qIFNlY3Rpb24gOS4xOiBNZXNzYWdlIFR5cGVzICovCisrZW51bSBhYmlzX25tX21zZ3R5cGUgeworKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0xPQURfSU5JVAkJCT0gMHgwMSwKKysJTk1fTVRfTE9BRF9JTklUX0FDSywKKysJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisrCU5NX01UX0xPQURfU0VHLAorKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisrCU5NX01UX0xPQURfQUJPUlQsCisrCU5NX01UX0xPQURfRU5ELAorKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisrCU5NX01UX0xPQURfRU5EX05BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVEsCQkvKiBCVFMtPkJTQyAqLworKwlOTV9NVF9TV19BQ1RfUkVRX0FDSywKKysJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorKwlOTV9NVF9BQ1RJVkFURV9TVywJCS8qIEJTQy0+QlRTICovCisrCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKysJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKysJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJCS8qIDB4MTAgKi8KKysJLyogQS1iaXMgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorKwlOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKysJTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DT05OX01EUk9QX0xJTksJCT0gMHgzMSwKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisrCS8qIEFpciBJbnRlcmZhY2UgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9TRVRfQlRTX0FUVFIJCT0gMHg0MSwKKysJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKysJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9DSEFOX0FUVFIsCisrCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisrCS8qIFRlc3QgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisrCU5NX01UX1BFUkZfVEVTVF9BQ0ssCisrCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorKwlOTV9NVF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKysJTk1fTVRfU1RPUF9URVNULAorKwlOTV9NVF9TVE9QX1RFU1RfQUNLLAorKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKysJLyogU3RhdGUgTWFuYWdlbWVudCBhbmQgRXZlbnQgUmVwb3J0IE1lc3NhZ2VzICovCisrCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUAk9IDB4NjEsCisrCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUCwKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TCQk9IDB4OTMsCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisrCS8qIEVxdWlwbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0NIQU5HRU9WRVIJCT0gMHg3MSwKKysJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisrCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKysJTk1fTVRfT1BTVEFSVCwKKysJTk1fTVRfT1BTVEFSVF9BQ0ssCisrCU5NX01UX09QU1RBUlRfTkFDSywKKysJTk1fTVRfUkVJTklULAorKwlOTV9NVF9SRUlOSVRfQUNLLAorKwlOTV9NVF9SRUlOSVRfTkFDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VULAkJLyogQlMxMTogZ2V0IGFsYXJtID8hPyAqLworKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkYJCT0gMHg5MCwKKysJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorKwkvKiBNZWFzdXJlbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorKwlOTV9NVF9NRUFTX1JFU19SRVNQLAorKwlOTV9NVF9TVE9QX01FQVMsCisrCU5NX01UX1NUQVJUX01FQVMsCisrCS8qIE90aGVyIE1lc3NhZ2VzICovCisrCU5NX01UX0dFVF9BVFRSCQkJPSAweDgxLAorKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorKworKwlOTV9NVF9JUEFDQ19SRVNUQVJUCQk9IDB4ODcsCisrCU5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfYnMxMSB7CisrCU5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UJPSAweDc0LAorKworKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYCQk9IDB4YTMsCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYCQk9IDB4YTYsCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKCQk9IDB4YTksCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkoJCT0gMHhhYywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisrCisrCU5NX01UX0JTMTFfU0VUX0FUVFIJCT0gMHhkMCwKKysJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfQlMxMV9MTVRfU0VTU0lPTgkJPSAweGRjLAorKworKwlOTV9NVF9CUzExX0dFVF9TVEFURQkJPSAweGUzLAorKwlOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCisrCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisrCU5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywKKysJTk1fTVRfQlMxMV9SRVNUQVJUCQk9IDB4ZTcsCisrCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisrCU5NX01UX0JTMTFfRElTQ09OTkVDVAkJPSAweGU5LAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1QJCT0gMHhmMSwKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVAkJPSAweGUwLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUCT0gMHhlMywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUYJCT0gMHhlNiwKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRgkJPSAweGU5LAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1cJCT0gMHhlYywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSCQk9IDB4ZWYsCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFIJCT0gMHhmMiwKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFIJCT0gMHhmNSwKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQJPSAweGY4LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVAkJPSAweGY5LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLCT0gMHhmYywKKysJTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAorKwlOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywKKyt9OworKworK2VudW0gYWJpc19ubV9iczExX2NlbGxfYWxsb2MgeworKwlOTV9CUzExX0NBTlJfR1NNCT0gMHgwMCwKKysJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorK307CisrCisrLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK2VudW0gYWJpc19ubV9vYmpfY2xhc3MgeworKwlOTV9PQ19TSVRFX01BTkFHRVIJCT0gMHgwMCwKKysJTk1fT0NfQlRTLAorKwlOTV9PQ19SQURJT19DQVJSSUVSLAorKwlOTV9PQ19DSEFOTkVMLAorKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisrCS8qIFJGVTogMDUtRkUgKi8KKysJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorKwlOTV9PQ19CUzExX0hBTkRPVkVSCQk9IDB4YTEsCisrCU5NX09DX0JTMTFfUFdSX0NUUkwJCT0gMHhhMiwKKysJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworKwlOTV9PQ19CUzExX1JBQ0sJCQk9IDB4YTQsCisrCU5NX09DX0JTMTEJCQk9IDB4YTUsCQkvKiAwMTogQUxDTyAqLworKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisrCU5NX09DX0JTMTFfRU5WQUJUU0UJCT0gMHhhOCwKKysJTk1fT0NfQlMxMV9CUE9SVAkJPSAweGE5LAorKworKwlOTV9PQ19HUFJTX05TRQkJCT0gMHhmMCwKKysJTk1fT0NfR1BSU19DRUxMCQkJPSAweGYxLAorKwlOTV9PQ19HUFJTX05TVkMwCQk9IDB4ZjIsCisrCU5NX09DX0dQUlNfTlNWQzEJCT0gMHhmMywKKysKKysJTk1fT0NfTlVMTAkJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrZW51bSBhYmlzX25tX2F0dHIgeworKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKysJTk1fQVRUX0FERF9JTkZPLAorKwlOTV9BVFRfQUREX1RFWFQsCisrCU5NX0FUVF9BRE1fU1RBVEUsCisrCU5NX0FUVF9BUkZDTl9MSVNULAorKwlOTV9BVFRfQVVUT05fUkVQT1JULAorKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorKwlOTV9BVFRfQkNDSF9BUkZDTiwKKysJTk1fQVRUX0JTSUMsCisrCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorKwlOTV9BVFRfQ0NDSF9MX0lfUCwKKysJTk1fQVRUX0NDQ0hfTF9ULAorKwlOTV9BVFRfQ0hBTl9DT01CLAorKwlOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCisrCU5NX0FUVF9ERVNULAorKwkvKiByZXMgKi8KKysJTk1fQVRUX0VWRU5UX1RZUEUJPSAweDExLCAvKiBCUzExOiBmaWxlIGRhdGEgPyE/ICovCisrCU5NX0FUVF9GSUxFX0lELAorKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorKwlOTV9BVFRfR1NNX1RJTUUsCisrCU5NX0FUVF9IU04sCisrCU5NX0FUVF9IV19DT05GSUcsCisrCU5NX0FUVF9IV19ERVNDLAorKwlOTV9BVFRfSU5UQVZFX1BBUkFNLAorKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorKwlOTV9BVFRfTElTVF9SRVFfQVRUUiwKKysJTk1fQVRUX01BSU8sCisrCU5NX0FUVF9NQU5VRl9TVEFURSwKKysJTk1fQVRUX01BTlVGX1RIUkVTSCwKKysJTk1fQVRUX01BTlVGX0lELAorKwlOTV9BVFRfTUFYX1RBLAorKwlOTV9BVFRfTURST1BfTElOSywJLyogMHgyMCAqLworKwlOTV9BVFRfTURST1BfTkVYVCwKKysJTk1fQVRUX05BQ0tfQ0FVU0VTLAorKwlOTV9BVFRfTlkxLAorKwlOTV9BVFRfT1BFUl9TVEFURSwKKysJTk1fQVRUX09WRVJMX1BFUklPRCwKKysJTk1fQVRUX1BIWVNfQ09ORiwKKysJTk1fQVRUX1BPV0VSX0NMQVNTLAorKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorKwlOTV9BVFRfUFJPQl9DQVVTRSwKKysJTk1fQVRUX1JBQ0hfQl9USFJFU0gsCisrCU5NX0FUVF9MREFWR19TTE9UUywKKysJTk1fQVRUX1JBRF9TVUJDLAorKwlOTV9BVFRfUkZfTUFYUE9XUl9SLAorKwlOTV9BVFRfU0lURV9JTlBVVFMsCisrCU5NX0FUVF9TSVRFX09VVFBVVFMsCisrCU5NX0FUVF9TT1VSQ0UsCQkvKiAweDMwICovCisrCU5NX0FUVF9TUEVDX1BST0IsCisrCU5NX0FUVF9TVEFSVF9USU1FLAorKwlOTV9BVFRfVDIwMCwKKysJTk1fQVRUX1RFSSwKKysJTk1fQVRUX1RFU1RfRFVSLAorKwlOTV9BVFRfVEVTVF9OTywKKysJTk1fQVRUX1RFU1RfUkVQT1JULAorKwlOTV9BVFRfVlNXUl9USFJFU0gsCisrCU5NX0FUVF9XSU5ET1dfU0laRSwKKysJLyogUmVzICAqLworKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMJPSAweDNkLAorKwlOTV9BVFRfQlMxMV9UWFBXUgk9IDB4M2UsCisrCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX1RTQwkJPSAweDQwLAorKwlOTV9BVFRfU1dfQ09ORklHLAorKwlOTV9BVFRfU1dfREVTQ1IsCisrCU5NX0FUVF9TRVZFUklUWSwKKysJTk1fQVRUX0dFVF9BUkksCisrCU5NX0FUVF9IV19DT05GX0NIRywKKysJTk1fQVRUX09VVFNUX0FMQVJNLAorKwlOTV9BVFRfRklMRV9EQVRBLAorKwlOTV9BVFRfTUVBU19SRVMsCisrCU5NX0FUVF9NRUFTX1RZUEUsCisrCisrCU5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PCT0gMHg0YywKKysJTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8JPSAweDRmLAorKworKwlOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTAk9IDB4NTUsCisrCU5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRQk9IDB4NTgsCisrCisrCU5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcJPSAweDYwLAorKwlOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAorKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorKwlOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwKKysJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUwk9IDB4NjYsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVFJDX0hBTkRPCT0gMHg2OCwKKysJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMCT0gMHg2OSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9DVFJMX1JMRlcJPSAweDZiLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8JPSAweDZjLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKysJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTAkJPSAweDZlLAorKworKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisrCU5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVAk9IDB4ODEsCisrCU5NX0FUVF9JUEFDQ19TU1JDCQk9IDB4ODIsCQkvKiBSVFAgU3luYyBTb3VyY2UgKi8KKysJTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFCT0gMHg4MywKKysJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisrCU5NX0FUVF9JUEFDQ19TVFJFQU1fSUQJCT0gMHg4NSwKKysJTk1fQVRUX0lQQUNDX05WX0ZMQUdTCQk9IDB4ODYsCisrCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRwk9IDB4ODgsCisrCU5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRwk9IDB4ODksCisrCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworKwlOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHCQk9IDB4OGIsCQkvKiBJUCBnYXRld2F5ICovCisrCU5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUJPSAweDhjLAorKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorKwlOTV9BVFRfSVBBQ0NfTE9DQVRJT04JCT0gMHg4ZSwJCS8qIHN0cmluZyBkZXNjcmliaW5nIGxvY2F0aW9uICovCisrCU5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHCQk9IDB4OGYsCisrCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKysJTk1fQVRUX0lQQUNDX1VOSVRfSUQJCT0gMHg5MSwJCS8qIFNpdGUvQlRTL1RSWCAqLworKwlOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQJPSAweDkyLAorKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworKwlOTV9BVFRfSVBBQ0NfU05NUF9DRkcJCT0gMHg5NCwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUCT0gMHg5NSwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAkJLyogZmFsbGJhY2sgdGltZW91dCAqLworKwlOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRwkJPSAweDk3LAorKwlOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUwkJPSAweDk4LAorKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCQkvKiBDZWxsIEdsb2JhbCBJRCAqLworKwlOTV9BVFRfSVBBQ0NfUkFDCQk9IDB4OWEsCisrCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisrCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcJPSAweDljLAorKwlOTV9BVFRfSVBBQ0NfTlNFSQkJPSAweDlkLAorKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorKwlOTV9BVFRfSVBBQ0NfTlNWQ0kJCT0gMHg5ZiwKKysJTk1fQVRUX0lQQUNDX05TX0NGRwkJPSAweGEwLAorKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisrCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRwk9IDB4YTIsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHCQk9IDB4YTMsCisrCU5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QJPSAweGE0LAorKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorKwlOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wJPSAweGE2LAorKwlOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUwk9IDB4YTcsCisrCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzIJCT0gMHhhOSwKKysJTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUCT0gMHhhYSwKKysJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zCQk9IDB4YWMsCisrCU5NX0FUVF9JUEFDQ19TU0xfQ0ZHCQk9IDB4YWQsCisrCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorKwlOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURQk9IDB4YWYsCisrCU5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFCQk9IDB4YjAsCisrCisrCisrCU5NX0FUVF9CUzExX1JGX1JFU19JTkRfUEVSCT0gMHg4ZiwKKysKKysJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKysJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRQk9IDB4OTEsCisrCU5NX0FUVF9CUzExX1RJTUVSX0hPX1JFUVVFU1QJPSAweDkyLAorKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorKwlOTV9BVFRfQlMxMV9UU1lOQwkJPSAweDk0LAorKwlOTV9BVFRfQlMxMV9UVFJBVQkJPSAweDk1LAorKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorKwlOTV9BVFRfQlMxMV9UUlhfQVJFQQkJPSAweDlmLAorKworKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNICT0gMHhhMCwKKysJTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTCT0gMHhhMSwKKysJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisrCU5NX0FUVF9CUzExX0NDTEtfVFlQRQkJPSAweGE0LAorKwlOTV9BVFRfQlMxMV9JTlBfSU1QRURBTkNFCT0gMHhhYSwKKysJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKysJTk1fQVRUX0JTMTFfTElORV9DRkcJCT0gMHhhYywKKysJTk1fQVRUX0JTMTFfTElfUE9SVF8xCQk9IDB4YWQsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorKworKwlOTV9BVFRfQlMxMV9MMV9SRU1fQUxNX1RZUEUJPSAweGIwLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TQUZFVFkJPSAweGJjLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NUT1JFRAk9IDB4YmQsCisrCisrCU5NX0FUVF9CUzExX1ZFTkRPUl9OQU1FCQk9IDB4YzEsCisrCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERQk9IDB4YzUsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKysJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUJPSAweGM3LAorKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWCT0gMHhjOCwKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisrCisrCU5NX0FUVF9CUzExX0wxX0NPTlRST0xfVFMJPSAweGQ4LAorKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX1JFUAk9IDB4ZGQsCisrCisrCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKysKKysJTk1fQVRUX0JTMTFfQlRTX1NUQVRFCQk9IDB4ZjAsCisrCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisrCU5NX0FUVF9CUzExX1BMTAkJCT0gMHhmMiwKKysJTk1fQVRUX0JTMTFfUlhfT0ZGU0VUCQk9IDB4ZjMsCisrCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisrCU5NX0FUVF9CUzExX1BMTF9NT0RFCQk9IDB4ZmMsCisrCU5NX0FUVF9CUzExX1BBU1NXT1JECQk9IDB4ZmQsCisrfTsKKysjZGVmaW5lIE5NX0FUVF9CUzExX0ZJTEVfREFUQQlOTV9BVFRfRVZFTlRfVFlQRQorKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrZW51bSBhYmlzX25tX2FkbV9zdGF0ZSB7CisrCU5NX1NUQVRFX0xPQ0tFRAkJPSAweDAxLAorKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisrCU5NX1NUQVRFX1NIVVRET1dOCT0gMHgwMywKKysJTk1fU1RBVEVfTlVMTAkJPSAweGZmLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKysJTk1fQ0hBTkNfVENIRnVsbAk9IDB4MDAsCisrCU5NX0NIQU5DX1RDSEhhbGYJPSAweDAxLAorKwlOTV9DSEFOQ19UQ0hIYWxmMgk9IDB4MDIsCisrCU5NX0NIQU5DX1NEQ0NICQk9IDB4MDMsCisrCU5NX0NIQU5DX21haW5CQ0NICT0gMHgwNCwKKysJTk1fQ0hBTkNfQkNDSENvbWIJPSAweDA1LAorKwlOTV9DSEFOQ19CQ0NICQk9IDB4MDYsCisrCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCisrCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytlbnVtIGFiaXNfbm1fZXZlbnRfdHlwZSB7CisrCU5NX0VWVF9DT01NX0ZBSUwJPSAweDAwLAorKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKysJTk1fRVZUX1BST0NfRkFJTAk9IDB4MDIsCisrCU5NX0VWVF9FUVVJUF9GQUlMCT0gMHgwMywKKysJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCisrfTsKKysKKysvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK2VudW0gYWJpc19ubV9zZXZlcml0eSB7CisrCU5NX1NFVkVSX0NFQVNFRAkJPSAweDAwLAorKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisrCU5NX1NFVkVSX01BSk9SCQk9IDB4MDIsCisrCU5NX1NFVkVSX01JTk9SCQk9IDB4MDMsCisrCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorKwlOTV9TRVZFUl9JTkRFVEVSTUlOQVRFCT0gMHgwNSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQzOiBQcm9iYWJsZSBDYXVzZSBUeXBlICovCisrZW51bSBhYmlzX25tX3BjYXVzZV90eXBlIHsKKysJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisrCU5NX1BDQVVTRV9UX0dTTQkJPSAweDAyLAorKwlOTV9QQ0FVU0VfVF9NQU5VRgk9IDB4MDMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisrCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKysJTk1fTkFDS19JTkNPUlJfU1RSVUNUCQk9IDB4MDEsCisrCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorKwlOTV9OQUNLX09CSkNMQVNTX0lOVkFMCQk9IDB4MDUsCisrCU5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUAk9IDB4MDYsCisrCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorKwlOTV9OQUNLX1RSWE5SX1VOS04JCT0gMHgwOCwKKysJTk1fTkFDS19PQkpJTlNUX1VOS04JCT0gMHgwOSwKKysJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKysJTk1fTkFDS19BVFRSSURfTk9UU1VQUAkJPSAweDBkLAorKwlOTV9OQUNLX1BBUkFNX1JBTkdFCQk9IDB4MGUsCisrCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKysJTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUAk9IDB4MTAsCisrCU5NX05BQ0tfQ0FOVF9QRVJGT1JNCQk9IDB4MTEsCisrCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfUkVTX05PVElNUEwJCT0gMHgxOSwKKysJTk1fTkFDS19SRVNfTk9UQVZBSUwJCT0gMHgxYSwKKysJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisrCU5NX05BQ0tfVEVTVF9OT1RTVVBQCQk9IDB4MWMsCisrCU5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIJCT0gMHgxZCwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorKwlOTV9OQUNLX1RFU1RfTk9USU5JVAkJPSAweDFmLAorKwlOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRQk9IDB4MjAsCisrCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKysJTk1fTkFDS19URVNUX05PU1RPUAkJPSAweDIyLAorKwlOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHCT0gMHgyMywKKysJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKysJTk1fTkFDS19GSUxFX05PVEFWQUlMCQk9IDB4MjYsCisrCU5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURQk9IDB4MjcsCisrCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorKwlOTV9OQUNLX1dBSVQJCQk9IDB4MjksCisrCU5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QJPSAweDJhLAorKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorKwlOTV9OQUNLX01FQVNfTk9UU1RBUlQJCT0gMHgyYywKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEgKi8KKytzdHJ1Y3QgYWJpc19ubV9jaGFubmVsIHsKKysJZ3VpbnQ4CWF0dHJpYjsKKysJZ3VpbnQ4CWJ0c19wb3J0OworKwlndWludDgJdGltZXNsb3Q7CisrCWd1aW50OAlzdWJzbG90OworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKy8qIFNpZW1lbnMgQlMtMTEgc3BlY2lmaWMgb2JqZWN0cyBpbiB0aGUgU2llbmVtc0hXICgweEE1KSBvYmplY3QgY2xhc3MgKi8KKytlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKysJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisrCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKysJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorKwlCUzExX09CSl9MSQkJPSAweDA3LAorKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworK307CisrCisrZW51bSBhYmlzX2JzMTFfdHJ4X3Bvd2VyIHsKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzJXCT0gMHgwNiwKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorKwlCUzExX1RSWF9QT1dFUl9HU01fODBtVwk9IDB4MDgsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XCT0gMHgwOSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzFXNgk9IDB4MGIsCisrCUJTMTFfVFJYX1BPV0VSX0RDU181MDBtVz0gMHgwYywKKysJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorK307CisrCisrZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworKwlCUzExX0xJX1BMTF9MT0NLRUQJPSAyLAorKwlCUzExX0xJX1BMTF9TVEFOREFMT05FCT0gMywKKyt9OworKworK2VudW0gYWJpc19iczExX3BoYXNlIHsKKysJQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQJCT0gMHgwMSwKKysJQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRAk9IDB4MTEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKysJQlMxMV9TVEFURV9MT0FEX0ZBSUxFRAkJPSAweDMxLAorKwlCUzExX1NUQVRFX0xPQURfRElBR05PU1RJQwk9IDB4NDEsCisrCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorKwlCUzExX1NUQVRFX1dBUk1fVVBfMgkJPSAweDUyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGRwkJPSAweDYyLAorKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisrCUJTMTFfU1RBVEVfTE9BRF9NQkNDVQkJPSAweDkyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yCT0gMHhBMiwKKysJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKysJQlMxMV9TVEFURV9BQklTX0xPQUQJCT0gMHgxMywKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0X25vIHsKKysJTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVAk9IDB4MDEsCisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKCT0gMHgwMywKKysJTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UJPSAweDQwLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQwk9IDB4NDIsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8JPSAweDQzLAorKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKysJTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUgk9IDB4NDUsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SCT0gMHg0NiwKKyt9OworKworKy8qIGZpcnN0IGJ5dGUgYWZ0ZXIgbGVuZ3RoIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworKwlOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MJPSAwLAorKwlOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQJPSAxLAorKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKysJTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMCT0gMywKKysJTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVECT0gNCwKKyt9OworKworKy8qIGludGVybmFsIElFIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisrCU5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QJPSAzLAorKwlOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFCT0gNCwKKysJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKysJTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMJPSA4LAorKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUgkJPSAxOCwKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9zcmMvYWJpc19ubS5jICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQUREX1RFWFRdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQURNX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BVVRPTl9SRVBPUlRdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfQlNJQ10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlRTX0FJUl9USU1FUl0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0NDSF9MX1RdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0hBTl9DT01CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfREVTVF0gPQkJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfRVZFTlRfVFlQRV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfVkVSU0lPTl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9HU01fVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJLy9CUzExIFtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9JTlRBVkVfUEFSQU1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSU5URVJGX0JPVU5EXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQUlPXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFYX1RBXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTURST1BfTkVYVF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9OQUNLX0NBVVNFU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09QRVJfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfT1ZFUkxfUEVSSU9EXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9DTEFTU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9SQUNIX0JfVEhSRVNIXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTERBVkdfU0xPVFNdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUkZfTUFYUE9XUl9SXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfSU5QVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TT1VSQ0VdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU1BFQ19QUk9CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVDIwMF0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDcgfSwKKysJCVtOTV9BVFRfVEVJXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9URVNUX05PXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RFU1RfUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1dJTkRPV19TSVpFXSA9IAkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9UU0NdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TRVZFUklUWV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfR0VUX0FSSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfT1VUU1RfQUxBUk1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9EQVRBXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrI2lmIDAKKysJCS8qIEJTMTEgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUVdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWXSA9eyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQlRTX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRTFfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExfTU9ERV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BMTF0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ldID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbMHg5NV0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysjZW5kaWYKKysJCS8qIGlwLmFjY2VzcyBzcGVjaWZpY3MgKi8KKysJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9JUEFDQ19TRUNfT01MX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0lGX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA4IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0dXX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAxMiB9LAorKwkJW05NX0FUVF9JUEFDQ19MT0NBVElPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JBQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGR10gPXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNFSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TX0NGR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CU1NHUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19MSU5LX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GSUxFX0RBVEFdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwl9LAorK307CisrCisrI2VuZGlmIC8qIF9OTV9IICovCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaCBiL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODUxOTUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApAQCAtMCwwICsxLDEyMCBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIC9kZXYvbnVsbAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworQEAgLTAsMCArMSwxMDMgQEAKKysvKiBwYWNrZXQtbHVjZW50X2huYi5jCisrICogUm91dGluZXMgZm9yIHBhY2tldCBkaXNzZWN0aW9uIG9mIEFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICoKKysgKiBUaGlzIHByb3RvY29sIGRlY29kZXIgaXMgYmFzZWQgZW50aXJlbHkgb24gcmV2ZXJzZSBlbmdpbmVlcmluZywgaS5lLgorKyAqIG9uIGVkdWNhdGVkIGd1ZXNzZXMuCisrICoKKysgKiAkSWQ6IHBhY2tldC1sdWNlbnRfaG5iLmMgMjkyNTQgMjAwOS0wNy0zMSAxOToxOToyNVogZ2VyYWxkICQKKysgKgorKyAqIFdpcmVzaGFyayAtIE5ldHdvcmsgdHJhZmZpYyBhbmFseXplcgorKyAqIEJ5IEdlcmFsZCBDb21icyA8Z2VyYWxkQHdpcmVzaGFyay5vcmc+CisrICogQ29weXJpZ2h0IDE5OTggR2VyYWxkIENvbWJzCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKyAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlICJjb25maWcuaCIKKysjZW5kaWYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QUElfTU0JMQorKyNkZWZpbmUgTEhOQl9TQ1RQX1BQSV9HTU0JNgorKworKyNkZWZpbmUgTEhOQl9TQ1RQX1BPUlQJCTYwMDUKKysKKysjaW5jbHVkZSA8Z2xpYi5oPgorKworKyNpbmNsdWRlIDxlcGFuL3BhY2tldC5oPgorKworKy8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fbGhuYiA9IC0xOworKworK3N0YXRpYyBpbnQgaGZfbGhuYl9sZW5ndGggPSAtMTsKKysKKysvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisrc3RhdGljIGdpbnQgZXR0X2xobmIgPSAtMTsKKysKKytzdGF0aWMgZGlzc2VjdG9yX2hhbmRsZV90IHJhbmFwX2hhbmRsZTsKKysKKysvKiBDb2RlIHRvIGFjdHVhbGx5IGRpc3NlY3QgdGhlIHBhY2tldHMgKi8KKytzdGF0aWMgdm9pZAorK2Rpc3NlY3RfbGhuYih0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKworKwlpbnQgb2Zmc2V0ID0gMDsKKysJdV9pbnQxNl90IGxlbjsKKysJdHZidWZmX3QgKm5leHRfdHZiOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIkxITkIiKTsKKysJY29sX2NsZWFyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8pOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2xobmJfbGVuZ3RoLCB0dmIsIG9mZnNldCsyLCAyLCBGQUxTRSk7CisrCWxlbiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrMik7CisrCW5leHRfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQrMis2LCBsZW4tNCwgLTEpOworKworKwljYWxsX2Rpc3NlY3RvcihyYW5hcF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdHJlZSk7CisrfQorKworK3ZvaWQgcHJvdG9fcmVnaXN0ZXJfbHVjZW50X2huYih2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsmaGZfbGhuYl9sZW5ndGgsCisrCQkgeyJMZW5ndGgiLCAibGhuYi5sZW4iLAorKwkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMfQorKwkJIH0sCisrCX07CisrCisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfbGhuYiwKKysJfTsKKysKKysJcHJvdG9fbGhuYiA9CisrCSAgICBwcm90b19yZWdpc3Rlcl9wcm90b2NvbCgiQWxjYXRlbC9MdWNlbnQgSG9tZU5vZGVCIiwKKysJCQkJICAgICJMdWNlbnQgSE5CIiwgImxobmIiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fbGhuYiwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ19oYW5kb2ZmX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCWRpc3NlY3Rvcl9oYW5kbGVfdCBsaG5iX2hhbmRsZTsKKysKKysJcmFuYXBfaGFuZGxlID0gZmluZF9kaXNzZWN0b3IoInJhbmFwIik7CisrCisrCWxobmJfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9saG5iLCBwcm90b19saG5iKTsKKysKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wcGkiLCBMSE5CX1NDVFBfUFBJX01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9HTU0sIGxobmJfaGFuZGxlKTsKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wb3J0IiwgTEhOQl9TQ1RQX1BPUlQsIGxobmJfaGFuZGxlKTsKKyt9CitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK0BAIC02MDUsNiArNjA1LDcgQEAKKyAJcGFja2V0LWxvb3AuYwkJXAorIAlwYWNrZXQtbHBkLmMJCVwKKyAJcGFja2V0LWxzYy5jCQlcCisrCXBhY2tldC1sdWNlbnRfaG5iLmMJXAorIAlwYWNrZXQtbHdhcHAuYwkJXAorIAlwYWNrZXQtbHdyZXMuYwkJXAorIAlwYWNrZXQtbTJwYS5jCQlcCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmMwOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApAQCAtMCwwICsxLDY1MiBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwkyMDA5LTEwLTIxIDIzOjAzOjQxLjAwMDAwMDAwMCArMDIwMAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCTIwMDktMTAtMjIgMTA6MDI6NTEuMDAwMDAwMDAwICswMjAwCitAQCAtMiw2ICsyLDcgQEAKKyAgKiBSb3V0aW5lcyBmb3IgUmFkaW8gU2lnbmFsbGluZyBMaW5rIChSU0wpIGRpc3NlY3Rpb24uCisgICoKKyAgKiBDb3B5cmlnaHQgMjAwNywgQW5kZXJzIEJyb21hbiA8YW5kZXJzLmJyb21hbkBlcmljc3Nvbi5jb20+CisrICogQ29weXJpZ2h0IDIwMDksIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgICoKKyAgKiAkSWQ6IHBhY2tldC1yc2wuYyAyOTk0NCAyMDA5LTA5LTE2IDEzOjM5OjM3WiBtb3JyaXNzICQKKyAgKgorQEAgLTQ0LDYgKzQ1LDggQEAKKyAjaW5jbHVkZSA8ZXBhbi9sYXBkX3NhcGkuaD4KKyAKKyAjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRwLmgiCisrI2luY2x1ZGUgInBhY2tldC1ydGNwLmgiCisgCisgLyogSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisgc3RhdGljIGludCBwcm90b19yc2wJCT0gLTE7CitAQCAtMTE3LDYgKzEyMCwyNCBAQAorIHN0YXRpYyBpbnQgaGZfcnNsX3J0ZAkJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX2RlbGF5X2luZAkJCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfdGZvCQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfcwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfbQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9zdGF0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jb25uX2lkCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfcGF5bG9hZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfaXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfbG9jYWxfcG9ydAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9yZW1vdGVfaXAJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cwkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseQkJPSAtMTsKKyAKKyAvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisgc3RhdGljIGludCBldHRfcnNsID0gLTE7CitAQCAtMTc0LDYgKzE5NSwxNSBAQAorIHN0YXRpYyBpbnQgZXR0X2llX21lYXNfcmVzX25vID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfbWVzc2FnZV9pZCA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX3N5c19pbmZvX3R5cGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9zcGVlY2hfbW9kZSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5fc3RhdCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5faWQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2xvY2FsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3J0cF9wYXlsb2FkID0gLTE7CisrCisgCisgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisgZGlzc2VjdG9yX2hhbmRsZV90IGdzbV9hX2NjY2hfaGFuZGxlOworQEAgLTIwOSw4ICsyMzksMTEgQEAKKyAJeyAgMHgwNiwJCSJDb21tb24gQ2hhbm5lbCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDA4LAkJIlRSWCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDE2LAkJIkxvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzIiB9LAorKwl7ICAweDNmLAkJImlwLmFjY2VzcyBWZW5kb3IgU3BlY2lmaWMgbWVzc2FnZXMiIH0sCisgCXsgMCwJCQlOVUxMIH0KKyB9OworKyNkZWZpbmUgUlNMX01TR0RJU0NfSVBBQ0NFU1MJMHgzZgorKworIC8qCisgICogOS4yIE1FU1NBR0UgVFlQRQorICAqLworQEAgLTI3Nyw2ICszMTAsNDkgQEAKKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAjZGVmaW5lIFJTTF9NU0dfTE9DX0lORgkJCQkJNjUJLyogOC43LjEgKi8KKyAKKysvKiBWZW5kb3ItU3BlY2lmaWMgbWVzc2FnZXMgb2YgaXAuYWNjZXNzIG5hbm9CVFMuIFRoZXJlIGlzIG5vIHB1YmxpYyBkb2N1bWVudGF0aW9uCisrICogYWJvdXQgdGhvc2UgZXh0ZW5zaW9ucywgYWxsIGluZm9ybWF0aW9uIGluIHRoaXMgZGlzc2VjdG9yIGlzIGJhc2VkIG9uIGxhd2Z1bAorKyAqIHByb3RvY29sIHJldmVyc2UgZW5naW5lcmluZyBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiAqLworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUYJMHg2MAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlEJMHg2MQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQCTB4NjIKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUCTB4NDgKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSwkweDQ5CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLCTB4NGEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1QJMHg0YgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0sgMHg0YworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLIDB4NGQKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkQJCTB4NzAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfQUNLCTB4NzEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfTkFDSwkweDcyCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUCTB4NzMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1RfQUNLCTB4NzQKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1RfTkFDSwkweDc1CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0lORAkweDc2CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDCQkweDc3CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0FDSwkweDc4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX05BQ0sJMHg3OQorKworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1JUUF9DT05GSUcJCTB4ZTAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1BST1hZX1VEUAkJMHhlMQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVQJCTB4ZTIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9JUAkJMHhmMAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQJCTB4ZjEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FECQkweGYyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUCQkweGYzCisrI2RlZmluZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERQkJMHhmNAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfSVAJCTB4ZjUKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fU1RBVAkJMHhmNgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfSE9fQ19QQVJNUwkJMHhmNworKyNkZWZpbmUgUlNMX0lFX0lQQUNfQ09OTl9JRAkJMHhmOAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQJCTB4ZjkKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9KSVRfQlVGCQkweGZhCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfQ09NUFIJCTB4ZmIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMgkweGZjCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVgJCTB4ZmQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9NUExFWF9JRAkweGZlCisgCisgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworIAkgIC8qIAkwIDAgMCAwIC0gLSAtIC0gUmFkaW8gTGluayBMYXllciBNYW5hZ2VtZW50IG1lc3NhZ2VzOiAqLworQEAgLTMzOSw2ICs0MTUsMjYgQEAKKyAJeyAgMHgzZiwJIlRGTyBNT0RpZmljYXRpb24gUkVRdWVzdCIgfSwJCQkJCS8qIDguNC4zMSAqLworIAkvKiAJMCAxIC0gLSAtIC0gLSAtIExvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzOiAqLworIAl7ICAweDQxLAkiTG9jYXRpb24gSW5mb3JtYXRpb24iIH0sCQkJCQkJLyogOC43LjEgKi8KKysJLyogaXAuYWNjZXNzICovCisrCXsgIDB4NDgsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDQ5LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBBQ0siIH0sCisrCXsgIDB4NGEsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NGIsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04iIH0sCisrCXsgIDB4NGMsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRkLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NjAsCSJpcC5hY2Nlc3MgTUVBU3VyZW1lbnQgUFJFUFJPQ2Vzc2luZyBEZUZhdUxUIiB9LAorKwl7ICAweDYxLAkiaXAuYWNjZXNzIEhBTkRPb3ZlciBDQU5EaWRhdGUgRU5RdWlyeSIgfSwKKysJeyAgMHg2MiwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIFJFU1BvbnNlIiB9LAorKwl7ICAweDcwLAkiaXAuYWNjZXNzIENSQ1giIH0sCisrCXsgIDB4NzEsCSJpcC5hY2Nlc3MgQ1JDWCBBQ0siIH0sCisrCXsgIDB4NzIsCSJpcC5hY2Nlc3MgQ1JDWCBOQUNLIiB9LAorKwl7ICAweDczLAkiaXAuYWNjZXNzIE1EQ1giIH0sCisrCXsgIDB4NzQsCSJpcC5hY2Nlc3MgTURDWCBBQ0siIH0sCisrCXsgIDB4NzUsCSJpcC5hY2Nlc3MgTURDWCBOQUNLIiB9LAorKwl7ICAweDc2LAkiaXAuYWNjZXNzIERMQ1ggSU5EaWNhdGlvbiIgfSwKKysJeyAgMHg3NywJImlwLmFjY2VzcyBETENYIiB9LAorKwl7ICAweDc4LAkiaXAuYWNjZXNzIERMQ1ggQUNLIiB9LAorKwl7ICAweDc5LAkiaXAuYWNjZXNzIERMQ1ggTkFDSyIgfSwKKyAJeyAwLAkJTlVMTCB9CisgfTsKKyAKK0BAIC0zNzIsMTAgKzQ2OCwxMCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgI2RlZmluZSBSU0xfSUVfTUVTU0FHRV9JRAkJMjgKKyAKKyAjZGVmaW5lIFJTTF9JRV9TWVNfSU5GT19UWVBFCTMwCistCistCistCistCisrI2RlZmluZSBSU0xfSUVfTVNfUE9XRVJfUEFSQU0JCTMxCisrI2RlZmluZSBSU0xfSUVfQlNfUE9XRVJfUEFSQU0JCTMyCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19QQVJBTQkJMzMKKysjZGVmaW5lIFJTTF9JRV9QUkVQUk9DX01FQVMJCTM0CisgI2RlZmluZSBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORgkJCTM1CisgI2RlZmluZSBSU0xfSUVfU01TQ0JfSU5GCQkJCTM2CisgI2RlZmluZSBSU0xfSUVfRlVMTF9NU19USU1JTkdfT0ZGU0VUCTM3CitAQCAtNDc4LDYgKzU3NCwyNCBAQAorIAkJCU5vdCB1c2VkCisgCisgCSovCisrCXsgMHhlMCwJCSJTUlRQIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgMHhlMSwJCSJCU0MgUHJveHkgVURQIFBvcnQiIH0sCisrCXsgMHhlMiwJCSJCU0MgTXVsdGlwbGV4IFRpbWVvdXQiIH0sCisrCXsgMHhmMCwJCSJSZW1vdGUgSVAgQWRkcmVzcyIgfSwKKysJeyAweGYxLAkJIlJlbW90ZSBSVFAgUG9ydCIgfSwKKysJeyAweGYyLAkJIlJUUCBQYXlsb2FkIFR5cGUiIH0sCisrCXsgMHhmMywJCSJMb2NhbCBSVFAgUG9ydCIgfSwKKysJeyAweGY0LAkJIlNwZWVjaCBNb2RlIiB9LAorKwl7IDB4ZjUsCQkiTG9jYWwgSVAgQWRkcmVzcyIgfSwKKysJeyAweGY2LAkJIkNvbm5lY3Rpb24gU3RhdGlzdGljcyIgfSwKKysJeyAweGY3LAkJIkhhbmRvdmVyIEMgUGFyYW1ldGVycyIgfSwKKysJeyAweGY4LAkJIkNvbm5lY3Rpb24gSWRlbnRpZmllciIgfSwKKysJeyAweGY5LAkJIlJUUCBDU0QgRm9ybWF0IiB9LAorKwl7IDB4ZmEsCQkiUlRQIEppdHRlciBCdWZmZXIiIH0sCisrCXsgMHhmYiwJCSJSVFAgQ29tcHJlc3Npb24iIH0sCisrCXsgMHhmYywJCSJSVFAgUGF5bG9hZCBUeXBlIDIiIH0sCisrCXsgMHhmZCwJCSJSVFAgTXVsdGlwbGV4IiB9LAorKwl7IDB4ZmUsCQkiUlRQIE11bHRpcGxleCBJZGVudGlmaWVyIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKK0BAIC01MTQsNiArNjI4LDk2IEBACisgCXsgMCwJCQlOVUxMIH0KKyB9OworIAorKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gcnNsX2F0dF90bHZkZWYgPSB7CisrCS5kZWYgPSB7CisrCQlbUlNMX0lFX0NIX05PXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MSU5LX0lEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0FDVF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0JTX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTkNfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GUkFNRV9OT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9IT19SRUZdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0wxX0lORl0JCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfTDNfSU5GXQkJCT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW1JTTF9JRV9NU19JRF0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0dSUF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9QSFlfQ1RYXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUkFDSF9MT0FEXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SRVFfUkVGXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbUlNMX0lFX1JFTF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JFU09VUkNFX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9TVEFSVElOR19USU1FXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX1RJTUlOR19BRFZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NBVVNFXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUVBU19SRVNfTk9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTUVTU0FHRV9JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TWVNfSU5GT19UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAorKwkJLy9bUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9FUlJfTVNHXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GVUxMX0JDQ0hfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0JfQ01EX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfTUVTU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9JTU1fQVNTX0lORl0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NCQ0hfTE9BRF9JTkZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfQ0hfSU5EXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0dSUF9DQUxMX1JFRl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfREVTQ10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTkNIX0RSWF9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NNRF9JTkRdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVUlDXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUFJTl9DSF9SRUZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTVVMVElSQVRFX0NPTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DTlRSTF0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DT0RFQ19DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1RGT19TVEFUVVNdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTExQX0FQRFVdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9TVEFUXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJfSwKKyt9OworKworIC8qIDkuMy4xIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyICovCisgc3RhdGljIGludAorIGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQsIGdib29sZWFuIGlzX21hbmRhdG9yeSkKK0BAIC0yMDQ0LDcgKzIyNDgsNiBAQAorIAlwcm90b19pdGVtX3NldF9sZW4odGksIGxlbmd0aCsyKTsKKyAKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfaWVfbGVuZ3RoLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQlvZmZzZXQrKzsKKyAKKyAJLyogUmVjZWl2ZWQgTWVzc2FnZSAqLworIAlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQpOworQEAgLTI5MDksMTIgKzMxMTIsMTgzIEBACisgfQorIAorIHN0YXRpYyBpbnQKKytkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCQkJCSAgICBpbnQgb2Zmc2V0KQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlOworKwlndWludDMyIGxvY2FsX2FkZHIgPSAwOworKwlndWludDE2IGxvY2FsX3BvcnQgPSAwOworKwlhZGRyZXNzIHNyY19hZGRyOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSYweDdmOworKwlvZmZzZXQrKzsKKysKKysjaWYgMAorKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19JTkQ6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQkvKiBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMgkJKi8KKysJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisrCQlicmVhazsKKysJfQorKyNlbmRpZgorKwkvKiBwYXJzZSBUTFYgYXR0cmlidXRlcyAqLworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCB0YWc7CisrCQl1bnNpZ25lZCBpbnQgbGVuLCBobGVuLCBsZW5fbGVuOworKwkJY29uc3Qgc3RydWN0IHRsdl9kZWYgKnRkZWY7CisrCQlwcm90b19pdGVtICp0aTsKKysJCXByb3RvX3RyZWUgKmllX3RyZWU7CisrCisrCQl0YWcgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQl0ZGVmID0gJnJzbF9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWhsZW4gPSBsZW5fbGVuID0gbGVuID0gMDsKKysJCQlESVNTRUNUT1JfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisrCQkJYnJlYWs7CisrCQl9CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfcnNsX2llX2lkLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworKwkJaWVfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9pZV9sb2NhbF9wb3J0KTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3dpdGNoICh0YWcpIHsKKysJCWNhc2UgUlNMX0lFX0NIX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfRlJBTUVfTk86CisrCQkJZGlzc2VjdF9yc2xfaWVfZnJhbWVfbm8odHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9NU19QT1c6CisrCQkJZGlzc2VjdF9yc2xfaWVfbXNfcG93KHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9JUDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9sb2NhbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfYWRkciA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfcG9ydCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9zLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9tLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQ6CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfcGF5bG9hZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2lyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9JRDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jb25uX2lkLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9TVEFUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3R4X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzgsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEyLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzE2LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIwLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyNCwgNCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJfQorKwkJb2Zmc2V0ICs9IGxlbjsKKysJfQorKworKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9BQ0s6CisrCQkvKiBOb3RpZnkgdGhlIFJUUCBhbmQgUlRDUCBkaXNzZWN0b3JzIGFib3V0IGEgbmV3IFJUUCBzdHJlYW0gKi8KKysJCXNyY19hZGRyLnR5cGUgPSBBVF9JUHY0OworKwkJc3JjX2FkZHIubGVuID0gNDsKKysJCXNyY19hZGRyLmRhdGEgPSAoZ3VpbnQ4ICopJmxvY2FsX2FkZHI7CisrCQlydHBfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCwgMCwKKysJCQkJIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtLCAwLCBOVUxMKTsKKysJCXJ0Y3BfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCsxLCAwLAorKwkJCQkgIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtKTsKKysJCWJyZWFrOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKyBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCisgeworLQlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAltc2dfZGlzYywgbXNnX3R5cGU7CisgCisrCW1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrKykgPj4gMTsKKyAJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsb2Zmc2V0KSYweDdmOworIAlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9tc2dfdHlwZSwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysKKysJaWYgKG1zZ19kaXNjID09IFJTTF9NU0dESVNDX0lQQUNDRVNTKSB7CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQpOworKwkJcmV0dXJuIG9mZnNldDsKKysJfQorIAlvZmZzZXQrKzsKKyAKKyAJc3dpdGNoIChtc2dfdHlwZSl7CitAQCAtMzQ4Miw2ICszODU2LDE4IEBACisgCQkvKiBMTFAgQVBEVSA5LjMuNTggTSBMViAyLU4gKi8KKyAJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2xscF9hcGR1KHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisgCQlicmVhazsKKysJLyogdGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhcmUgaXAuYWNjZXNzIHNwZWNpZmljIGJ1dCBzZW50IHdpdGhvdXQKKysJICogaXAuYWNjZXNzIG1lbXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRUFTX1BQX0RFRjoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX0lOUToKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX1JFU1A6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQtMSk7CisgCWRlZmF1bHQ6CisgCQlicmVhazsKKyAJfQorQEAgLTM0ODksNiArMzg3NSw0MCBAQAorIAlyZXR1cm4gb2Zmc2V0OworIAorIH0KKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fc192YWxzW10gPSB7CisrCXsgMCwJIkdTTSBGUiBjb2RlYyAoR1NNIHR5cGUgMSwgRlMpIiB9LAorKwl7IDEsCSJHU00gRUZSIGNvZGVjIChHU00gdHlwZSAyLCBGUykiIH0sCisrCXsgMiwgCSJHU00gQU1SL0ZSIGNvZGVjIChHU00gdHlwZSAzLCBGUykiIH0sCisrCXsgMywJIkdTTSBIUiBjb2RlYyAoR1NNIHR5cGUgMSwgSFMpIiB9LAorKwl7IDUsCSJHU00gQU1SL0hSIGNvZGVjIChHU00gdHlwZSAzLCBIUykiIH0sCisrCXsgMHhmLAkiQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIFR5cGUgSUUiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fbV92YWxzW10gPSB7CisrCXsgMCwJIlNlbmQgYW5kIFJlY2VpdmUiIH0sCisrCXsgMSwJIlJlY2VpdmUgT25seSIgfSwKKysJeyAyLAkiU2VuZCBPbmx5IiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFsc1tdID0geworKwl7IDAsCSJFeHRlcm5hbCBUUkFVIGZvcm1hdCIgfSwKKysJeyAxLAkiTm9uLVRSQVUgUGFja2VkIGZvcm1hdCIgfSwKKysJeyAyLAkiVFJBVSB3aXRoaW4gdGhlIEJUUyIgfSwKKysJeyAzLAkiSVdGLUZyZWUgQlRTLUJUUyBEYXRhIiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHNbXSA9IHsKKysJeyAwLAkiOGtiL3MiIH0sCisrCXsgMSwJIjE2a2IvcyIgfSwKKysJeyAyLAkiMzJrYi9zIiB9LAorKwl7IDMsCSI2NGtiL3MiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKyBzdGF0aWMgdm9pZAorIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyB7CitAQCAtMzUxNiw3ICszOTM2LDYgQEAKKyAJCS8qIDkuMSBNZXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9tc2dfZHNjLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX1RfYml0LCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQkJb2Zmc2V0Kys7CisgCisgCQlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCByc2xfdHJlZSwgb2Zmc2V0KTsKKyAKK0BAIC0zODg2LDYgKzQzMDUsODYgQEAKKyAJCQlGVF9VSU5UOCwgQkFTRV9ERUMsIFZBTFMocnNsX2VtbHBwX3ByaW9fdmFscyksIDB4MDMsCisgCQkJTlVMTCwgSEZJTEwgfQorIAkJfSwKKysJCXsgJmhmX3JzbF9zcGVlY2hfbW9kZV9zLAorKwkJCXsgImlwLmFjY2VzcyBTcGVlY2ggTW9kZSBTIiwgInJzbC5pcGFjYy5zcGVlY2hfbW9kZV9zIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2Nfc3BtX3NfdmFscyksCisrCQkJICAweGYsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfbSwKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgTSIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfbSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9tX3ZhbHMpLAorKwkJCSAgMHhmMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX3N0YXQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gU3RhdGlzdGljcyIsInJzbC5pcGFjYy5jb25uX3N0YXQiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2Nvbm5faWQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gSUQiLAkicnNsLmlwYWNjLmNvbm5faWQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9wYXlsb2FkLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgUGF5bG9hZCBUeXBlIiwJInJzbC5pcGFjYy5ydHBfcGF5bG9hZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9kLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBEIiwgInJzbC5pcGFjYy5ydHBfY3NkX2ZtdF9kIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfZF92YWxzKSwKKysJCQkgIDB4MGYsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9jc2RfZm10X2lyLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBJUiIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfaXIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5sb2NhbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfcG9ydCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5yZW1vdGVfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX2lwLAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBJUCBBZGRyZXNzIiwJInJzbC5pcGFjYy5sb2NhbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3JlbW90ZV9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCAicnNsLmlwYWNjLnJlbW90ZV9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9wa3RzLAorKwkJCXsgIlBhY2tldHMgU2VudCIsICJyc2wuaXBhY2MuY3N0YXQudHhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3R4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X29jdGV0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X3BrdHMsCisrCQkJeyAiUGFja2V0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFJlY2VpdmVkIiwgInJzbC5pcGFjYy5jc3RhdC5yeF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9sb3N0X3BrdHMsCisrCQkJeyAiUGFja2V0cyBMb3N0IiwgInJzbC5pcGFjYy5jc3RhdC5sb3N0X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIsCisrCQkJeyAiSW50ZXItYXJyaXZhbCBKaXR0ZXIiLCAicnNsLmlwYWNjLmNzdGF0LmlhX2ppdHRlciIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksCisrCQkJeyAiQXZlcmFnZSBUeCBEZWxheSIsICJyc2wuaXBhY2MuY3N0YXQuYXZnX3R4X2RlbGF5IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisgCX07CisgCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKyAJCSZldHRfcnNsLAorQEAgLTM5NDMsNiArNDQ0MiwxNCBAQAorIAkJJmV0dF9pZV9tZWFzX3Jlc19ubywKKyAJCSZldHRfaWVfbWVzc2FnZV9pZCwKKyAJCSZldHRfaWVfc3lzX2luZm9fdHlwZSwKKysJCSZldHRfaWVfc3BlZWNoX21vZGUsCisrCQkmZXR0X2llX2Nvbm5fc3RhdCwKKysJCSZldHRfaWVfY29ubl9pZCwKKysJCSZldHRfaWVfcmVtb3RlX2lwLAorKwkJJmV0dF9pZV9yZW1vdGVfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfaXAsCisrCQkmZXR0X2llX3J0cF9wYXlsb2FkLAorIAl9OworIAorIAkvKiBSZWdpc3RlciB0aGUgcHJvdG9jb2wgbmFtZSBhbmQgZGVzY3JpcHRpb24gKi8KZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2ggYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIyOTEsNyArMjI5MSw3IEBACisgCisgCXByb3RvX3RyZWVfYWRkX3RleHQoaWVfdHJlZSwgdHZiLG9mZnNldCxsZW5ndGgsIkxheWVyIDMgbWVzc2FnZSIpOworIAluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW5ndGgsIGxlbmd0aCk7CistCS8qIGNhbGxfZGlzc2VjdG9yKGdzbV9hX2R0YXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRvcF90cmVlKTsqLworKwljYWxsX2Rpc3NlY3Rvcihnc21fYV9jY2NoX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7CisgCisgCW9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKKyAK