I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vdGltZXIuaD4KCiNpbmNsdWRlICJjcHUuaCIKCi8qCiAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCiAqLwpzdGF0aWMgdm9pZCBfX2luaXQgZG9fY3lyaXhfZGV2aWQodW5zaWduZWQgY2hhciAqZGlyMCwgdW5zaWduZWQgY2hhciAqZGlyMSkKewoJdW5zaWduZWQgY2hhciBjY3IyLCBjY3IzOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQoJLyogd2UgdGVzdCBmb3IgREVWSUQgYnkgY2hlY2tpbmcgd2hldGhlciBDQ1IzIGlzIHdyaXRhYmxlICovCglsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMgXiAweDgwKTsKCWdldEN4ODYoMHhjMCk7ICAgLyogZHVtbXkgdG8gY2hhbmdlIGJ1cyAqLwoKCWlmIChnZXRDeDg2KENYODZfQ0NSMykgPT0gY2NyMykgeyAgICAgICAvKiBubyBERVZJRCByZWdzLiAqLwoJCWNjcjIgPSBnZXRDeDg2KENYODZfQ0NSMik7CgkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIgXiAweDA0KTsKCQlnZXRDeDg2KDB4YzApOyAgLyogZHVtbXkgKi8KCgkJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IyKSA9PSBjY3IyKSAvKiBvbGQgQ3g0ODZTTEMvRExDICovCgkJCSpkaXIwID0gMHhmZDsKCQllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN4NDg2UyBBIHN0ZXAgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIpOwoJCQkqZGlyMCA9IDB4ZmU7CgkJfQoJfQoJZWxzZSB7CgkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgLyogcmVzdG9yZSBDQ1IzICovCgoJCS8qIHJlYWQgRElSMCBhbmQgRElSMSBDUFUgcmVnaXN0ZXJzICovCgkJKmRpcjAgPSBnZXRDeDg2KENYODZfRElSMCk7CgkJKmRpcjEgPSBnZXRDeDg2KENYODZfRElSMSk7Cgl9Cglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cn0KCi8qCiAqIEN4ODZfZGlyMF9tc2IgaXMgYSBIQUNLIG5lZWRlZCBieSBjaGVja19jeDY4Nl9jcHVpZC9zbG9wIGluIGJ1Z3MuaCBpbgogKiBvcmRlciB0byBpZGVudGlmeSB0aGUgQ3lyaXggQ1BVIG1vZGVsIGFmdGVyIHdlJ3JlIG91dCBvZiBzZXR1cC5jCiAqCiAqIEFjdHVhbGx5IHNpbmNlIGJ1Z3MuaCBkb2Vzbid0IGV2ZW4gcmVmZXJlbmNlIHRoaXMgcGVyaGFwcyBzb21lb25lIHNob3VsZAogKiBmaXggdGhlIGRvY3VtZW50YXRpb24gPz8/CiAqLwpzdGF0aWMgdW5zaWduZWQgY2hhciBDeDg2X2RpcjBfbXNiIF9faW5pdGRhdGEgPSAwOwoKc3RhdGljIGNoYXIgQ3g4Nl9tb2RlbFtdWzldIF9faW5pdGRhdGEgPSB7CgkiQ3g0ODYiLCAiQ3g0ODYiLCAiNXg4NiAiLCAiNng4NiIsICJNZWRpYUdYICIsICI2eDg2TVggIiwKCSJNIElJICIsICJVbmtub3duIgp9OwpzdGF0aWMgY2hhciBDeDQ4Nl9uYW1lW11bNV0gX19pbml0ZGF0YSA9IHsKCSJTTEMiLCAiRExDIiwgIlNMQzIiLCAiRExDMiIsICJTUngiLCAiRFJ4IiwKCSJTUngyIiwgIkRSeDIiCn07CnN0YXRpYyBjaGFyIEN4NDg2U19uYW1lW11bNF0gX19pbml0ZGF0YSA9IHsKCSJTIiwgIlMyIiwgIlNlIiwgIlMyZSIKfTsKc3RhdGljIGNoYXIgQ3g0ODZEX25hbWVbXVs0XSBfX2luaXRkYXRhID0gewoJIkRYIiwgIkRYMiIsICI/IiwgIj8iLCAiPyIsICJEWDQiCn07CnN0YXRpYyBjaGFyIEN4ODZfY2JbXSBfX2luaXRkYXRhID0gIj8uNXggQ29yZS9CdXMgQ2xvY2siOwpzdGF0aWMgY2hhciBjeXJpeF9tb2RlbF9tdWx0MVtdIF9faW5pdGRhdGEgPSAiMTI/PzQzIjsKc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDJbXSBfX2luaXRkYXRhID0gIjEyMjMzNDQ1IjsKCi8qCiAqIFJlc2V0IHRoZSBzbG93LWxvb3AgKFNMT1ApIGJpdCBvbiB0aGUgNjg2KEwpIHdoaWNoIGlzIHNldCBieSBzb21lIG9sZAogKiBCSU9TZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBET1MgZ2FtZXMuICBUaGlzIG1ha2VzIHRoZSB1ZGVsYXkgbG9vcAogKiB3b3JrIGNvcnJlY3RseSwgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlLgogKgogKiBGSVhNRTogb3VyIG5ld2VyIHVkZWxheSB1c2VzIHRoZSB0c2MuIFdlIGRvbid0IG5lZWQgdG8gZnJvYiB3aXRoIFNMT1AKICovCgpleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCkgX19pbml0OwoKc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2N4Njg2X3Nsb3Aoc3RydWN0IGNwdWluZm9feDg2ICpjKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglpZiAoQ3g4Nl9kaXIwX21zYiA9PSAzKSB7CgkJdW5zaWduZWQgY2hhciBjY3IzLCBjY3I1OwoKCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgkJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCgkJY2NyNSA9IGdldEN4ODYoQ1g4Nl9DQ1I1KTsKCQlpZiAoY2NyNSAmIDIpCgkJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3I1ICYgMHhmZCk7ICAvKiByZXNldCBTTE9QICovCgkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBNQVBFTiAqLwoJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCgkJaWYgKGNjcjUgJiAyKSB7IC8qIHBvc3NpYmxlIHdyb25nIGNhbGlicmF0aW9uIGRvbmUgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjYWxpYnJhdGluZyBkZWxheSBsb29wIHdpdGggU0xPUCBiaXQgcmVzZXRcbiIpOwoJCQljYWxpYnJhdGVfZGVsYXkoKTsKCQkJYy0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwoJCX0KCX0KfQoKCnN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9yZW9yZGVyKHZvaWQpCnsKCXU4IGNjcjM7CgoJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIE1lbW9yeSBhY2Nlc3MgcmVvcmRlciBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOoCAqLwoKCS8qIExvYWQvU3RvcmUgU2VyaWFsaXplIHRvIG1lbSBhY2Nlc3MgZGlzYWJsZSAoPXJlb3JkZXIgaXQpoCAqLwoJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSAmIH4weDgwKTsKCS8qIHNldCBsb2FkL3N0b3JlIHNlcmlhbGl6ZSBmcm9tIDFHQiB0byA0R0IgKi8KCWNjcjMgfD0gMHhlMDsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsKfQoKc3RhdGljIHZvaWQgX19pbml0IHNldF9jeDg2X21lbXdiKHZvaWQpCnsKCXUzMiBjcjA7CgoJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIE1lbW9yeS1Xcml0ZS1iYWNrIG1vZGUgb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOwoKCS8qIENDUjIgYml0IDI6IHVubG9jayBOVyBiaXQgKi8KCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgJiB+MHgwNCk7CgkvKiBzZXQgJ05vdCBXcml0ZS10aHJvdWdoJyAqLwoJY3IwID0gMHgyMDAwMDAwMDsKCV9fYXNtX18oIm1vdmwgJSVjcjAsJSVlYXhcblx0IgoJCSJvcmwgJTAsJSVlYXhcblx0IgoJCSJtb3ZsICUlZWF4LCUlY3IwXG4iCgkJOiA6ICJyIiAoY3IwKQoJCToiYXgiKTsKCS8qIENDUjIgYml0IDI6IGxvY2sgTlcgYml0IGFuZCBzZXQgV1QxICovCglzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpIHwgMHgxNCApOwp9CgpzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2N4ODZfaW5jKHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgY2NyMzsKCglwcmludGsoS0VSTl9JTkZPICJFbmFibGUgSW5jcmVtZW50b3Igb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOwoKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU6gICovCgkvKiBQQ1IxIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KCS8qIEluY3JlbWVudG9yIG9uLCB3aGF0ZXZlciB0aGF0IGlzICovCglzZXRDeDg2KENYODZfUENSMSwgZ2V0Q3g4NihDWDg2X1BDUjEpIHwgMHgwMik7CgkvKiBQQ1IwIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KCS8qIEluY3JlbWVudG9yIE1hcmdpbiAxMCAqLwoJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSB8IDB4MDQpOyAKCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsJLyogZGlzYWJsZSBNQVBFTiAqLwp9CgovKgogKglDb25maWd1cmUgbGF0ZXIgTWVkaWFHWCBhbmQvb3IgR2VvZGUgcHJvY2Vzc29yLgogKi8KCnN0YXRpYyB2b2lkIF9faW5pdCBnZW9kZV9jb25maWd1cmUodm9pZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXU4IGNjcjMsIGNjcjQ7Cglsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgoJLyogU3VzcGVuZCBvbiBoYWx0IHBvd2VyIHNhdmluZyBhbmQgZW5hYmxlICNTVVNQIHBpbiAqLwoJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4ODgpOwoKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOwkvKiBFbmFibGUgKi8KCQoJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKCWNjcjQgfD0gMHgzODsJCS8qIEZQVSBmYXN0LCBEVEUgY2FjaGUsIE1lbSBieXBhc3MgKi8KCQoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwoJCglzZXRfY3g4Nl9tZW13YigpOwoJc2V0X2N4ODZfcmVvcmRlcigpOwkKCXNldF9jeDg2X2luYygpOwoJCglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cn0KCgojaWZkZWYgQ09ORklHX1BDSQpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3lyaXhfNTV4MFtdID0gewoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUxMCkgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjApIH0sCgl7IH0sCn07CiNlbmRpZgoKc3RhdGljIHZvaWQgX19pbml0IGluaXRfY3lyaXgoc3RydWN0IGNwdWluZm9feDg2ICpjKQp7Cgl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjBfbXNuLCBkaXIwX2xzbiwgZGlyMSA9IDA7CgljaGFyICpidWYgPSBjLT54ODZfbW9kZWxfaWQ7Cgljb25zdCBjaGFyICpwID0gTlVMTDsKCgkvKiBCaXQgMzEgaW4gbm9ybWFsIENQVUlEIHVzZWQgZm9yIG5vbnN0YW5kYXJkIDNETm93IElEOwoJICAgM0ROb3cgaXMgSURkIGJ5IGJpdCAzMSBpbiBleHRlbmRlZCBDUFVJRCAoMSozMiszMSkgYW55d2F5ICovCgljbGVhcl9iaXQoMCozMiszMSwgYy0+eDg2X2NhcGFiaWxpdHkpOwoKCS8qIEN5cml4IHVzZWQgYml0IDI0IGluIGV4dGVuZGVkIChBTUQpIENQVUlEIGZvciBDeXJpeCBNTVggZXh0ZW5zaW9ucyAqLwoJaWYgKCB0ZXN0X2JpdCgxKjMyKzI0LCBjLT54ODZfY2FwYWJpbGl0eSkgKSB7CgkJY2xlYXJfYml0KDEqMzIrMjQsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYTU1YLCBjLT54ODZfY2FwYWJpbGl0eSk7Cgl9CgoJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKCgljaGVja19jeDY4Nl9zbG9wKGMpOwoKCUN4ODZfZGlyMF9tc2IgPSBkaXIwX21zbiA9IGRpcjAgPj4gNDsgLyogaWRlbnRpZmllcyBDUFUgImZhbWlseSIgICAqLwoJZGlyMF9sc24gPSBkaXIwICYgMHhmOyAgICAgICAgICAgICAgICAvKiBtb2RlbCBvciBjbG9jayBtdWx0aXBsaWVyICovCgoJLyogY29tbW9uIGNhc2Ugc3RlcCBudW1iZXIvcmV2IC0tIGV4Y2VwdGlvbnMgaGFuZGxlZCBiZWxvdyAqLwoJYy0+eDg2X21vZGVsID0gKGRpcjEgPj4gNCkgKyAxOwoJYy0+eDg2X21hc2sgPSBkaXIxICYgMHhmOwoKCS8qIE5vdyBjb29rOyB0aGUgb3JpZ2luYWwgcmVjaXBlIGlzIGJ5IENoYW5uaW5nIENvcm4sIGZyb20gQ3lyaXguCgkgKiBXZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZWFjaCBnZW5lcmF0aW9uOiB3ZSB3b3JrIG91dAoJICogdGhlIG1vZGVsLCBtdWx0aXBsaWVyIGFuZCBzdGVwcGluZy4gIEJsYWNrIG1hZ2ljIGluY2x1ZGVkLAoJICogdG8gbWFrZSB0aGUgc2lsaWNvbiBzdGVwL3JldiBudW1iZXJzIG1hdGNoIHRoZSBwcmludGVkIG9uZXMuCgkgKi8KCSAKCXN3aXRjaCAoZGlyMF9tc24pIHsKCQl1bnNpZ25lZCBjaGFyIHRtcDsKCgljYXNlIDA6IC8qIEN4NDg2U0xDL0RMQy9TUngvRFJ4ICovCgkJcCA9IEN4NDg2X25hbWVbZGlyMF9sc24gJiA3XTsKCQlicmVhazsKCgljYXNlIDE6IC8qIEN4NDg2Uy9EWC9EWDIvRFg0ICovCgkJcCA9IChkaXIwX2xzbiAmIDgpID8gQ3g0ODZEX25hbWVbZGlyMF9sc24gJiA1XQoJCQk6IEN4NDg2U19uYW1lW2RpcjBfbHNuICYgM107CgkJYnJlYWs7CgoJY2FzZSAyOiAvKiA1eDg2ICovCgkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CgkJcCA9IEN4ODZfY2IrMjsKCQlicmVhazsKCgljYXNlIDM6IC8qIDZ4ODYvNng4NkwgKi8KCQlDeDg2X2NiWzFdID0gJyAnOwoJCUN4ODZfY2JbMl0gPSBjeXJpeF9tb2RlbF9tdWx0MVtkaXIwX2xzbiAmIDVdOwoJCWlmIChkaXIxID4gMHgyMSkgeyAvKiA2ODZMICovCgkJCUN4ODZfY2JbMF0gPSAnTCc7CgkJCXAgPSBDeDg2X2NiOwoJCQkoYy0+eDg2X21vZGVsKSsrOwoJCX0gZWxzZSAgICAgICAgICAgICAvKiA2ODYgKi8KCQkJcCA9IEN4ODZfY2IrMTsKCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NZUklYX0FSUiwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCS8qIDZ4ODYncyBjb250YWluIHRoaXMgYnVnICovCgkJYy0+Y29tYV9idWcgPSAxOwoJCWJyZWFrOwoKCWNhc2UgNDogLyogTWVkaWFHWC9HWG0gb3IgR2VvZGUgR1hNL0dYTFYvR1gxICovCiNpZmRlZiBDT05GSUdfUENJCgkJLyogSXQgaXNuJ3QgcmVhbGx5IGEgUENJIHF1aXJrIGRpcmVjdGx5LCBidXQgdGhlIGN1cmUgaXMgdGhlCgkJICAgc2FtZS4gVGhlIE1lZGlhR1ggaGFzIGRlZXAgbWFnaWMgU01NIHN0dWZmIHRoYXQgaGFuZGxlcyB0aGUKCQkgICBTQiBlbXVsYXRpb24uIEl0IHRob3dzIGF3YXkgdGhlIGZpZm8gb24gZGlzYWJsZV9kbWEoKSB3aGljaAoJCSAgIGlzIHdyb25nIGFuZCBydWlucyB0aGUgYXVkaW8uIAoKCQkgICBCdWcyOiBWU0ExIGhhcyBhIHdyYXAgYnVnIHNvIHRoYXQgdXNpbmcgbWF4aW11bSBzaXplZCBETUEgCgkJICAgY2F1c2VzIGJhZCB0aGluZ3MuIEFjY29yZGluZyB0byBOYXRTZW1pIFZTQTIgaGFzIGFub3RoZXIKCQkgICBidWcgdG8gZG8gd2l0aCAnaGx0Jy4gSSd2ZSBub3Qgc2VlbiBhbnkgYm9hcmRzIHVzaW5nIFZTQTIKCQkgICBhbmQgWCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBpdCBlaXRoZXIgc28gd2hvIGNhcmVzIDgpLgoJCSAgIFZTQTEgd2Ugd29yayBhcm91bmQgaG93ZXZlci4KCQkqLwoKCQlwcmludGsoS0VSTl9JTkZPICJXb3JraW5nIGFyb3VuZCBDeXJpeCBNZWRpYUdYIHZpcnR1YWwgRE1BIGJ1Z3MuXG4iKTsKCQlpc2FfZG1hX2JyaWRnZV9idWdneSA9IDI7CiNlbmRpZgkJCgkJYy0+eDg2X2NhY2hlX3NpemU9MTY7CS8qIFllcCAxNksgaW50ZWdyYXRlZCBjYWNoZSB0aGF0cyBpdCAqLwogCgkJLyoKCQkgKiAgVGhlIDU1MTAvNTUyMCBjb21wYW5pb24gY2hpcHMgaGF2ZSBhIGZ1bmt5IFBJVC4KCQkgKi8gIAoJCWlmIChwY2lfZGV2X3ByZXNlbnQoY3lyaXhfNTV4MCkpCgkJCXBpdF9sYXRjaF9idWdneSA9IDE7CgoJCS8qIEdYbSBzdXBwb3J0cyBleHRlbmRlZCBjcHVpZCBsZXZlbHMgJ2FsYScgQU1EICovCgkJaWYgKGMtPmNwdWlkX2xldmVsID09IDIpIHsKCQkJLyogRW5hYmxlIGN4TU1YIGV4dGVuc2lvbnMgKEdYMSBEYXRhc2hlZXQgNTQpICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1I3LCBnZXRDeDg2KENYODZfQ0NSNyl8MSk7CgkJCQoJCQkvKiBHWGx2L0dYbS9HWDEgKi8KCQkJaWYoKGRpcjEgPj0gMHg1MCAmJiBkaXIxIDw9IDB4NTQpIHx8IGRpcjEgPj0gMHg2MykKCQkJCWdlb2RlX2NvbmZpZ3VyZSgpOwoJCQlnZXRfbW9kZWxfbmFtZShjKTsgIC8qIGdldCBDUFUgbWFya2V0aW5nIG5hbWUgKi8KCQkJcmV0dXJuOwoJCX0KCQllbHNlIHsgIC8qIE1lZGlhR1ggKi8KCQkJQ3g4Nl9jYlsyXSA9IChkaXIwX2xzbiAmIDEpID8gJzMnIDogJzQnOwoJCQlwID0gQ3g4Nl9jYisyOwoJCQljLT54ODZfbW9kZWwgPSAoZGlyMSAmIDB4MjApID8gMSA6IDI7CgkJfQoJCWJyZWFrOwoKICAgICAgICBjYXNlIDU6IC8qIDZ4ODZNWC9NIElJICovCgkJaWYgKGRpcjEgPiA3KQoJCXsKCQkJZGlyMF9tc24rKzsgIC8qIE0gSUkgKi8KCQkJLyogRW5hYmxlIE1NWCBleHRlbnNpb25zIChBcHAgbm90ZSAxMDgpICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1I3LCBnZXRDeDg2KENYODZfQ0NSNyl8MSk7CgkJfQoJCWVsc2UKCQl7CgkJCWMtPmNvbWFfYnVnID0gMTsgICAgICAvKiA2eDg2TVgsIGl0IGhhcyB0aGUgYnVnLiAqLwoJCX0KCQl0bXAgPSAoIShkaXIwX2xzbiAmIDcpIHx8IGRpcjBfbHNuICYgMSkgPyAyIDogMDsKCQlDeDg2X2NiW3RtcF0gPSBjeXJpeF9tb2RlbF9tdWx0MltkaXIwX2xzbiAmIDddOwoJCXAgPSBDeDg2X2NiK3RtcDsKICAgICAgICAJaWYgKCgoZGlyMSAmIDB4MGYpID4gNCkgfHwgKChkaXIxICYgMHhmMCkgPT0gMHgyMCkpCgkJCShjLT54ODZfbW9kZWwpKys7CgkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCgkJc2V0X2JpdChYODZfRkVBVFVSRV9DWVJJWF9BUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCQlicmVhazsKCgljYXNlIDB4ZjogIC8qIEN5cml4IDQ4NiB3aXRob3V0IERFVklEIHJlZ2lzdGVycyAqLwoJCXN3aXRjaCAoZGlyMF9sc24pIHsKCQljYXNlIDB4ZDogIC8qIGVpdGhlciBhIDQ4NlNMQyBvciBETEMgdy9vIERFVklEICovCgkJCWRpcjBfbXNuID0gMDsKCQkJcCA9IEN4NDg2X25hbWVbKGMtPmhhcmRfbWF0aCkgPyAxIDogMF07CgkJCWJyZWFrOwoKCQljYXNlIDB4ZTogIC8qIGEgNDg2UyBBIHN0ZXAgKi8KCQkJZGlyMF9tc24gPSAwOwoJCQlwID0gQ3g0ODZTX25hbWVbMF07CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCglkZWZhdWx0OiAgLyogdW5rbm93biAoc2hvdWxkbid0IGhhcHBlbiwgd2Uga25vdyBldmVyeW9uZSA7LSkgKi8KCQlkaXIwX21zbiA9IDc7CgkJYnJlYWs7Cgl9CglzdHJjcHkoYnVmLCBDeDg2X21vZGVsW2RpcjBfbXNuICYgN10pOwoJaWYgKHApIHN0cmNhdChidWYsIHApOwoJcmV0dXJuOwp9CgovKgogKiBDeXJpeCBDUFVzIHdpdGhvdXQgY3B1aWQgb3Igd2l0aCBjcHVpZCBub3QgeWV0IGVuYWJsZWQgY2FuIGJlIGRldGVjdGVkCiAqIGJ5IHRoZSBmYWN0IHRoYXQgdGhleSBwcmVzZXJ2ZSB0aGUgZmxhZ3MgYWNyb3NzIHRoZSBkaXZpc2lvbiBvZiA1LzIuCiAqIFBJSSBhbmQgUFBybyBleGhpYml0IHRoaXMgYmVoYXZpb3IgdG9vLCBidXQgdGhleSBoYXZlIGNwdWlkIGF2YWlsYWJsZS4KICovCiAKLyoKICogUGVyZm9ybSB0aGUgQ3lyaXggNS8yIHRlc3QuIEEgQ3lyaXggd29uJ3QgY2hhbmdlCiAqIHRoZSBmbGFncywgd2hpbGUgb3RoZXIgNDg2IGNoaXBzIHdpbGwuCiAqLwpzdGF0aWMgaW5saW5lIGludCB0ZXN0X2N5cml4XzUyZGl2KHZvaWQpCnsKCXVuc2lnbmVkIGludCB0ZXN0OwoKCV9fYXNtX18gX192b2xhdGlsZV9fKAoJICAgICAic2FoZlxuXHQiCQkvKiBjbGVhciBmbGFncyAoJWVheCA9IDB4MDAwNSkgKi8KCSAgICAgImRpdiAlYjJcblx0IgkvKiBkaXZpZGUgNSBieSAyICovCgkgICAgICJsYWhmIgkJLyogc3RvcmUgZmxhZ3MgaW50byAlYWggKi8KCSAgICAgOiAiPWEiICh0ZXN0KQoJICAgICA6ICIwIiAoNSksICJxIiAoMikKCSAgICAgOiAiY2MiKTsKCgkvKiBBSCBpcyAweDAyIG9uIEN5cml4IGFmdGVyIHRoZSBkaXZpZGUuLiAqLwoJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAodGVzdCA+PiA4KSA9PSAweDAyOwp9CgpzdGF0aWMgdm9pZCBjeXJpeF9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQp7CgkvKiBEZXRlY3QgQ3lyaXggd2l0aCBkaXNhYmxlZCBDUFVJRCAqLwoJaWYgKCBjLT54ODYgPT0gNCAmJiB0ZXN0X2N5cml4XzUyZGl2KCkgKSB7CgkJdW5zaWduZWQgY2hhciBkaXIwLCBkaXIxOwoJCQoJCXN0cmNweShjLT54ODZfdmVuZG9yX2lkLCAiQ3lyaXhJbnN0ZWFkIik7CgkgICAgICAgIGMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX0NZUklYOwoJICAgICAgICAKCSAgICAgICAgLyogQWN0dWFsbHkgZW5hYmxlIGNwdWlkIG9uIHRoZSBvbGRlciBjeXJpeCAqLwoJICAgIAoJICAgIAkvKiBSZXRyaWV2ZSBDUFUgcmV2aXNpb25zICovCgkgICAgCQoJCWRvX2N5cml4X2RldmlkKCZkaXIwLCAmZGlyMSk7CgoJCWRpcjA+Pj00OwkJCgkJCgkJLyogQ2hlY2sgaXQgaXMgYW4gYWZmZWN0ZWQgbW9kZWwgKi8KCQkKICAgCSAgICAgICAgaWYgKGRpcjAgPT0gNSB8fCBkaXIwID09IDMpCiAgIAkgICAgICAgIHsKCQkJdW5zaWduZWQgY2hhciBjY3IzLCBjY3I0OwoJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBDUFVJRCBvbiBDeXJpeCBwcm9jZXNzb3IuXG4iKTsKCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoJCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCgkJCWNjcjQgPSBnZXRDeDg2KENYODZfQ0NSNCk7CgkJCXNldEN4ODYoQ1g4Nl9DQ1I0LCBjY3I0IHwgMHg4MCk7ICAgICAgICAgIC8qIGVuYWJsZSBjcHVpZCAgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBNQVBFTiAqLwoJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgkJfQoJfQoJZ2VuZXJpY19pZGVudGlmeShjKTsKfQoKc3RhdGljIHN0cnVjdCBjcHVfZGV2IGN5cml4X2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKCS5jX3ZlbmRvcgk9ICJDeXJpeCIsCgkuY19pZGVudCAJPSB7ICJDeXJpeEluc3RlYWQiIH0sCgkuY19pbml0CQk9IGluaXRfY3lyaXgsCgkuY19pZGVudGlmeQk9IGN5cml4X2lkZW50aWZ5LAp9OwoKaW50IF9faW5pdCBjeXJpeF9pbml0X2NwdSh2b2lkKQp7CgljcHVfZGV2c1tYODZfVkVORE9SX0NZUklYXSA9ICZjeXJpeF9jcHVfZGV2OwoJcmV0dXJuIDA7Cn0KCi8vZWFybHlfYXJjaF9pbml0Y2FsbChjeXJpeF9pbml0X2NwdSk7CgpzdGF0aWMgc3RydWN0IGNwdV9kZXYgbnNjX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKCS5jX3ZlbmRvcgk9ICJOU0MiLAoJLmNfaWRlbnQgCT0geyAiR2VvZGUgYnkgTlNDIiB9LAoJLmNfaW5pdAkJPSBpbml0X2N5cml4LAoJLmNfaWRlbnRpZnkJPSBnZW5lcmljX2lkZW50aWZ5LAp9OwoKaW50IF9faW5pdCBuc2NfaW5pdF9jcHUodm9pZCkKewoJY3B1X2RldnNbWDg2X1ZFTkRPUl9OU0NdID0gJm5zY19jcHVfZGV2OwoJcmV0dXJuIDA7Cn0KCi8vZWFybHlfYXJjaF9pbml0Y2FsbChuc2NfaW5pdF9jcHUpOwo=