ZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luaXQvbWFpbi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvaW5pdC9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyMzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luaXQvbWFpbi5jCkBAIC0wLDAgKzEsOTYwIEBACisvKgorICogIGxpbnV4L2luaXQvbWFpbi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgR0sgMi81Lzk1ICAtICBDaGFuZ2VkIHRvIHN1cHBvcnQgbW91bnRpbmcgcm9vdCBmcyB2aWEgTkZTCisgKiAgQWRkZWQgaW5pdHJkICYgY2hhbmdlX3Jvb3Q6IFdlcm5lciBBbG1lc2JlcmdlciAmIEhhbnMgTGVybWVuLCBGZWIgJzk2CisgKiAgTW9hbiBlYXJseSBpZiBnY2MgaXMgb2xkLCBhdm9pZGluZyBib2d1cyBrZXJuZWxzIC0gUGF1bCBHb3J0bWFrZXIsIE1heSAnOTYKKyAqICBTaW1wbGlmaWVkIHN0YXJ0aW5nIG9mIGluaXQ6ICBNaWNoYWVsIEEuIEdyaWZmaXRoIDxncmlmQGFjbS5vcmc+IAorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrcHJvdGVjdG9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFydF9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGFza3N0YXRzX2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgva2V5Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlX2Nncm91cC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1jaGVjay5oPgorI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9idWdzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IGtlcm5lbF9pbml0KHZvaWQgKik7CisKK2V4dGVybiB2b2lkIGluaXRfSVJRKHZvaWQpOworZXh0ZXJuIHZvaWQgZm9ya19pbml0KHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgbWNhX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzYnVzX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBwcmlvX3RyZWVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJhZGl4X3RyZWVfaW5pdCh2b2lkKTsKKyNpZm5kZWYgQ09ORklHX0RFQlVHX1JPREFUQQorc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcm9kYXRhX3JvKHZvaWQpIHsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVEMKK2V4dGVybiB2b2lkIHRjX2luaXQodm9pZCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTE9CCitleHRlcm4gdm9pZCBzbG9iX3NpemVzX2luaXQodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIERlYnVnIGhlbHBlcjogdmlhIHRoaXMgZmxhZyB3ZSBrbm93IHRoYXQgd2UgYXJlIGluICdlYXJseSBib290dXAgY29kZScKKyAqIHdoZXJlIG9ubHkgdGhlIGJvb3QgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgd2l0aCBJUlEgZGlzYWJsZWQuICBUaGlzIG1lYW5zCisgKiB0d28gdGhpbmdzIC0gSVJRIG11c3Qgbm90IGJlIGVuYWJsZWQgYmVmb3JlIHRoZSBmbGFnIGlzIGNsZWFyZWQgYW5kIHNvbWUKKyAqIG9wZXJhdGlvbnMgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIHdpdGggSVJRIGRpc2FibGVkIGFyZSBhbGxvd2VkIHdoaWxlIHRoZQorICogZmxhZyBpcyBzZXQuCisgKi8KK2Jvb2wgZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkIF9fcmVhZF9tb3N0bHk7CisKK2VudW0gc3lzdGVtX3N0YXRlcyBzeXN0ZW1fc3RhdGUgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woc3lzdGVtX3N0YXRlKTsKK2ludCBLRVJORUxfU1RBUlRfRU5EPTA7CitFWFBPUlRfU1lNQk9MKEtFUk5FTF9TVEFSVF9FTkQpOworCisvKgorICogQm9vdCBjb21tYW5kLWxpbmUgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgTUFYX0lOSVRfQVJHUyBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUCisjZGVmaW5lIE1BWF9JTklUX0VOVlMgQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVAorCitleHRlcm4gdm9pZCB0aW1lX2luaXQodm9pZCk7CisvKiBEZWZhdWx0IGxhdGUgdGltZSBpbml0IGlzIE5VTEwuIGFyY2hzIGNhbiBvdmVycmlkZSB0aGlzIGxhdGVyLiAqLwordm9pZCAoKl9faW5pdGRhdGEgbGF0ZV90aW1lX2luaXQpKHZvaWQpOworZXh0ZXJuIHZvaWQgc29mdGlycV9pbml0KHZvaWQpOworCisvKiBVbnRvdWNoZWQgY29tbWFuZCBsaW5lIHNhdmVkIGJ5IGFyY2gtc3BlY2lmaWMgY29kZS4gKi8KK2NoYXIgX19pbml0ZGF0YSBib290X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisvKiBVbnRvdWNoZWQgc2F2ZWQgY29tbWFuZCBsaW5lIChlZy4gZm9yIC9wcm9jKSAqLworY2hhciAqc2F2ZWRfY29tbWFuZF9saW5lOworLyogQ29tbWFuZCBsaW5lIGZvciBwYXJhbWV0ZXIgcGFyc2luZyAqLworc3RhdGljIGNoYXIgKnN0YXRpY19jb21tYW5kX2xpbmU7CisKK3N0YXRpYyBjaGFyICpleGVjdXRlX2NvbW1hbmQ7CitzdGF0aWMgY2hhciAqcmFtZGlza19leGVjdXRlX2NvbW1hbmQ7CisKKy8qCisgKiBJZiBzZXQsIHRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUgZHJpdmVycyB0aGF0IHJlc2V0IHRoZSB1bmRlcmx5aW5nCisgKiBkZXZpY2UgYmVmb3JlIGdvaW5nIGFoZWFkIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIG90aGVyd2lzZSBkcml2ZXIgbWlnaHQKKyAqIHJlbHkgb24gdGhlIEJJT1MgYW5kIHNraXAgdGhlIHJlc2V0IG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBpZiBrZXJuZWwgaXMgYm9vdGluZyBpbiBhbiB1bnJlbGlhYmxlIGVudmlyb25tZW50LgorICogRm9yIGV4LiBrZHVtcCBzaXR1YWl0b24gd2hlcmUgcHJldmlvdXMga2VybmVsIGhhcyBjcmFzaGVkLCBCSU9TIGhhcyBiZWVuCisgKiBza2lwcGVkIGFuZCBkZXZpY2VzIHdpbGwgYmUgaW4gdW5rbm93biBzdGF0ZS4KKyAqLwordW5zaWduZWQgaW50IHJlc2V0X2RldmljZXM7CitFWFBPUlRfU1lNQk9MKHJlc2V0X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfcmVzZXRfZGV2aWNlcyhjaGFyICpzdHIpCit7CisJcmVzZXRfZGV2aWNlcyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJlc2V0X2RldmljZXMiLCBzZXRfcmVzZXRfZGV2aWNlcyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogYXJndl9pbml0W01BWF9JTklUX0FSR1MrMl0gPSB7ICJpbml0IiwgTlVMTCwgfTsKK2NvbnN0IGNoYXIgKiBlbnZwX2luaXRbTUFYX0lOSVRfRU5WUysyXSA9IHsgIkhPTUU9LyIsICJURVJNPWxpbnV4IiwgTlVMTCwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpwYW5pY19sYXRlciwgKnBhbmljX3BhcmFtOworCitleHRlcm4gY29uc3Qgc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gX19zZXR1cF9zdGFydFtdLCBfX3NldHVwX2VuZFtdOworCitzdGF0aWMgaW50IF9faW5pdCBvYnNvbGV0ZV9jaGVja3NldHVwKGNoYXIgKmxpbmUpCit7CisJY29uc3Qgc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gKnA7CisJaW50IGhhZF9lYXJseV9wYXJhbSA9IDA7CisKKwlwID0gX19zZXR1cF9zdGFydDsKKwlkbyB7CisJCWludCBuID0gc3RybGVuKHAtPnN0cik7CisJCWlmIChwYXJhbWVxbihsaW5lLCBwLT5zdHIsIG4pKSB7CisJCQlpZiAocC0+ZWFybHkpIHsKKwkJCQkvKiBBbHJlYWR5IGRvbmUgaW4gcGFyc2VfZWFybHlfcGFyYW0/CisJCQkJICogKE5lZWRzIGV4YWN0IG1hdGNoIG9uIHBhcmFtIHBhcnQpLgorCQkJCSAqIEtlZXAgaXRlcmF0aW5nLCBhcyB3ZSBjYW4gaGF2ZSBlYXJseQorCQkJCSAqIHBhcmFtcyBhbmQgX19zZXR1cHMgb2Ygc2FtZSBuYW1lcyA4KCAqLworCQkJCWlmIChsaW5lW25dID09ICdcMCcgfHwgbGluZVtuXSA9PSAnPScpCisJCQkJCWhhZF9lYXJseV9wYXJhbSA9IDE7CisJCQl9IGVsc2UgaWYgKCFwLT5zZXR1cF9mdW5jKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFyYW1ldGVyICVzIGlzIG9ic29sZXRlLCIKKwkJCQkgICAgICAgIiBpZ25vcmVkXG4iLCBwLT5zdHIpOworCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmIChwLT5zZXR1cF9mdW5jKGxpbmUgKyBuKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlwKys7CisJfSB3aGlsZSAocCA8IF9fc2V0dXBfZW5kKTsKKworCXJldHVybiBoYWRfZWFybHlfcGFyYW07Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBiZSBhcHByb3ggMiBCbypvTWlwcyB0byBzdGFydCAobm90ZSBpbml0aWFsIHNoaWZ0KSwgYW5kIHdpbGwKKyAqIHN0aWxsIHdvcmsgZXZlbiBpZiBpbml0aWFsbHkgdG9vIGxhcmdlLCBpdCB3aWxsIGp1c3QgdGFrZSBzbGlnaHRseSBsb25nZXIKKyAqLwordW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnkgPSAoMTw8MTIpOworCitFWFBPUlRfU1lNQk9MKGxvb3BzX3Blcl9qaWZmeSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGRlYnVnX2tlcm5lbChjaGFyICpzdHIpCit7CisJY29uc29sZV9sb2dsZXZlbCA9IDEwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxdWlldF9rZXJuZWwoY2hhciAqc3RyKQoreworCWNvbnNvbGVfbG9nbGV2ZWwgPSA0OworCXJldHVybiAwOworfQorCitlYXJseV9wYXJhbSgiZGVidWciLCBkZWJ1Z19rZXJuZWwpOworZWFybHlfcGFyYW0oInF1aWV0IiwgcXVpZXRfa2VybmVsKTsKKworc3RhdGljIGludCBfX2luaXQgbG9nbGV2ZWwoY2hhciAqc3RyKQoreworCWludCBuZXdsZXZlbDsKKworCS8qCisJICogT25seSB1cGRhdGUgbG9nbGV2ZWwgdmFsdWUgd2hlbiBhIGNvcnJlY3Qgc2V0dGluZyB3YXMgcGFzc2VkLAorCSAqIHRvIHByZXZlbnQgYmxpbmQgY3Jhc2hlcyAod2hlbiBsb2dsZXZlbCBiZWluZyBzZXQgdG8gMCkgdGhhdAorCSAqIGFyZSBxdWl0ZSBoYXJkIHRvIGRlYnVnCisJICovCisJaWYgKGdldF9vcHRpb24oJnN0ciwgJm5ld2xldmVsKSkgeworCQljb25zb2xlX2xvZ2xldmVsID0gbmV3bGV2ZWw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitlYXJseV9wYXJhbSgibG9nbGV2ZWwiLCBsb2dsZXZlbCk7CisKKy8qIENoYW5nZSBOVUwgdGVybSBiYWNrIHRvICI9IiwgdG8gbWFrZSAicGFyYW0iIHRoZSB3aG9sZSBzdHJpbmcuICovCitzdGF0aWMgaW50IF9faW5pdCByZXBhaXJfZW52X3N0cmluZyhjaGFyICpwYXJhbSwgY2hhciAqdmFsKQoreworCWlmICh2YWwpIHsKKwkJLyogcGFyYW09dmFsIG9yIHBhcmFtPSJ2YWwiPyAqLworCQlpZiAodmFsID09IHBhcmFtK3N0cmxlbihwYXJhbSkrMSkKKwkJCXZhbFstMV0gPSAnPSc7CisJCWVsc2UgaWYgKHZhbCA9PSBwYXJhbStzdHJsZW4ocGFyYW0pKzIpIHsKKwkJCXZhbFstMl0gPSAnPSc7CisJCQltZW1tb3ZlKHZhbC0xLCB2YWwsIHN0cmxlbih2YWwpKzEpOworCQkJdmFsLS07CisJCX0gZWxzZQorCQkJQlVHKCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVW5rbm93biBib290IG9wdGlvbnMgZ2V0IGhhbmRlZCB0byBpbml0LCB1bmxlc3MgdGhleSBsb29rIGxpa2UKKyAqIHVudXNlZCBwYXJhbWV0ZXJzIChtb2Rwcm9iZSB3aWxsIGZpbmQgdGhlbSBpbiAvcHJvYy9jbWRsaW5lKS4KKyAqLworc3RhdGljIGludCBfX2luaXQgdW5rbm93bl9ib290b3B0aW9uKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwpCit7CisJcmVwYWlyX2Vudl9zdHJpbmcocGFyYW0sIHZhbCk7CisKKwkvKiBIYW5kbGUgb2Jzb2xldGUtc3R5bGUgcGFyYW1ldGVycyAqLworCWlmIChvYnNvbGV0ZV9jaGVja3NldHVwKHBhcmFtKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBVbnVzZWQgbW9kdWxlIHBhcmFtZXRlci4gKi8KKwlpZiAoc3RyY2hyKHBhcmFtLCAnLicpICYmICghdmFsIHx8IHN0cmNocihwYXJhbSwgJy4nKSA8IHZhbCkpCisJCXJldHVybiAwOworCisJaWYgKHBhbmljX2xhdGVyKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwpIHsKKwkJLyogRW52aXJvbm1lbnQgb3B0aW9uICovCisJCXVuc2lnbmVkIGludCBpOworCQlmb3IgKGkgPSAwOyBlbnZwX2luaXRbaV07IGkrKykgeworCQkJaWYgKGkgPT0gTUFYX0lOSVRfRU5WUykgeworCQkJCXBhbmljX2xhdGVyID0gIlRvbyBtYW55IGJvb3QgZW52IHZhcnMgYXQgYCVzJyI7CisJCQkJcGFuaWNfcGFyYW0gPSBwYXJhbTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChwYXJhbSwgZW52cF9pbml0W2ldLCB2YWwgLSBwYXJhbSkpCisJCQkJYnJlYWs7CisJCX0KKwkJZW52cF9pbml0W2ldID0gcGFyYW07CisJfSBlbHNlIHsKKwkJLyogQ29tbWFuZCBsaW5lIG9wdGlvbiAqLworCQl1bnNpZ25lZCBpbnQgaTsKKwkJZm9yIChpID0gMDsgYXJndl9pbml0W2ldOyBpKyspIHsKKwkJCWlmIChpID09IE1BWF9JTklUX0FSR1MpIHsKKwkJCQlwYW5pY19sYXRlciA9ICJUb28gbWFueSBib290IGluaXQgdmFycyBhdCBgJXMnIjsKKwkJCQlwYW5pY19wYXJhbSA9IHBhcmFtOworCQkJfQorCQl9CisJCWFyZ3ZfaW5pdFtpXSA9IHBhcmFtOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zZXR1cChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlleGVjdXRlX2NvbW1hbmQgPSBzdHI7CisJLyoKKwkgKiBJbiBjYXNlIExJTE8gaXMgZ29pbmcgdG8gYm9vdCB1cyB3aXRoIGRlZmF1bHQgY29tbWFuZCBsaW5lLAorCSAqIGl0IHByZXBlbmRzICJhdXRvIiBiZWZvcmUgdGhlIHdob2xlIGNtZGxpbmUgd2hpY2ggbWFrZXMKKwkgKiB0aGUgc2hlbGwgdGhpbmsgaXQgc2hvdWxkIGV4ZWN1dGUgYSBzY3JpcHQgd2l0aCBzdWNoIG5hbWUuCisJICogU28gd2UgaWdub3JlIGFsbCBhcmd1bWVudHMgZW50ZXJlZCBfYmVmb3JlXyBpbml0PS4uLiBbTUpdCisJICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9JTklUX0FSR1M7IGkrKykKKwkJYXJndl9pbml0W2ldID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImluaXQ9IiwgaW5pdF9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHJkaW5pdF9zZXR1cChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9IHN0cjsKKwkvKiBTZWUgImF1dG8iIGNvbW1lbnQgaW4gaW5pdF9zZXR1cCAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfSU5JVF9BUkdTOyBpKyspCisJCWFyZ3ZfaW5pdFtpXSA9IE5VTEw7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJyZGluaXQ9IiwgcmRpbml0X3NldHVwKTsKKworI2lmbmRlZiBDT05GSUdfU01QCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNldHVwX21heF9jcHVzID0gTlJfQ1BVUzsKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfaW5pdCh2b2lkKQoreworCUFQSUNfaW5pdF91bmlwcm9jZXNzb3IoKTsKK30KKyNlbHNlCisjZGVmaW5lIHNtcF9pbml0KCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9ucl9jcHVfaWRzKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heGNwdXMpIHsgfQorI2VuZGlmCisKKy8qCisgKiBXZSBuZWVkIHRvIHN0b3JlIHRoZSB1bnRvdWNoZWQgY29tbWFuZCBsaW5lIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorICogV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3VjaGVkIGNvbW1hbmQgbGluZSBzaW5jZSB0aGUgcGFyYW1ldGVyCisgKiBwYXJzaW5nIGlzIHBlcmZvcm1lZCBpbiBwbGFjZSwgYW5kIHdlIHNob3VsZCBhbGxvdyBhIGNvbXBvbmVudCB0bworICogc3RvcmUgcmVmZXJlbmNlIG9mIG5hbWUvdmFsdWUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9jb21tYW5kX2xpbmUoY2hhciAqY29tbWFuZF9saW5lKQoreworCXNhdmVkX2NvbW1hbmRfbGluZSA9IGFsbG9jX2Jvb3RtZW0oc3RybGVuIChib290X2NvbW1hbmRfbGluZSkrMSk7CisJc3RhdGljX2NvbW1hbmRfbGluZSA9IGFsbG9jX2Jvb3RtZW0oc3RybGVuIChjb21tYW5kX2xpbmUpKzEpOworCXN0cmNweSAoc2F2ZWRfY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSk7CisJc3RyY3B5IChzdGF0aWNfY29tbWFuZF9saW5lLCBjb21tYW5kX2xpbmUpOworfQorCisvKgorICogV2UgbmVlZCB0byBmaW5hbGl6ZSBpbiBhIG5vbi1fX2luaXQgZnVuY3Rpb24gb3IgZWxzZSByYWNlIGNvbmRpdGlvbnMKKyAqIGJldHdlZW4gdGhlIHJvb3QgdGhyZWFkIGFuZCB0aGUgaW5pdCB0aHJlYWQgbWF5IGNhdXNlIHN0YXJ0X2tlcm5lbCB0bworICogYmUgcmVhcGVkIGJ5IGZyZWVfaW5pdG1lbSBiZWZvcmUgdGhlIHJvb3QgdGhyZWFkIGhhcyBwcm9jZWVkZWQgdG8KKyAqIGNwdV9pZGxlLgorICoKKyAqIGdjYy0zLjQgYWNjaWRlbnRhbGx5IGlubGluZXMgdGhpcyBmdW5jdGlvbiwgc28gdXNlIG5vaW5saW5lLgorICovCisKK3N0YXRpYyBfX2luaXRkYXRhIERFQ0xBUkVfQ09NUExFVElPTihrdGhyZWFkZF9kb25lKTsKKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0X3JlZm9rIHJlc3RfaW5pdCh2b2lkKQoreworCWludCBwaWQ7CisKKwlyY3Vfc2NoZWR1bGVyX3N0YXJ0aW5nKCk7CisJLyoKKwkgKiBXZSBuZWVkIHRvIHNwYXduIGluaXQgZmlyc3Qgc28gdGhhdCBpdCBvYnRhaW5zIHBpZCAxLCBob3dldmVyCisJICogdGhlIGluaXQgdGFzayB3aWxsIGVuZCB1cCB3YW50aW5nIHRvIGNyZWF0ZSBrdGhyZWFkcywgd2hpY2gsIGlmCisJICogd2Ugc2NoZWR1bGUgaXQgYmVmb3JlIHdlIGNyZWF0ZSBrdGhyZWFkZCwgd2lsbCBPT1BTLgorCSAqLworCWtlcm5lbF90aHJlYWQoa2VybmVsX2luaXQsIE5VTEwsIENMT05FX0ZTIHwgQ0xPTkVfU0lHSEFORCk7CisJbnVtYV9kZWZhdWx0X3BvbGljeSgpOworCXBpZCA9IGtlcm5lbF90aHJlYWQoa3RocmVhZGQsIE5VTEwsIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOworCXJjdV9yZWFkX2xvY2soKTsKKwlrdGhyZWFkZF90YXNrID0gZmluZF90YXNrX2J5X3BpZF9ucyhwaWQsICZpbml0X3BpZF9ucyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJY29tcGxldGUoJmt0aHJlYWRkX2RvbmUpOworCisJLyoKKwkgKiBUaGUgYm9vdCBpZGxlIHRocmVhZCBtdXN0IGV4ZWN1dGUgc2NoZWR1bGUoKQorCSAqIGF0IGxlYXN0IG9uY2UgdG8gZ2V0IHRoaW5ncyBtb3Zpbmc6CisJICovCisJaW5pdF9pZGxlX2Jvb3R1cF90YXNrKGN1cnJlbnQpOworCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKKwkvKiBDYWxsIGludG8gY3B1X2lkbGUgd2l0aCBwcmVlbXB0IGRpc2FibGVkICovCisJY3B1X2lkbGUoKTsKK30KKworLyogQ2hlY2sgZm9yIGVhcmx5IHBhcmFtcy4gKi8KK3N0YXRpYyBpbnQgX19pbml0IGRvX2Vhcmx5X3BhcmFtKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwpCit7CisJY29uc3Qgc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gKnA7CisKKwlmb3IgKHAgPSBfX3NldHVwX3N0YXJ0OyBwIDwgX19zZXR1cF9lbmQ7IHArKykgeworCQlpZiAoKHAtPmVhcmx5ICYmIHBhcmFtZXEocGFyYW0sIHAtPnN0cikpIHx8CisJCSAgICAoc3RyY21wKHBhcmFtLCAiY29uc29sZSIpID09IDAgJiYKKwkJICAgICBzdHJjbXAocC0+c3RyLCAiZWFybHljb24iKSA9PSAwKQorCQkpIHsKKwkJCWlmIChwLT5zZXR1cF9mdW5jKHZhbCkgIT0gMCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJNYWxmb3JtZWQgZWFybHkgb3B0aW9uICclcydcbiIsIHBhcmFtKTsKKwkJfQorCX0KKwkvKiBXZSBhY2NlcHQgZXZlcnl0aGluZyBhdCB0aGlzIHN0YWdlLiAqLworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBwYXJzZV9lYXJseV9vcHRpb25zKGNoYXIgKmNtZGxpbmUpCit7CisJcGFyc2VfYXJncygiZWFybHkgb3B0aW9ucyIsIGNtZGxpbmUsIE5VTEwsIDAsIDAsIDAsIGRvX2Vhcmx5X3BhcmFtKTsKK30KKworLyogQXJjaCBjb2RlIGNhbGxzIHRoaXMgZWFybHkgb24sIG9yIGlmIG5vdCwganVzdCBiZWZvcmUgb3RoZXIgcGFyc2luZy4gKi8KK3ZvaWQgX19pbml0IHBhcnNlX2Vhcmx5X3BhcmFtKHZvaWQpCit7CisJc3RhdGljIF9faW5pdGRhdGEgaW50IGRvbmUgPSAwOworCXN0YXRpYyBfX2luaXRkYXRhIGNoYXIgdG1wX2NtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworCisJaWYgKGRvbmUpCisJCXJldHVybjsKKworCS8qIEFsbCBmYWxsIHRocm91Z2ggdG8gZG9fZWFybHlfcGFyYW0uICovCisJc3RybGNweSh0bXBfY21kbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKwlwYXJzZV9lYXJseV9vcHRpb25zKHRtcF9jbWRsaW5lKTsKKwlkb25lID0gMTsKK30KKworLyoKKyAqCUFjdGl2YXRlIHRoZSBmaXJzdCBwcm9jZXNzb3IuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGJvb3RfY3B1X2luaXQodm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCS8qIE1hcmsgdGhlIGJvb3QgY3B1ICJwcmVzZW50IiwgIm9ubGluZSIgZXRjIGZvciBTTVAgYW5kIFVQIGNhc2UgKi8KKwlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOworCXNldF9jcHVfYWN0aXZlKGNwdSwgdHJ1ZSk7CisJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1ZSk7CisJc2V0X2NwdV9wb3NzaWJsZShjcHUsIHRydWUpOworfQorCit2b2lkIF9faW5pdCBfX3dlYWsgc21wX3NldHVwX3Byb2Nlc3Nvcl9pZCh2b2lkKQoreworfQorCit2b2lkIF9faW5pdCBfX3dlYWsgdGhyZWFkX2luZm9fY2FjaGVfaW5pdCh2b2lkKQoreworfQorCisvKgorICogU2V0IHVwIGtlcm5lbCBtZW1vcnkgYWxsb2NhdG9ycworICovCitzdGF0aWMgdm9pZCBfX2luaXQgbW1faW5pdCh2b2lkKQoreworCS8qCisJICogcGFnZV9jZ3JvdXAgcmVxdWlyZXMgY29udGlndW91cyBwYWdlcywKKwkgKiBiaWdnZXIgdGhhbiBNQVhfT1JERVIgdW5sZXNzIFNQQVJTRU1FTS4KKwkgKi8KKwlwYWdlX2Nncm91cF9pbml0X2ZsYXRtZW0oKTsKKwltZW1faW5pdCgpOworCWttZW1fY2FjaGVfaW5pdCgpOworCXBlcmNwdV9pbml0X2xhdGUoKTsKKwlwZ3RhYmxlX2NhY2hlX2luaXQoKTsKKwl2bWFsbG9jX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgY3VycmVudF9rZXJuZWxfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TVEFDS19TSVpFCisJY3VycmVudF9rZXJuZWxfdGhyZWFkID0gJmluaXRfdGhyZWFkX2luZm87CisjZW5kaWYKK30KKworYXNtbGlua2FnZSB2b2lkIF9faW5pdCBzdGFydF9rZXJuZWwodm9pZCkKK3sKKworCWNoYXIgKiBjb21tYW5kX2xpbmU7CisJZXh0ZXJuIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gX19zdGFydF9fX3BhcmFtW10sIF9fc3RvcF9fX3BhcmFtW107CisKKyNpZmRlZiBDT05GSUdfU0xPQgorCXNsb2Jfc2l6ZXNfaW5pdCgpOworI2VuZGlmCisKKwkvKgorCSAqIE5lZWQgdG8gcnVuIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCB0byBpbml0aWFsaXplIHRoZQorCSAqIGxvY2tkZXAgaGFzaDoKKwkgKi8KKwljdXJyZW50X2tlcm5lbF9pbml0KCk7CisKKwlsb2NrZGVwX2luaXQoKTsKKwlzbXBfc2V0dXBfcHJvY2Vzc29yX2lkKCk7CisJZGVidWdfb2JqZWN0c19lYXJseV9pbml0KCk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgdGhlIGluaXRpYWwgY2FuYXJ5IEFTQVA6CisJICovCisJYm9vdF9pbml0X3N0YWNrX2NhbmFyeSgpOworCisJY2dyb3VwX2luaXRfZWFybHkoKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkID0gdHJ1ZTsKKworCisKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBzdGlsbCBkaXNhYmxlZC4gRG8gbmVjZXNzYXJ5IHNldHVwcywgdGhlbgorICogZW5hYmxlIHRoZW0KKyAqLworCXRpY2tfaW5pdCgpOworCWJvb3RfY3B1X2luaXQoKTsKKwlwYWdlX2FkZHJlc3NfaW5pdCgpOworCS8qIHByaW50ayhLRVJOX05PVElDRSAiJXMiLCBsaW51eF9iYW5uZXIpOyAqLworCXNldHVwX2FyY2goJmNvbW1hbmRfbGluZSk7CisJbW1faW5pdF9vd25lcigmaW5pdF9tbSwgJmluaXRfdGFzayk7CisJbW1faW5pdF9jcHVtYXNrKCZpbml0X21tKTsKKwlzZXR1cF9jb21tYW5kX2xpbmUoY29tbWFuZF9saW5lKTsKKwlzZXR1cF9ucl9jcHVfaWRzKCk7CisJc2V0dXBfcGVyX2NwdV9hcmVhcygpOworCXNvZnRpcnFfZWFybHlfaW5pdCgpOworCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KKworCWJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7CisJcGFnZV9hbGxvY19pbml0KCk7CisKKwkvKiBwcmludGsoS0VSTl9OT1RJQ0UgIktlcm5lbCBjb21tYW5kIGxpbmU6ICVzXG4iLCBib290X2NvbW1hbmRfbGluZSk7ICovCisJcGFyc2VfZWFybHlfcGFyYW0oKTsKKwlwYXJzZV9hcmdzKCJCb290aW5nIGtlcm5lbCIsIHN0YXRpY19jb21tYW5kX2xpbmUsIF9fc3RhcnRfX19wYXJhbSwKKwkJICAgX19zdG9wX19fcGFyYW0gLSBfX3N0YXJ0X19fcGFyYW0sCisJCSAgIC0xLCAtMSwgJnVua25vd25fYm9vdG9wdGlvbik7CisKKwlqdW1wX2xhYmVsX2luaXQoKTsKKworCS8qCisJICogVGhlc2UgdXNlIGxhcmdlIGJvb3RtZW0gYWxsb2NhdGlvbnMgYW5kIG11c3QgcHJlY2VkZQorCSAqIGttZW1fY2FjaGVfaW5pdCgpCisJICovCisJc2V0dXBfbG9nX2J1ZigwKTsKKwlwaWRoYXNoX2luaXQoKTsKKwl2ZnNfY2FjaGVzX2luaXRfZWFybHkoKTsKKwlzb3J0X21haW5fZXh0YWJsZSgpOworCXRyYXBfaW5pdCgpOworCW1tX2luaXQoKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBzY2hlZHVsZXIgcHJpb3Igc3RhcnRpbmcgYW55IGludGVycnVwdHMgKHN1Y2ggYXMgdGhlCisJICogdGltZXIgaW50ZXJydXB0KS4gRnVsbCB0b3BvbG9neSBzZXR1cCBoYXBwZW5zIGF0IHNtcF9pbml0KCkKKwkgKiB0aW1lIC0gYnV0IG1lYW53aGlsZSB3ZSBzdGlsbCBoYXZlIGEgZnVuY3Rpb25pbmcgc2NoZWR1bGVyLgorCSAqLworCXNjaGVkX2luaXQoKTsKKwkvKgorCSAqIERpc2FibGUgcHJlZW1wdGlvbiAtIGVhcmx5IGJvb3R1cCBzY2hlZHVsaW5nIGlzIGV4dHJlbWVseQorCSAqIGZyYWdpbGUgdW50aWwgd2UgY3B1X2lkbGUoKSBmb3IgdGhlIGZpcnN0IHRpbWUuCisJICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKCFpcnFzX2Rpc2FibGVkKCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKKwkJCQkiZW5hYmxlZCAqdmVyeSogZWFybHksIGZpeGluZyBpdFxuIik7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJfQorCWlkcl9pbml0X2NhY2hlKCk7CisJcGVyZl9ldmVudF9pbml0KCk7CisJcmN1X2luaXQoKTsKKwlyYWRpeF90cmVlX2luaXQoKTsKKwkvKiBpbml0IHNvbWUgbGlua3MgYmVmb3JlIGluaXRfSVNBX2lycXMoKSAqLworCWVhcmx5X2lycV9pbml0KCk7CisJaW5pdF9JUlEoKTsKKwlwcmlvX3RyZWVfaW5pdCgpOworCWluaXRfdGltZXJzKCk7CisJaHJ0aW1lcnNfaW5pdCgpOworCXNvZnRpcnFfaW5pdCgpOworCXRpbWVrZWVwaW5nX2luaXQoKTsKKwl0aW1lX2luaXQoKTsKKwlwcm9maWxlX2luaXQoKTsKKwljYWxsX2Z1bmN0aW9uX2luaXQoKTsKKwlpZiAoIWlycXNfZGlzYWJsZWQoKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKKwkJCQkgImVuYWJsZWQgZWFybHlcbiIpOworCWVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCA9IGZhbHNlOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWttZW1fY2FjaGVfaW5pdF9sYXRlKCk7CisKKwkvKgorCSAqIEhBQ0sgQUxFUlQhIFRoaXMgaXMgZWFybHkuIFdlJ3JlIGVuYWJsaW5nIHRoZSBjb25zb2xlIGJlZm9yZQorCSAqIHdlJ3ZlIGRvbmUgUENJIHNldHVwcyBldGMsIGFuZCBjb25zb2xlX2luaXQoKSBtdXN0IGJlIGF3YXJlIG9mCisJICogdGhpcy4gQnV0IHdlIGRvIHdhbnQgb3V0cHV0IGVhcmx5LCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAqLworCWNvbnNvbGVfaW5pdCgpOworCWlmIChwYW5pY19sYXRlcikKKwkJcGFuaWMocGFuaWNfbGF0ZXIsIHBhbmljX3BhcmFtKTsKKworCWxvY2tkZXBfaW5mbygpOworCisJLyoKKwkgKiBOZWVkIHRvIHJ1biB0aGlzIHdoZW4gaXJxcyBhcmUgZW5hYmxlZCwgYmVjYXVzZSBpdCB3YW50cworCSAqIHRvIHNlbGYtdGVzdCBbaGFyZC9zb2Z0XS1pcnFzIG9uL29mZiBsb2NrIGludmVyc2lvbiBidWdzCisJICogdG9vOgorCSAqLworCWxvY2tpbmdfc2VsZnRlc3QoKTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChpbml0cmRfc3RhcnQgJiYgIWluaXRyZF9iZWxvd19zdGFydF9vayAmJgorCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UoKHZvaWQgKilpbml0cmRfc3RhcnQpKSA8IG1pbl9sb3dfcGZuKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImluaXRyZCBvdmVyd3JpdHRlbiAoMHglMDhseCA8IDB4JTA4bHgpIC0gIgorCQkgICAgImRpc2FibGluZyBpdC5cbiIsCisJCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UoKHZvaWQgKilpbml0cmRfc3RhcnQpKSwKKwkJICAgIG1pbl9sb3dfcGZuKTsKKwkJaW5pdHJkX3N0YXJ0ID0gMDsKKwl9CisjZW5kaWYKKwlwYWdlX2Nncm91cF9pbml0KCk7CisJZGVidWdfb2JqZWN0c19tZW1faW5pdCgpOworCWttZW1sZWFrX2luaXQoKTsKKwlzZXR1cF9wZXJfY3B1X3BhZ2VzZXQoKTsKKwludW1hX3BvbGljeV9pbml0KCk7CisJaWYgKGxhdGVfdGltZV9pbml0KQorCQlsYXRlX3RpbWVfaW5pdCgpOworCXNjaGVkX2Nsb2NrX2luaXQoKTsKKwljYWxpYnJhdGVfZGVsYXkoKTsKKwlwaWRtYXBfaW5pdCgpOworCWFub25fdm1hX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfWDg2CisJaWYgKGVmaV9lbmFibGVkKEVGSV9SVU5USU1FX1NFUlZJQ0VTKSkKKwkJZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl9FU1BGSVg2NAorCS8qIFNob3VsZCBiZSBydW4gYmVmb3JlIHRoZSBmaXJzdCBub24taW5pdCB0aHJlYWQgaXMgY3JlYXRlZCAqLworCWluaXRfZXNwZml4X2JzcCgpOworI2VuZGlmCisJdGhyZWFkX2luZm9fY2FjaGVfaW5pdCgpOworCWNyZWRfaW5pdCgpOworCWZvcmtfaW5pdCh0b3RhbHJhbV9wYWdlcyk7CisJcHJvY19jYWNoZXNfaW5pdCgpOworCWJ1ZmZlcl9pbml0KCk7CisJa2V5X2luaXQoKTsKKwlzZWN1cml0eV9pbml0KCk7CisJZGJnX2xhdGVfaW5pdCgpOworCXZmc19jYWNoZXNfaW5pdCh0b3RhbHJhbV9wYWdlcyk7CisJc2lnbmFsc19pbml0KCk7CisJLyogcm9vdGZzIHBvcHVsYXRpbmcgbWlnaHQgbmVlZCBwYWdlLXdyaXRlYmFjayAqLworCXBhZ2Vfd3JpdGViYWNrX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2Nfcm9vdF9pbml0KCk7CisjZW5kaWYKKwljZ3JvdXBfaW5pdCgpOworCWNwdXNldF9pbml0KCk7CisJdGFza3N0YXRzX2luaXRfZWFybHkoKTsKKwlkZWxheWFjY3RfaW5pdCgpOworCisJY2hlY2tfYnVncygpOworCisJYWNwaV9lYXJseV9pbml0KCk7IC8qIGJlZm9yZSBMQVBJQyBhbmQgU01QIGluaXQgKi8KKwlzZmlfaW5pdF9sYXRlKCk7CisKKwlpZiAoZWZpX2VuYWJsZWQoRUZJX1JVTlRJTUVfU0VSVklDRVMpKQorCQllZmlfZnJlZV9ib290X3NlcnZpY2VzKCk7CisKKwlmdHJhY2VfaW5pdCgpOworCisJLyogRG8gdGhlIHJlc3Qgbm9uLV9faW5pdCdlZCwgd2UncmUgbm93IGFsaXZlICovCisJcmVzdF9pbml0KCk7Cit9CisKKy8qIENhbGwgYWxsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBsaW5rZWQgaW50byB0aGUga2VybmVsLiAqLworc3RhdGljIHZvaWQgX19pbml0IGRvX2N0b3JzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NPTlNUUlVDVE9SUworCWN0b3JfZm5fdCAqZm4gPSAoY3Rvcl9mbl90ICopIF9fY3RvcnNfc3RhcnQ7CisKKwlmb3IgKDsgZm4gPCAoY3Rvcl9mbl90ICopIF9fY3RvcnNfZW5kOyBmbisrKQorCQkoKmZuKSgpOworI2VuZGlmCit9CisKK2Jvb2wgaW5pdGNhbGxfZGVidWc7Citjb3JlX3BhcmFtKGluaXRjYWxsX2RlYnVnLCBpbml0Y2FsbF9kZWJ1ZywgYm9vbCwgMDY0NCk7CisKK3N0YXRpYyBjaGFyIG1zZ2J1Zls2NF07CisKK3N0YXRpYyBpbnQgX19pbml0X29yX21vZHVsZSBkb19vbmVfaW5pdGNhbGxfZGVidWcoaW5pdGNhbGxfdCBmbikKK3sKKwlrdGltZV90IGNhbGx0aW1lLCBkZWx0YSwgcmV0dGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb247CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nICAlcEYgQCAlaVxuIiwgZm4sIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwljYWxsdGltZSA9IGt0aW1lX2dldCgpOworCXJldCA9IGZuKCk7CisJcmV0dGltZSA9IGt0aW1lX2dldCgpOworCWRlbHRhID0ga3RpbWVfc3ViKHJldHRpbWUsIGNhbGx0aW1lKTsKKwlkdXJhdGlvbiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMDsKKwlwcmludGsoS0VSTl9ERUJVRyAiaW5pdGNhbGwgJXBGIHJldHVybmVkICVkIGFmdGVyICVsbGQgdXNlY3NcbiIsIGZuLAorCQlyZXQsIGR1cmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBfX2luaXRfb3JfbW9kdWxlIGRvX29uZV9pbml0Y2FsbChpbml0Y2FsbF90IGZuKQoreworCWludCBjb3VudCA9IHByZWVtcHRfY291bnQoKTsKKwlpbnQgcmV0OworCisJaWYgKGluaXRjYWxsX2RlYnVnKQorCQlyZXQgPSBkb19vbmVfaW5pdGNhbGxfZGVidWcoZm4pOworCWVsc2UKKwkJcmV0ID0gZm4oKTsKKworCW1zZ2J1ZlswXSA9IDA7CisKKwlpZiAocmV0ICYmIHJldCAhPSAtRU5PREVWICYmIGluaXRjYWxsX2RlYnVnKQorCQlzcHJpbnRmKG1zZ2J1ZiwgImVycm9yIGNvZGUgJWQgIiwgcmV0KTsKKworCWlmIChwcmVlbXB0X2NvdW50KCkgIT0gY291bnQpIHsKKwkJc3RybGNhdChtc2didWYsICJwcmVlbXB0aW9uIGltYmFsYW5jZSAiLCBzaXplb2YobXNnYnVmKSk7CisJCXByZWVtcHRfY291bnQoKSA9IGNvdW50OworCX0KKwlpZiAoaXJxc19kaXNhYmxlZCgpKSB7CisJCXN0cmxjYXQobXNnYnVmLCAiZGlzYWJsZWQgaW50ZXJydXB0cyAiLCBzaXplb2YobXNnYnVmKSk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJaWYgKG1zZ2J1ZlswXSkgeworCQlwcmludGsoImluaXRjYWxsICVwRiByZXR1cm5lZCB3aXRoICVzXG4iLCBmbiwgbXNnYnVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK2V4dGVybiBpbml0Y2FsbF90IF9faW5pdGNhbGxfc3RhcnRbXTsKK2V4dGVybiBpbml0Y2FsbF90IF9faW5pdGNhbGwwX3N0YXJ0W107CitleHRlcm4gaW5pdGNhbGxfdCBfX2luaXRjYWxsMV9zdGFydFtdOworZXh0ZXJuIGluaXRjYWxsX3QgX19pbml0Y2FsbDJfc3RhcnRbXTsKK2V4dGVybiBpbml0Y2FsbF90IF9faW5pdGNhbGwzX3N0YXJ0W107CitleHRlcm4gaW5pdGNhbGxfdCBfX2luaXRjYWxsNF9zdGFydFtdOworZXh0ZXJuIGluaXRjYWxsX3QgX19pbml0Y2FsbDVfc3RhcnRbXTsKK2V4dGVybiBpbml0Y2FsbF90IF9faW5pdGNhbGw2X3N0YXJ0W107CitleHRlcm4gaW5pdGNhbGxfdCBfX2luaXRjYWxsN19zdGFydFtdOworZXh0ZXJuIGluaXRjYWxsX3QgX19pbml0Y2FsbF9lbmRbXTsKKworc3RhdGljIGluaXRjYWxsX3QgKmluaXRjYWxsX2xldmVsc1tdIF9faW5pdGRhdGEgPSB7CisJX19pbml0Y2FsbDBfc3RhcnQsCisJX19pbml0Y2FsbDFfc3RhcnQsCisJX19pbml0Y2FsbDJfc3RhcnQsCisJX19pbml0Y2FsbDNfc3RhcnQsCisJX19pbml0Y2FsbDRfc3RhcnQsCisJX19pbml0Y2FsbDVfc3RhcnQsCisJX19pbml0Y2FsbDZfc3RhcnQsCisJX19pbml0Y2FsbDdfc3RhcnQsCisJX19pbml0Y2FsbF9lbmQsCit9OworCitzdGF0aWMgY2hhciAqaW5pdGNhbGxfbGV2ZWxfbmFtZXNbXSBfX2luaXRkYXRhID0geworCSJlYXJseSBwYXJhbWV0ZXJzIiwKKwkiY29yZSBwYXJhbWV0ZXJzIiwKKwkicG9zdGNvcmUgcGFyYW1ldGVycyIsCisJImFyY2ggcGFyYW1ldGVycyIsCisJInN1YnN5cyBwYXJhbWV0ZXJzIiwKKwkiZnMgcGFyYW1ldGVycyIsCisJImRldmljZSBwYXJhbWV0ZXJzIiwKKwkibGF0ZSBwYXJhbWV0ZXJzIiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkb19pbml0Y2FsbF9sZXZlbChpbnQgbGV2ZWwpCit7CisJZXh0ZXJuIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gX19zdGFydF9fX3BhcmFtW10sIF9fc3RvcF9fX3BhcmFtW107CisJaW5pdGNhbGxfdCAqZm47CisKKwlzdHJjcHkoc3RhdGljX2NvbW1hbmRfbGluZSwgc2F2ZWRfY29tbWFuZF9saW5lKTsKKwlwYXJzZV9hcmdzKGluaXRjYWxsX2xldmVsX25hbWVzW2xldmVsXSwKKwkJICAgc3RhdGljX2NvbW1hbmRfbGluZSwgX19zdGFydF9fX3BhcmFtLAorCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKKwkJICAgbGV2ZWwsIGxldmVsLAorCQkgICByZXBhaXJfZW52X3N0cmluZyk7CisKKwlmb3IgKGZuID0gaW5pdGNhbGxfbGV2ZWxzW2xldmVsXTsgZm4gPCBpbml0Y2FsbF9sZXZlbHNbbGV2ZWwrMV07IGZuKyspCisJCWRvX29uZV9pbml0Y2FsbCgqZm4pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZG9faW5pdGNhbGxzKHZvaWQpCit7CisJaW50IGxldmVsOworCisJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgQVJSQVlfU0laRShpbml0Y2FsbF9sZXZlbHMpIC0gMTsgbGV2ZWwrKykKKwkJZG9faW5pdGNhbGxfbGV2ZWwobGV2ZWwpOworfQorCisvKgorICogT2ssIHRoZSBtYWNoaW5lIGlzIG5vdyBpbml0aWFsaXplZC4gTm9uZSBvZiB0aGUgZGV2aWNlcworICogaGF2ZSBiZWVuIHRvdWNoZWQgeWV0LCBidXQgdGhlIENQVSBzdWJzeXN0ZW0gaXMgdXAgYW5kCisgKiBydW5uaW5nLCBhbmQgbWVtb3J5IGFuZCBwcm9jZXNzIG1hbmFnZW1lbnQgd29ya3MuCisgKgorICogTm93IHdlIGNhbiBmaW5hbGx5IHN0YXJ0IGRvaW5nIHNvbWUgcmVhbCB3b3JrLi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGRvX2Jhc2ljX3NldHVwKHZvaWQpCit7CisJY3B1c2V0X2luaXRfc21wKCk7CisJdXNlcm1vZGVoZWxwZXJfaW5pdCgpOworCXNobWVtX2luaXQoKTsKKwlkcml2ZXJfaW5pdCgpOworCWluaXRfaXJxX3Byb2MoKTsKKwlkb19jdG9ycygpOworCXVzZXJtb2RlaGVscGVyX2VuYWJsZSgpOworCWRvX2luaXRjYWxscygpOworCXJhbmRvbV9pbnRfc2VjcmV0X2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRvX3ByZV9zbXBfaW5pdGNhbGxzKHZvaWQpCit7CisJaW5pdGNhbGxfdCAqZm47CisKKwlmb3IgKGZuID0gX19pbml0Y2FsbF9zdGFydDsgZm4gPCBfX2luaXRjYWxsMF9zdGFydDsgZm4rKykKKwkJZG9fb25lX2luaXRjYWxsKCpmbik7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9pbml0X3Byb2Nlc3MoY29uc3QgY2hhciAqaW5pdF9maWxlbmFtZSkKK3sKKwlhcmd2X2luaXRbMF0gPSBpbml0X2ZpbGVuYW1lOworCWtlcm5lbF9leGVjdmUoaW5pdF9maWxlbmFtZSwgYXJndl9pbml0LCBlbnZwX2luaXQpOworfQorCisvKiBUaGlzIGlzIGEgbm9uIF9faW5pdCBmdW5jdGlvbi4gRm9yY2UgaXQgdG8gYmUgbm9pbmxpbmUgb3RoZXJ3aXNlIGdjYworICogbWFrZXMgaXQgaW5saW5lIHRvIGluaXQoKSBhbmQgaXQgYmVjb21lcyBwYXJ0IG9mIGluaXQudGV4dCBzZWN0aW9uCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgaW5pdF9wb3N0KHZvaWQpCit7CisJLyogbmVlZCB0byBmaW5pc2ggYWxsIGFzeW5jIF9faW5pdCBjb2RlIGJlZm9yZSBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CisJZnJlZV9pbml0bWVtKCk7CisJbWFya19yb2RhdGFfcm8oKTsKKwlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUlVOTklORzsKKwludW1hX2RlZmF1bHRfcG9saWN5KCk7CisKKyAgICAgICAgIEtFUk5FTF9TVEFSVF9FTkQ9MTsKKworCisJY3VycmVudC0+c2lnbmFsLT5mbGFncyB8PSBTSUdOQUxfVU5LSUxMQUJMRTsKKworCWlmIChyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCkgeworCQlydW5faW5pdF9wcm9jZXNzKHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGV4ZWN1dGUgJXNcbiIsCisJCQkJcmFtZGlza19leGVjdXRlX2NvbW1hbmQpOworCX0KKworCS8qCisJICogV2UgdHJ5IGVhY2ggb2YgdGhlc2UgdW50aWwgb25lIHN1Y2NlZWRzLgorCSAqCisJICogVGhlIEJvdXJuZSBzaGVsbCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGluaXQgaWYgd2UgYXJlCisJICogdHJ5aW5nIHRvIHJlY292ZXIgYSByZWFsbHkgYnJva2VuIG1hY2hpbmUuCisJICovCisJaWYgKGV4ZWN1dGVfY29tbWFuZCkgeworCQlydW5faW5pdF9wcm9jZXNzKGV4ZWN1dGVfY29tbWFuZCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBleGVjdXRlICVzLiAgQXR0ZW1wdGluZyAiCisJCQkJCSJkZWZhdWx0cy4uLlxuIiwgZXhlY3V0ZV9jb21tYW5kKTsKKwl9CisjaWZkZWYgQ09ORklHX1NZU1RFTV9SRUNPVkVSWQorCXJ1bl9pbml0X3Byb2Nlc3MoIi9yZWNvdmVyeS9zYmluL2luaXQiKTsKKyNlbHNlCisJcnVuX2luaXRfcHJvY2VzcygiL3NiaW4vaW5pdCIpOworCXJ1bl9pbml0X3Byb2Nlc3MoIi9ldGMvaW5pdCIpOworCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vaW5pdCIpOworCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vc2giKTsKKyNlbmRpZgorCXBhbmljKCJObyBpbml0IGZvdW5kLiAgVHJ5IHBhc3NpbmcgaW5pdD0gb3B0aW9uIHRvIGtlcm5lbC4gIgorCSAgICAgICJTZWUgTGludXggRG9jdW1lbnRhdGlvbi9pbml0LnR4dCBmb3IgZ3VpZGFuY2UuIik7Cit9CisKKworLyovUFNCVUa1xNDpxOK12Na30+vO78DttdjWt7XE07PJ5LnYz7UKK3Vuc2lnbmVkIGxvbmcgdmlydGFkZHJfdG9fcGh5cyh1bnNpZ25lZCBsb25nIHZpcnQpCit7CisJaWYodmlydCA+PSAodW5zaWduZWQgbG9uZyl2aXJfYWRkcl9kZHJuZXQgJiYgdmlydCA8PSAoKHVuc2lnbmVkIGxvbmcpdmlyX2FkZHJfZGRybmV0KzEwKjEwMjQqMTAyNCkpIAorCXsKKwkJcmV0dXJuIDB4Mjc0MDAwMDAgKyAodmlydCAtICh1bnNpZ25lZCBsb25nKXZpcl9hZGRyX2Rkcm5ldCk7CisJfQorCXJldHVybiAgX19wYSh2aXJ0KTsKK30KK3Vuc2lnbmVkIGxvbmcgcGh5c2FkZHJfdG9fdmlydCh1bnNpZ25lZCBsb25nIHBoeXMpCit7CisJaWYocGh5cyA+PSAweDI3NDAwMDAwICYmIHBoeXMgPD0gKDB4Mjc0MDAwMDAgKyAxMCoxMDI0KjEwMjQpKSAKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKXZpcl9hZGRyX2Rkcm5ldCArIChwaHlzIC0gMHgyNzQwMDAwMCk7CisJcmV0dXJuIF9fdmEocGh5cyk7Cit9CisqLworc3RhdGljIGludCBfX2luaXQga2VybmVsX2luaXQodm9pZCAqIHVudXNlZCkKK3sKKwkvKiAKKwkgKiBjcCBwc19idWYgbW1hcCwgZm9yIHRlbXAgdGVzdC4KKwkgKiBhZGQgYnkgamt6LDIwMTYtMDEtMDcuCisJICovCisJLy9pbnQgKnZpcl9hZGRyID0gTlVMTDsKKworCS8qCisJICogV2FpdCB1bnRpbCBrdGhyZWFkZCBpcyBhbGwgc2V0LXVwLgorCSAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmt0aHJlYWRkX2RvbmUpOworCisJLyogTm93IHRoZSBzY2hlZHVsZXIgaXMgZnVsbHkgc2V0IHVwIGFuZCBjYW4gZG8gYmxvY2tpbmcgYWxsb2NhdGlvbnMgKi8KKwlnZnBfYWxsb3dlZF9tYXNrID0gX19HRlBfQklUU19NQVNLOworCisJLyoKKwkgKiBpbml0IGNhbiBhbGxvY2F0ZSBwYWdlcyBvbiBhbnkgbm9kZQorCSAqLworCXNldF9tZW1zX2FsbG93ZWQobm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pOworCS8qCisJICogaW5pdCBjYW4gcnVuIG9uIGFueSBjcHUuCisJICovCisJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1X2FsbF9tYXNrKTsKKworCWNhZF9waWQgPSB0YXNrX3BpZChjdXJyZW50KTsKKworCXNtcF9wcmVwYXJlX2NwdXMoc2V0dXBfbWF4X2NwdXMpOworCisJZG9fcHJlX3NtcF9pbml0Y2FsbHMoKTsKKwlsb2NrdXBfZGV0ZWN0b3JfaW5pdCgpOworCisJc21wX2luaXQoKTsKKwlzY2hlZF9pbml0X3NtcCgpOworCisJZG9fYmFzaWNfc2V0dXAoKTsKKworCS8qIAorCSAqIGNwIHBzX2J1ZiBtbWFwLCBmb3IgdGVtcCB0ZXN0LgorCSAqIGFkZCBieSBqa3osMjAxNi0wMS0wNy4KKwkgKi8KKworCS8qIE9wZW4gdGhlIC9kZXYvY29uc29sZSBvbiB0aGUgcm9vdGZzLCB0aGlzIHNob3VsZCBuZXZlciBmYWlsICovCisJaWYgKHN5c19vcGVuKChjb25zdCBjaGFyIF9fdXNlciAqKSAiL2Rldi9jb25zb2xlIiwgT19SRFdSLCAwKSA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IHVuYWJsZSB0byBvcGVuIGFuIGluaXRpYWwgY29uc29sZS5cbiIpOworCisJKHZvaWQpIHN5c19kdXAoMCk7CisJKHZvaWQpIHN5c19kdXAoMCk7CisJLyoKKwkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBlYXJseSB1c2Vyc3BhY2UgaW5pdC4gIElmIHllcywgbGV0IGl0IGRvIGFsbAorCSAqIHRoZSB3b3JrCisJICovCisKKwlpZiAoIXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKQorCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9ICIvaW5pdCI7CisKKwlpZiAoc3lzX2FjY2VzcygoY29uc3QgY2hhciBfX3VzZXIgKikgcmFtZGlza19leGVjdXRlX2NvbW1hbmQsIDApICE9IDApIHsKKwkJcmFtZGlza19leGVjdXRlX2NvbW1hbmQgPSBOVUxMOworCQlwcmVwYXJlX25hbWVzcGFjZSgpOworCX0KKworCS8qCisJICogT2ssIHdlIGhhdmUgY29tcGxldGVkIHRoZSBpbml0aWFsIGJvb3R1cCwgYW5kCisJICogd2UncmUgZXNzZW50aWFsbHkgdXAgYW5kIHJ1bm5pbmcuIEdldCByaWQgb2YgdGhlCisJICogaW5pdG1lbSBzZWdtZW50cyBhbmQgc3RhcnQgdGhlIHVzZXItbW9kZSBzdHVmZi4uCisJICovCisKKwlpbml0X3Bvc3QoKTsKKwlyZXR1cm4gMDsKK30K