ZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2tlcm5lbC9wcmludGsuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2tlcm5lbC9wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmE4NWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40Lngva2VybmVsL3ByaW50ay5jCkBAIC0wLDAgKzEsMTk5NyBAQAorLyoKKyAqICBsaW51eC9rZXJuZWwvcHJpbnRrLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqIE1vZGlmaWVkIHRvIG1ha2Ugc3lzX3N5c2xvZygpIG1vcmUgZmxleGlibGU6IGFkZGVkIGNvbW1hbmRzIHRvCisgKiByZXR1cm4gdGhlIGxhc3QgNGsgb2Yga2VybmVsIG1lc3NhZ2VzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAqIHRoZXkndmUgYmVlbiByZWFkIG9yIG5vdC4gIEFkZGVkIG9wdGlvbiB0byBzdXBwcmVzcyBrZXJuZWwgcHJpbnRrJ3MKKyAqIHRvIHRoZSBjb25zb2xlLiAgQWRkZWQgaG9vayBmb3Igc2VuZGluZyB0aGUgY29uc29sZSBtZXNzYWdlcworICogZWxzZXdoZXJlLCBpbiBwcmVwYXJhdGlvbiBmb3IgYSBzZXJpYWwgbGluZSBjb25zb2xlIChzb21lZGF5KS4KKyAqIFRlZCBUcydvLCAyLzExLzkzLgorICogTW9kaWZpZWQgZm9yIHN5c2N0bCBzdXBwb3J0LCAxLzgvOTcsIENocmlzIEhvcm4uCisgKiBGaXhlZCBTTVAgc3luY2hyb25pemF0aW9uLCAwOC8wOC85OSwgTWFuZnJlZCBTcHJhdWwKKyAqICAgICBtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20KKyAqIFJld3JvdGUgYml0cyB0byBnZXQgcmlkIG9mIGNvbnNvbGVfbG9jaworICoJMDFNYXIwMSBBbmRyZXcgTW9ydG9uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkJCS8qIEZvciBpbl9pbnRlcnJ1cHQoKSAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgva2RiLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgva21zZ19kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvc3lzbG9nLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcHJpbnRrLmg+CisKKy8qIEFQIExPRyBCRUdJTiAqLworI2lmIDAKKyNpbmNsdWRlICIuLi9kcml2ZXJzL3N0YWdpbmcvdXNicHJveHkvbG9nY2F0X2Rydi5oIgorLy9leHRlcm4gaW50IEtFUk5FTF9TVEFSVF9FTkQ7CitleHRlcm4gVF9SSU5HQlVGRkVSKiBLRVJORUxfQlVGRjsKK2V4dGVybiBpbnQgZW5hYmxlX2tlcm5lbGxvZzsKK2V4dGVybiBVSU5UMzIgV3JpdGVSaW5nQnVmZmVyKFRfUklOR0JVRkZFUiAqcmluZ0J1ZiwgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbik7CitleHRlcm4gdm9pZCByZWFkcmluZ2J1Zl9mb3JfcHJpbnRrKCk7CisjZW5kaWYKKy8qIEFQIExPRyBFTkQgKi8KKyNkZWZpbmUgQ09ORklHX1pDQVRfREVWSUNFCisjaWZkZWYgQ09ORklHX1pDQVRfREVWSUNFCisjaWZuZGVmIENPTkZJR19TWVNURU1fUkVDT1ZFUlkKK2V4dGVybiBzc2l6ZV90IHpDYXRBZ3RfS2VybmVsX1dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9fTE9HX0JVRl9MRU4JKDEgPDwgQ09ORklHX0xPR19CVUZfU0hJRlQpCisKKworI2lmZGVmICAgICAgICBDT05GSUdfREVCVUdfTEwKK2V4dGVybiB2b2lkIHByaW50YXNjaWkoY2hhciAqKTsKKyNlbmRpZgorCisvKiBwcmludGsncyB3aXRob3V0IGEgbG9nbGV2ZWwgdXNlIHRoaXMuLiAqLworI2RlZmluZSBERUZBVUxUX01FU1NBR0VfTE9HTEVWRUwgQ09ORklHX0RFRkFVTFRfTUVTU0FHRV9MT0dMRVZFTAorCisvKiBXZSBzaG93IGV2ZXJ5dGhpbmcgdGhhdCBpcyBNT1JFIGltcG9ydGFudCB0aGFuIHRoaXMuLiAqLworI2RlZmluZSBNSU5JTVVNX0NPTlNPTEVfTE9HTEVWRUwgMSAvKiBNaW5pbXVtIGxvZ2xldmVsIHdlIGxldCBwZW9wbGUgdXNlICovCisjZGVmaW5lIERFRkFVTFRfQ09OU09MRV9MT0dMRVZFTCA3IC8qIGFueXRoaW5nIE1PUkUgc2VyaW91cyB0aGFuIEtFUk5fREVCVUcgKi8KKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobG9nX3dhaXQpOworCitpbnQgY29uc29sZV9wcmludGtbNF0gPSB7CisJREVGQVVMVF9DT05TT0xFX0xPR0xFVkVMLAkvKiBjb25zb2xlX2xvZ2xldmVsICovCisJREVGQVVMVF9NRVNTQUdFX0xPR0xFVkVMLAkvKiBkZWZhdWx0X21lc3NhZ2VfbG9nbGV2ZWwgKi8KKwlNSU5JTVVNX0NPTlNPTEVfTE9HTEVWRUwsCS8qIG1pbmltdW1fY29uc29sZV9sb2dsZXZlbCAqLworCURFRkFVTFRfQ09OU09MRV9MT0dMRVZFTCwJLyogZGVmYXVsdF9jb25zb2xlX2xvZ2xldmVsICovCit9OworCisvKgorICogTG93IGxldmVsIGRyaXZlcnMgbWF5IG5lZWQgdGhhdCB0byBrbm93IGlmIHRoZXkgY2FuIHNjaGVkdWxlIGluCisgKiB0aGVpciB1bmJsYW5rKCkgY2FsbGJhY2sgb3Igbm90LiBTbyBsZXQncyBleHBvcnQgaXQuCisgKi8KK2ludCBvb3BzX2luX3Byb2dyZXNzOworRVhQT1JUX1NZTUJPTChvb3BzX2luX3Byb2dyZXNzKTsKKworLyoKKyAqIGNvbnNvbGVfc2VtIHByb3RlY3RzIHRoZSBjb25zb2xlX2RyaXZlcnMgbGlzdCwgYW5kIGFsc28KKyAqIHByb3ZpZGVzIHNlcmlhbGlzYXRpb24gZm9yIGFjY2VzcyB0byB0aGUgZW50aXJlIGNvbnNvbGUKKyAqIGRyaXZlciBzeXN0ZW0uCisgKi8KK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKGNvbnNvbGVfc2VtKTsKK3N0cnVjdCBjb25zb2xlICpjb25zb2xlX2RyaXZlcnM7CitFWFBPUlRfU1lNQk9MX0dQTChjb25zb2xlX2RyaXZlcnMpOworCisvKgorICogVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgdGhlIG1lc3MgdGhhdCBpcyB0aGUgVlQgY29kZSBieQorICoga2VlcGluZyB0cmFjayBpZiB3ZSBoYXZlIHRoZSBjb25zb2xlIHNlbWFwaG9yZSBoZWxkLiBJdCdzCisgKiBkZWZpbml0ZWx5IG5vdCB0aGUgcGVyZmVjdCBkZWJ1ZyB0b29sICh3ZSBkb24ndCBrbm93IGlmIF9XRV8KKyAqIGhvbGQgaXQgYXJlIHJhY2luZywgYnV0IGl0IGhlbHBzIHRyYWNraW5nIHRob3NlIHdlaXJkIGNvZGUKKyAqIHBhdGggaW4gdGhlIGNvbnNvbGUgY29kZSB3aGVyZSB3ZSBlbmQgdXAgaW4gcGxhY2VzIEkgd2FudAorICogbG9ja2VkIHdpdGhvdXQgdGhlIGNvbnNvbGUgc2VtcGFob3JlIGhlbGQKKyAqLworc3RhdGljIGludCBjb25zb2xlX2xvY2tlZCwgY29uc29sZV9zdXNwZW5kZWQ7CisKKy8qCisgKiBsb2didWZfbG9jayBwcm90ZWN0cyBsb2dfYnVmLCBsb2dfc3RhcnQsIGxvZ19lbmQsIGNvbl9zdGFydCBhbmQgbG9nZ2VkX2NoYXJzCisgKiBJdCBpcyBhbHNvIHVzZWQgaW4gaW50ZXJlc3Rpbmcgd2F5cyB0byBwcm92aWRlIGludGVybG9ja2luZyBpbgorICogY29uc29sZV91bmxvY2soKTsuCisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxvZ2J1Zl9sb2NrKTsKKworI2RlZmluZSBMT0dfQlVGX01BU0sgKGxvZ19idWZfbGVuLTEpCisjZGVmaW5lIExPR19CVUYoaWR4KSAobG9nX2J1ZlsoaWR4KSAmIExPR19CVUZfTUFTS10pCisKKy8qCisgKiBUaGUgaW5kaWNlcyBpbnRvIGxvZ19idWYgYXJlIG5vdCBjb25zdHJhaW5lZCB0byBsb2dfYnVmX2xlbiAtIHRoZXkKKyAqIG11c3QgYmUgbWFza2VkIGJlZm9yZSBzdWJzY3JpcHRpbmcKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvZ19zdGFydDsJLyogSW5kZXggaW50byBsb2dfYnVmOiBuZXh0IGNoYXIgdG8gYmUgcmVhZCBieSBzeXNsb2coKSAqLworc3RhdGljIHVuc2lnbmVkIGNvbl9zdGFydDsJLyogSW5kZXggaW50byBsb2dfYnVmOiBuZXh0IGNoYXIgdG8gYmUgc2VudCB0byBjb25zb2xlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvZ19lbmQ7CS8qIEluZGV4IGludG8gbG9nX2J1ZjogbW9zdC1yZWNlbnRseS13cml0dGVuLWNoYXIgKyAxICovCisKKy8qCisgKiBJZiBleGNsdXNpdmVfY29uc29sZSBpcyBub24tTlVMTCB0aGVuIG9ubHkgdGhpcyBjb25zb2xlIGlzIHRvIGJlIHByaW50ZWQgdG8uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSAqZXhjbHVzaXZlX2NvbnNvbGU7CisKKy8qCisgKglBcnJheSBvZiBjb25zb2xlcyBidWlsdCBmcm9tIGNvbW1hbmQgbGluZSBvcHRpb25zIChjb25zb2xlPSkKKyAqLworc3RydWN0IGNvbnNvbGVfY21kbGluZQoreworCWNoYXIJbmFtZVsxNl07CQkJLyogTmFtZSBvZiB0aGUgZHJpdmVyCSAgICAqLworCWludAlpbmRleDsJCQkJLyogTWlub3IgZGV2LiB0byB1c2UJICAgICovCisJY2hhcgkqb3B0aW9uczsJCQkvKiBPcHRpb25zIGZvciB0aGUgZHJpdmVyICAgKi8KKyNpZmRlZiBDT05GSUdfQTExWV9CUkFJTExFX0NPTlNPTEUKKwljaGFyCSpicmxfb3B0aW9uczsJCQkvKiBPcHRpb25zIGZvciBicmFpbGxlIGRyaXZlciAqLworI2VuZGlmCit9OworCisjZGVmaW5lIE1BWF9DTURMSU5FQ09OU09MRVMgOAorCitzdGF0aWMgc3RydWN0IGNvbnNvbGVfY21kbGluZSBjb25zb2xlX2NtZGxpbmVbTUFYX0NNRExJTkVDT05TT0xFU107CitzdGF0aWMgaW50IHNlbGVjdGVkX2NvbnNvbGUgPSAtMTsKK3N0YXRpYyBpbnQgcHJlZmVycmVkX2NvbnNvbGUgPSAtMTsKK2ludCBjb25zb2xlX3NldF9vbl9jbWRsaW5lOworRVhQT1JUX1NZTUJPTChjb25zb2xlX3NldF9vbl9jbWRsaW5lKTsKKworLyogRmxhZzogY29uc29sZSBjb2RlIG1heSBjYWxsIHNjaGVkdWxlKCkgKi8KK3N0YXRpYyBpbnQgY29uc29sZV9tYXlfc2NoZWR1bGU7CisKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisKK3N0YXRpYyBjaGFyIF9fbG9nX2J1ZltfX0xPR19CVUZfTEVOXTsKK3N0YXRpYyBjaGFyICpsb2dfYnVmID0gX19sb2dfYnVmOworc3RhdGljIGludCBsb2dfYnVmX2xlbiA9IF9fTE9HX0JVRl9MRU47CitzdGF0aWMgdW5zaWduZWQgbG9nZ2VkX2NoYXJzOyAvKiBOdW1iZXIgb2YgY2hhcnMgcHJvZHVjZWQgc2luY2UgbGFzdCByZWFkK2NsZWFyIG9wZXJhdGlvbiAqLworc3RhdGljIGludCBzYXZlZF9jb25zb2xlX2xvZ2xldmVsID0gLTE7CisKKyNpZmRlZiBDT05GSUdfS0VYRUMKKy8qCisgKiBUaGlzIGFwcGVuZHMgdGhlIGxpc3RlZCBzeW1ib2xzIHRvIC9wcm9jL3ZtY29yZWluZm8KKyAqCisgKiAvcHJvYy92bWNvcmVpbmZvIGlzIHVzZWQgYnkgdmFyaW91cyB1dGlpbHRpZXMsIGxpa2UgY3Jhc2ggYW5kIG1ha2VkdW1wZmlsZSB0bworICogb2J0YWluIGFjY2VzcyB0byBzeW1ib2xzIHRoYXQgYXJlIG90aGVyd2lzZSB2ZXJ5IGRpZmZpY3VsdCB0byBsb2NhdGUuICBUaGVzZQorICogc3ltYm9scyBhcmUgc3BlY2lmaWNhbGx5IHVzZWQgc28gdGhhdCB1dGlsaXRpZXMgY2FuIGFjY2VzcyBhbmQgZXh0cmFjdCB0aGUKKyAqIGRtZXNnIGxvZyBmcm9tIGEgdm1jb3JlIGZpbGUgYWZ0ZXIgYSBjcmFzaC4KKyAqLwordm9pZCBsb2dfYnVmX2tleGVjX3NldHVwKHZvaWQpCit7CisJVk1DT1JFSU5GT19TWU1CT0wobG9nX2J1Zik7CisJVk1DT1JFSU5GT19TWU1CT0wobG9nX2VuZCk7CisJVk1DT1JFSU5GT19TWU1CT0wobG9nX2J1Zl9sZW4pOworCVZNQ09SRUlORk9fU1lNQk9MKGxvZ2dlZF9jaGFycyk7Cit9CisjZW5kaWYKKworLyogcmVxdWVzdGVkIGxvZ19idWZfbGVuIGZyb20ga2VybmVsIGNtZGxpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbmV3X2xvZ19idWZfbGVuOworCisvKiBzYXZlIHJlcXVlc3RlZCBsb2dfYnVmX2xlbiBzaW5jZSBpdCdzIHRvbyBlYXJseSB0byBwcm9jZXNzIGl0ICovCitzdGF0aWMgaW50IF9faW5pdCBsb2dfYnVmX2xlbl9zZXR1cChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgc2l6ZSA9IG1lbXBhcnNlKHN0ciwgJnN0cik7CisKKwlpZiAoc2l6ZSkKKwkJc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhzaXplKTsKKwlpZiAoc2l6ZSA+IGxvZ19idWZfbGVuKQorCQluZXdfbG9nX2J1Zl9sZW4gPSBzaXplOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibG9nX2J1Zl9sZW4iLCBsb2dfYnVmX2xlbl9zZXR1cCk7CisKK3ZvaWQgX19pbml0IHNldHVwX2xvZ19idWYoaW50IGVhcmx5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3RhcnQsIGRlc3RfaWR4LCBvZmZzZXQ7CisJY2hhciAqbmV3X2xvZ19idWY7CisJaW50IGZyZWU7CisKKwlpZiAoIW5ld19sb2dfYnVmX2xlbikKKwkJcmV0dXJuOworCisJaWYgKGVhcmx5KSB7CisJCXVuc2lnbmVkIGxvbmcgbWVtOworCisJCW1lbSA9IG1lbWJsb2NrX2FsbG9jKG5ld19sb2dfYnVmX2xlbiwgUEFHRV9TSVpFKTsKKwkJaWYgKCFtZW0pCisJCQlyZXR1cm47CisJCW5ld19sb2dfYnVmID0gX192YShtZW0pOworCX0gZWxzZSB7CisJCW5ld19sb2dfYnVmID0gYWxsb2NfYm9vdG1lbV9ub3BhbmljKG5ld19sb2dfYnVmX2xlbik7CisJfQorCisJaWYgKHVubGlrZWx5KCFuZXdfbG9nX2J1ZikpIHsKKwkJcHJfZXJyKCJsb2dfYnVmX2xlbjogJWxkIGJ5dGVzIG5vdCBhdmFpbGFibGVcbiIsCisJCQluZXdfbG9nX2J1Zl9sZW4pOworCQlyZXR1cm47CisJfQorCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCWxvZ19idWZfbGVuID0gbmV3X2xvZ19idWZfbGVuOworCWxvZ19idWYgPSBuZXdfbG9nX2J1ZjsKKwluZXdfbG9nX2J1Zl9sZW4gPSAwOworCWZyZWUgPSBfX0xPR19CVUZfTEVOIC0gbG9nX2VuZDsKKworCW9mZnNldCA9IHN0YXJ0ID0gbWluKGNvbl9zdGFydCwgbG9nX3N0YXJ0KTsKKwlkZXN0X2lkeCA9IDA7CisJd2hpbGUgKHN0YXJ0ICE9IGxvZ19lbmQpIHsKKwkJdW5zaWduZWQgbG9nX2lkeF9tYXNrID0gc3RhcnQgJiAoX19MT0dfQlVGX0xFTiAtIDEpOworCisJCWxvZ19idWZbZGVzdF9pZHhdID0gX19sb2dfYnVmW2xvZ19pZHhfbWFza107CisJCXN0YXJ0Kys7CisJCWRlc3RfaWR4Kys7CisJfQorCWxvZ19zdGFydCAtPSBvZmZzZXQ7CisJY29uX3N0YXJ0IC09IG9mZnNldDsKKwlsb2dfZW5kIC09IG9mZnNldDsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCXByX2luZm8oImxvZ19idWZfbGVuOiAlZFxuIiwgbG9nX2J1Zl9sZW4pOworCXByX2luZm8oImVhcmx5IGxvZyBidWYgZnJlZTogJWQoJWQlJSlcbiIsCisJCWZyZWUsIChmcmVlICogMTAwKSAvIF9fTE9HX0JVRl9MRU4pOworfQorCisjaWZkZWYgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZCisKK3N0YXRpYyBpbnQgYm9vdF9kZWxheTsgLyogbXNlY3MgZGVsYXkgYWZ0ZXIgZWFjaCBwcmludGsgZHVyaW5nIGJvb3R1cCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBsb29wc19wZXJfbXNlYzsJLyogYmFzZWQgb24gYm9vdF9kZWxheSAqLworCitzdGF0aWMgaW50IF9faW5pdCBib290X2RlbGF5X3NldHVwKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIGxwajsKKworCWxwaiA9IHByZXNldF9scGogPyBwcmVzZXRfbHBqIDogMTAwMDAwMDsJLyogc29tZSBndWVzcyAqLworCWxvb3BzX3Blcl9tc2VjID0gKHVuc2lnbmVkIGxvbmcgbG9uZylscGogLyAxMDAwICogSFo7CisKKwlnZXRfb3B0aW9uKCZzdHIsICZib290X2RlbGF5KTsKKwlpZiAoYm9vdF9kZWxheSA+IDEwICogMTAwMCkKKwkJYm9vdF9kZWxheSA9IDA7CisKKwlwcl9kZWJ1ZygiYm9vdF9kZWxheTogJXUsIHByZXNldF9scGo6ICVsZCwgbHBqOiAlbHUsICIKKwkJIkhaOiAlZCwgbG9vcHNfcGVyX21zZWM6ICVsbHVcbiIsCisJCWJvb3RfZGVsYXksIHByZXNldF9scGosIGxwaiwgSFosIGxvb3BzX3Blcl9tc2VjKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImJvb3RfZGVsYXk9IiwgYm9vdF9kZWxheV9zZXR1cCk7CisKK3N0YXRpYyB2b2lkIGJvb3RfZGVsYXlfbXNlYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBrOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChib290X2RlbGF5ID09IDAgfHwgc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9CT09USU5HKQorCQlyZXR1cm47CisKKwlrID0gKHVuc2lnbmVkIGxvbmcgbG9uZylsb29wc19wZXJfbXNlYyAqIGJvb3RfZGVsYXk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoYm9vdF9kZWxheSk7CisJd2hpbGUgKGspIHsKKwkJay0tOworCQljcHVfcmVsYXgoKTsKKwkJLyoKKwkJICogdXNlICh2b2xhdGlsZSkgamlmZmllcyB0byBwcmV2ZW50CisJCSAqIGNvbXBpbGVyIHJlZHVjdGlvbjsgbG9vcCB0ZXJtaW5hdGlvbiB2aWEgamlmZmllcworCQkgKiBpcyBzZWNvbmRhcnkgYW5kIG1heSBvciBtYXkgbm90IGhhcHBlbi4KKwkJICovCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYm9vdF9kZWxheV9tc2VjKHZvaWQpCit7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHVucmVhZCBjaGFyYWN0ZXJzIGluIHRoZSBsb2cgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxvZ19idWZfZ2V0X2xlbih2b2lkKQoreworCXJldHVybiBsb2dnZWRfY2hhcnM7Cit9CisKKy8qCisgKiBDbGVhcnMgdGhlIHJpbmctYnVmZmVyCisgKi8KK3ZvaWQgbG9nX2J1Zl9jbGVhcih2b2lkKQoreworCWxvZ2dlZF9jaGFycyA9IDA7Cit9CisKKy8qCisgKiBDb3B5IGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsb2cgYnVmZmVyLgorICovCitpbnQgbG9nX2J1Zl9jb3B5KGNoYXIgKmRlc3QsIGludCBpZHgsIGludCBsZW4pCit7CisJaW50IHJldCwgbWF4OworCWJvb2wgdG9va19sb2NrID0gZmFsc2U7CisKKwlpZiAoIW9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJcmF3X3NwaW5fbG9ja19pcnEoJmxvZ2J1Zl9sb2NrKTsKKwkJdG9va19sb2NrID0gdHJ1ZTsKKwl9CisKKwltYXggPSBsb2dfYnVmX2dldF9sZW4oKTsKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gbWF4KSB7CisJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCWlmIChsZW4gPiBtYXggLSBpZHgpCisJCQlsZW4gPSBtYXggLSBpZHg7CisJCXJldCA9IGxlbjsKKwkJaWR4ICs9IChsb2dfZW5kIC0gbWF4KTsKKwkJd2hpbGUgKGxlbi0tID4gMCkKKwkJCWRlc3RbbGVuXSA9IExPR19CVUYoaWR4ICsgbGVuKTsKKwl9CisKKwlpZiAodG9va19sb2NrKQorCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZsb2didWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX0RNRVNHX1JFU1RSSUNUCitpbnQgZG1lc2dfcmVzdHJpY3QgPSAxOworI2Vsc2UKK2ludCBkbWVzZ19yZXN0cmljdDsKKyNlbmRpZgorCitzdGF0aWMgaW50IHN5c2xvZ19hY3Rpb25fcmVzdHJpY3RlZChpbnQgdHlwZSkKK3sKKwlpZiAoZG1lc2dfcmVzdHJpY3QpCisJCXJldHVybiAxOworCS8qIFVubGVzcyByZXN0cmljdGVkLCB3ZSBhbGxvdyAicmVhZCBhbGwiIGFuZCAiZ2V0IGJ1ZmZlciBzaXplIiBmb3IgZXZlcnlib2R5ICovCisJcmV0dXJuIHR5cGUgIT0gU1lTTE9HX0FDVElPTl9SRUFEX0FMTCAmJiB0eXBlICE9IFNZU0xPR19BQ1RJT05fU0laRV9CVUZGRVI7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc3lzbG9nX3Blcm1pc3Npb25zKGludCB0eXBlLCBib29sIGZyb21fZmlsZSkKK3sKKwkvKgorCSAqIElmIHRoaXMgaXMgZnJvbSAvcHJvYy9rbXNnIGFuZCB3ZSd2ZSBhbHJlYWR5IG9wZW5lZCBpdCwgdGhlbiB3ZSd2ZQorCSAqIGFscmVhZHkgZG9uZSB0aGUgY2FwYWJpbGl0aWVzIGNoZWNrcyBhdCBvcGVuIHRpbWUuCisJICovCisJaWYgKGZyb21fZmlsZSAmJiB0eXBlICE9IFNZU0xPR19BQ1RJT05fT1BFTikKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3lzbG9nX2FjdGlvbl9yZXN0cmljdGVkKHR5cGUpKSB7CisJCWlmIChjYXBhYmxlKENBUF9TWVNMT0cpKQorCQkJcmV0dXJuIDA7CisJCS8qIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGFjY2VwdCBDQVBfU1lTX0FETUlOIHRvbywgd2l0aCBhIHdhcm5pbmcgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiJXMgKCVkKTogIgorCQkJCSAiQXR0ZW1wdCB0byBhY2Nlc3Mgc3lzbG9nIHdpdGggQ0FQX1NZU19BRE1JTiAiCisJCQkJICJidXQgbm8gQ0FQX1NZU0xPRyAoZGVwcmVjYXRlZCkuXG4iLAorCQkJCSBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVQRVJNOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3N5c2xvZyhpbnQgdHlwZSwgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGxlbiwgYm9vbCBmcm9tX2ZpbGUpCit7CisJdW5zaWduZWQgaSwgaiwgbGltaXQsIGNvdW50OworCWludCBkb19jbGVhciA9IDA7CisJY2hhciBjOworCWludCBlcnJvcjsKKworCWVycm9yID0gY2hlY2tfc3lzbG9nX3Blcm1pc3Npb25zKHR5cGUsIGZyb21fZmlsZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gc2VjdXJpdHlfc3lzbG9nKHR5cGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTWVNMT0dfQUNUSU9OX0NMT1NFOgkvKiBDbG9zZSBsb2cgKi8KKwkJYnJlYWs7CisJY2FzZSBTWVNMT0dfQUNUSU9OX09QRU46CS8qIE9wZW4gbG9nICovCisJCWJyZWFrOworCWNhc2UgU1lTTE9HX0FDVElPTl9SRUFEOgkvKiBSZWFkIGZyb20gbG9nICovCisJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCFidWYgfHwgbGVuIDwgMCkKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IDA7CisJCWlmICghbGVuKQorCQkJZ290byBvdXQ7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBsZW4pKSB7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShsb2dfd2FpdCwKKwkJCQkJCQkobG9nX3N0YXJ0IC0gbG9nX2VuZCkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJaSA9IDA7CisJCXJhd19zcGluX2xvY2tfaXJxKCZsb2didWZfbG9jayk7CisJCXdoaWxlICghZXJyb3IgJiYgKGxvZ19zdGFydCAhPSBsb2dfZW5kKSAmJiBpIDwgbGVuKSB7CisJCQljID0gTE9HX0JVRihsb2dfc3RhcnQpOworCQkJbG9nX3N0YXJ0Kys7CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZsb2didWZfbG9jayk7CisJCQllcnJvciA9IF9fcHV0X3VzZXIoYyxidWYpOworCQkJYnVmKys7CisJCQlpKys7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCXJhd19zcGluX2xvY2tfaXJxKCZsb2didWZfbG9jayk7CisJCX0KKwkJcmF3X3NwaW5fdW5sb2NrX2lycSgmbG9nYnVmX2xvY2spOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBpOworCQlicmVhazsKKwkvKiBSZWFkL2NsZWFyIGxhc3Qga2VybmVsIG1lc3NhZ2VzICovCisJY2FzZSBTWVNMT0dfQUNUSU9OX1JFQURfQ0xFQVI6CisJCWRvX2NsZWFyID0gMTsKKwkJLyogRkFMTCBUSFJVICovCisJLyogUmVhZCBsYXN0IGtlcm5lbCBtZXNzYWdlcyAqLworCWNhc2UgU1lTTE9HX0FDVElPTl9SRUFEX0FMTDoKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlpZiAoIWJ1ZiB8fCBsZW4gPCAwKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gMDsKKwkJaWYgKCFsZW4pCisJCQlnb3RvIG91dDsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGxlbikpIHsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWNvdW50ID0gbGVuOworCQlpZiAoY291bnQgPiBsb2dfYnVmX2xlbikKKwkJCWNvdW50ID0gbG9nX2J1Zl9sZW47CisJCXJhd19zcGluX2xvY2tfaXJxKCZsb2didWZfbG9jayk7CisJCWlmIChjb3VudCA+IGxvZ2dlZF9jaGFycykKKwkJCWNvdW50ID0gbG9nZ2VkX2NoYXJzOworCQlpZiAoZG9fY2xlYXIpCisJCQlsb2dnZWRfY2hhcnMgPSAwOworCQlsaW1pdCA9IGxvZ19lbmQ7CisJCS8qCisJCSAqIF9fcHV0X3VzZXIoKSBjb3VsZCBzbGVlcCwgYW5kIHdoaWxlIHdlIHNsZWVwCisJCSAqIHByaW50aygpIGNvdWxkIG92ZXJ3cml0ZSB0aGUgbWVzc2FnZXMKKwkJICogd2UgdHJ5IHRvIGNvcHkgdG8gdXNlciBzcGFjZS4gVGhlcmVmb3JlCisJCSAqIHRoZSBtZXNzYWdlcyBhcmUgY29waWVkIGluIHJldmVyc2UuIDxtYW5mcmVkcz4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiAhZXJyb3I7IGkrKykgeworCQkJaiA9IGxpbWl0LTEtaTsKKwkJCWlmIChqICsgbG9nX2J1Zl9sZW4gPCBsb2dfZW5kKQorCQkJCWJyZWFrOworCQkJYyA9IExPR19CVUYoaik7CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZsb2didWZfbG9jayk7CisJCQllcnJvciA9IF9fcHV0X3VzZXIoYywmYnVmW2NvdW50LTEtaV0pOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlyYXdfc3Bpbl9sb2NrX2lycSgmbG9nYnVmX2xvY2spOworCQl9CisJCXJhd19zcGluX3VubG9ja19pcnEoJmxvZ2J1Zl9sb2NrKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJCWVycm9yID0gaTsKKwkJaWYgKGkgIT0gY291bnQpIHsKKwkJCWludCBvZmZzZXQgPSBjb3VudC1lcnJvcjsKKwkJCS8qIGJ1ZmZlciBvdmVyZmxvdyBkdXJpbmcgY29weSwgY29ycmVjdCB1c2VyIGJ1ZmZlci4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBlcnJvcjsgaSsrKSB7CisJCQkJaWYgKF9fZ2V0X3VzZXIoYywmYnVmW2krb2Zmc2V0XSkgfHwKKwkJCQkgICAgX19wdXRfdXNlcihjLCZidWZbaV0pKSB7CisJCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJfQorCQl9CisJCWJyZWFrOworCS8qIENsZWFyIHJpbmcgYnVmZmVyICovCisJY2FzZSBTWVNMT0dfQUNUSU9OX0NMRUFSOgorCQlsb2dnZWRfY2hhcnMgPSAwOworCQlicmVhazsKKwkvKiBEaXNhYmxlIGxvZ2dpbmcgdG8gY29uc29sZSAqLworCWNhc2UgU1lTTE9HX0FDVElPTl9DT05TT0xFX09GRjoKKwkJaWYgKHNhdmVkX2NvbnNvbGVfbG9nbGV2ZWwgPT0gLTEpCisJCQlzYXZlZF9jb25zb2xlX2xvZ2xldmVsID0gY29uc29sZV9sb2dsZXZlbDsKKwkJY29uc29sZV9sb2dsZXZlbCA9IG1pbmltdW1fY29uc29sZV9sb2dsZXZlbDsKKwkJYnJlYWs7CisJLyogRW5hYmxlIGxvZ2dpbmcgdG8gY29uc29sZSAqLworCWNhc2UgU1lTTE9HX0FDVElPTl9DT05TT0xFX09OOgorCQlpZiAoc2F2ZWRfY29uc29sZV9sb2dsZXZlbCAhPSAtMSkgeworCQkJY29uc29sZV9sb2dsZXZlbCA9IHNhdmVkX2NvbnNvbGVfbG9nbGV2ZWw7CisJCQlzYXZlZF9jb25zb2xlX2xvZ2xldmVsID0gLTE7CisJCX0KKwkJYnJlYWs7CisJLyogU2V0IGxldmVsIG9mIG1lc3NhZ2VzIHByaW50ZWQgdG8gY29uc29sZSAqLworCWNhc2UgU1lTTE9HX0FDVElPTl9DT05TT0xFX0xFVkVMOgorCQllcnJvciA9IC1FSU5WQUw7CisJCWlmIChsZW4gPCAxIHx8IGxlbiA+IDgpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxlbiA8IG1pbmltdW1fY29uc29sZV9sb2dsZXZlbCkKKwkJCWxlbiA9IG1pbmltdW1fY29uc29sZV9sb2dsZXZlbDsKKwkJY29uc29sZV9sb2dsZXZlbCA9IGxlbjsKKwkJLyogSW1wbGljaXRseSByZS1lbmFibGUgbG9nZ2luZyB0byBjb25zb2xlICovCisJCXNhdmVkX2NvbnNvbGVfbG9nbGV2ZWwgPSAtMTsKKwkJZXJyb3IgPSAwOworCQlicmVhazsKKwkvKiBOdW1iZXIgb2YgY2hhcnMgaW4gdGhlIGxvZyBidWZmZXIgKi8KKwljYXNlIFNZU0xPR19BQ1RJT05fU0laRV9VTlJFQUQ6CisJCWVycm9yID0gbG9nX2VuZCAtIGxvZ19zdGFydDsKKwkJYnJlYWs7CisJLyogU2l6ZSBvZiB0aGUgbG9nIGJ1ZmZlciAqLworCWNhc2UgU1lTTE9HX0FDVElPTl9TSVpFX0JVRkZFUjoKKwkJZXJyb3IgPSBsb2dfYnVmX2xlbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitTWVNDQUxMX0RFRklORTMoc3lzbG9nLCBpbnQsIHR5cGUsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBsZW4pCit7CisJcmV0dXJuIGRvX3N5c2xvZyh0eXBlLCBidWYsIGxlbiwgU1lTTE9HX0ZST01fQ0FMTCk7Cit9CisKKyNpZmRlZglDT05GSUdfS0dEQl9LREIKKy8qIGtkYiBkbWVzZyBjb21tYW5kIG5lZWRzIGFjY2VzcyB0byB0aGUgc3lzbG9nIGJ1ZmZlci4gIGRvX3N5c2xvZygpCisgKiB1c2VzIGxvY2tzIHNvIGl0IGNhbm5vdCBiZSB1c2VkIGR1cmluZyBkZWJ1Z2dpbmcuICBKdXN0IHRlbGwga2RiCisgKiB3aGVyZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgcGh5c2ljYWwgYW5kIGxvZ2ljYWwgbG9ncyBhcmUuICBUaGlzCisgKiBpcyBlcXVpdmFsZW50IHRvIGRvX3N5c2xvZygzKS4KKyAqLwordm9pZCBrZGJfc3lzbG9nX2RhdGEoY2hhciAqc3lzbG9nX2RhdGFbNF0pCit7CisJc3lzbG9nX2RhdGFbMF0gPSBsb2dfYnVmOworCXN5c2xvZ19kYXRhWzFdID0gbG9nX2J1ZiArIGxvZ19idWZfbGVuOworCXN5c2xvZ19kYXRhWzJdID0gbG9nX2J1ZiArIGxvZ19lbmQgLQorCQkobG9nZ2VkX2NoYXJzIDwgbG9nX2J1Zl9sZW4gPyBsb2dnZWRfY2hhcnMgOiBsb2dfYnVmX2xlbik7CisJc3lzbG9nX2RhdGFbM10gPSBsb2dfYnVmICsgbG9nX2VuZDsKK30KKyNlbmRpZgkvKiBDT05GSUdfS0dEQl9LREIgKi8KKworLyoKKyAqIENhbGwgdGhlIGNvbnNvbGUgZHJpdmVycyBvbiBhIHJhbmdlIG9mIGxvZ19idWYKKyAqLworc3RhdGljIHZvaWQgX19jYWxsX2NvbnNvbGVfZHJpdmVycyh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworCXN0cnVjdCBjb25zb2xlICpjb247CisKKwltaWdyYXRlX2Rpc2FibGUoKTsKKwlmb3JfZWFjaF9jb25zb2xlKGNvbikgeworCQlpZiAoZXhjbHVzaXZlX2NvbnNvbGUgJiYgY29uICE9IGV4Y2x1c2l2ZV9jb25zb2xlKQorCQkJY29udGludWU7CisJCWlmICgoY29uLT5mbGFncyAmIENPTl9FTkFCTEVEKSAmJiBjb24tPndyaXRlICYmCisJCQkJKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSB8fAorCQkJCShjb24tPmZsYWdzICYgQ09OX0FOWVRJTUUpKSkKKwkJCWNvbi0+d3JpdGUoY29uLCAmTE9HX0JVRihzdGFydCksIGVuZCAtIHN0YXJ0KTsKKwl9CisJbWlncmF0ZV9lbmFibGUoKTsKK30KKworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKK3N0cnVjdCBjb25zb2xlICplYXJseV9jb25zb2xlOworCitzdGF0aWMgdm9pZCBlYXJseV92cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlpZiAoZWFybHlfY29uc29sZSkgeworCQljaGFyIGJ1Zls1MTJdOworCQlpbnQgbiA9IHZzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisKKwkJZWFybHlfY29uc29sZS0+d3JpdGUoZWFybHlfY29uc29sZSwgYnVmLCBuKTsKKwl9Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBlYXJseV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWVhcmx5X3ZwcmludGsoZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgaW5kZXBlbmRlbnQgb2YgYW55IGxvZyBsZXZlbHMgLSBhIGdsb2JhbAorICoga2lsbCBzd2l0Y2ggdGhhdCB0dXJucyBvZmYgYWxsIG9mIHByaW50ay4KKyAqCisgKiBVc2VkIGJ5IHRoZSBOTUkgd2F0Y2hkb2cgaWYgZWFybHktcHJpbnRrIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBib29sIF9fcmVhZF9tb3N0bHkgcHJpbnRrX2tpbGxzd2l0Y2g7CisKK3N0YXRpYyBpbnQgX19pbml0IGZvcmNlX2Vhcmx5X3ByaW50a19zZXR1cChjaGFyICpzdHIpCit7CisJcHJpbnRrX2tpbGxzd2l0Y2ggPSB0cnVlOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImZvcmNlX2Vhcmx5X3ByaW50ayIsIGZvcmNlX2Vhcmx5X3ByaW50a19zZXR1cCk7CisKK3ZvaWQgcHJpbnRrX2tpbGwodm9pZCkKK3sKKwlwcmludGtfa2lsbHN3aXRjaCA9IHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZm9yY2VkX2Vhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJaWYgKCFwcmludGtfa2lsbHN3aXRjaCkKKwkJcmV0dXJuIDA7CisJZWFybHlfdnByaW50ayhmbXQsIGFwKTsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBmb3JjZWRfZWFybHlfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgYm9vbCBfX3JlYWRfbW9zdGx5IGlnbm9yZV9sb2dsZXZlbDsKKworc3RhdGljIGludCBfX2luaXQgaWdub3JlX2xvZ2xldmVsX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZ25vcmVfbG9nbGV2ZWwgPSAxOworCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBpZ25vcmluZyBsb2dsZXZlbCBzZXR0aW5nLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworZWFybHlfcGFyYW0oImlnbm9yZV9sb2dsZXZlbCIsIGlnbm9yZV9sb2dsZXZlbF9zZXR1cCk7Cittb2R1bGVfcGFyYW0oaWdub3JlX2xvZ2xldmVsLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9sb2dsZXZlbCwgImlnbm9yZSBsb2dsZXZlbCBzZXR0aW5nLCB0byIKKwkicHJpbnQgYWxsIGtlcm5lbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZS4iKTsKKworLyoKKyAqIFdyaXRlIG91dCBjaGFycyBmcm9tIHN0YXJ0IHRvIGVuZCAtIDEgaW5jbHVzaXZlCisgKi8KK3N0YXRpYyB2b2lkIF9jYWxsX2NvbnNvbGVfZHJpdmVycyh1bnNpZ25lZCBzdGFydCwKKwkJCQl1bnNpZ25lZCBlbmQsIGludCBtc2dfbG9nX2xldmVsKQoreworCXRyYWNlX2NvbnNvbGUoJkxPR19CVUYoMCksIHN0YXJ0LCBlbmQsIGxvZ19idWZfbGVuKTsKKworCWlmICgobXNnX2xvZ19sZXZlbCA8IGNvbnNvbGVfbG9nbGV2ZWwgfHwgaWdub3JlX2xvZ2xldmVsKSAmJgorCQkJY29uc29sZV9kcml2ZXJzICYmIHN0YXJ0ICE9IGVuZCkgeworCQlpZiAoKHN0YXJ0ICYgTE9HX0JVRl9NQVNLKSA+IChlbmQgJiBMT0dfQlVGX01BU0spKSB7CisJCQkvKiB3cmFwcGVkIHdyaXRlICovCisJCQlfX2NhbGxfY29uc29sZV9kcml2ZXJzKHN0YXJ0ICYgTE9HX0JVRl9NQVNLLAorCQkJCQkJbG9nX2J1Zl9sZW4pOworCQkJX19jYWxsX2NvbnNvbGVfZHJpdmVycygwLCBlbmQgJiBMT0dfQlVGX01BU0spOworCQl9IGVsc2UgeworCQkJX19jYWxsX2NvbnNvbGVfZHJpdmVycyhzdGFydCwgZW5kKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFBhcnNlIHRoZSBzeXNsb2cgaGVhZGVyIDxbMC05XSo+LiBUaGUgZGVjaW1hbCB2YWx1ZSByZXByZXNlbnRzIDMyYml0LCB0aGUKKyAqIGxvd2VyIDMgYml0IGFyZSB0aGUgbG9nIGxldmVsLCB0aGUgcmVzdCBhcmUgdGhlIGxvZyBmYWNpbGl0eS4gSW4gY2FzZQorICogdXNlcnNwYWNlIHBhc3NlcyB1c3VhbCB1c2Vyc3BhY2Ugc3lzbG9nIG1lc3NhZ2VzIHRvIC9kZXYva21zZyBvcgorICogL2Rldi90dHlwcmludGssIHRoZSBsb2cgcHJlZml4IG1pZ2h0IGNvbnRhaW4gdGhlIGZhY2lsaXR5LiBQcmludGsgbmVlZHMKKyAqIHRvIGV4dHJhY3QgdGhlIGNvcnJlY3QgbG9nIGxldmVsIGZvciBpbi1rZXJuZWwgcHJvY2Vzc2luZywgYW5kIG5vdCBtYW5nbGUKKyAqIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAqCisgKiBJZiBhIHByZWZpeCBpcyBmb3VuZCwgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IGlzIHJldHVybmVkLiBJZiAnbGV2ZWwnIGlzCisgKiBwYXNzZWQsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlIGxvZyBsZXZlbCB3aXRob3V0IGEgcG9zc2libGUgZmFjaWxpdHkKKyAqIHZhbHVlLiBJZiAnc3BlY2lhbCcgaXMgcGFzc2VkLCB0aGUgc3BlY2lhbCBwcmludGsgcHJlZml4IGNoYXJzIGFyZSBhY2NlcHRlZAorICogYW5kIHJldHVybmVkLiBJZiBubyB2YWxpZCBoZWFkZXIgaXMgZm91bmQsIDAgaXMgcmV0dXJuZWQgYW5kIHRoZSBwYXNzZWQKKyAqIHZhcmlhYmxlcyBhcmUgbm90IHRvdWNoZWQuCisgKi8KK3N0YXRpYyBzaXplX3QgbG9nX3ByZWZpeChjb25zdCBjaGFyICpwLCB1bnNpZ25lZCBpbnQgKmxldmVsLCBjaGFyICpzcGVjaWFsKQoreworCXVuc2lnbmVkIGludCBsZXYgPSAwOworCWNoYXIgc3AgPSAnXDAnOworCXNpemVfdCBsZW47CisKKwlpZiAocFswXSAhPSAnPCcgfHwgIXBbMV0pCisJCXJldHVybiAwOworCWlmIChwWzJdID09ICc+JykgeworCQkvKiB1c3VhbCBzaW5nbGUgZGlnaXQgbGV2ZWwgbnVtYmVyIG9yIHNwZWNpYWwgY2hhciAqLworCQlzd2l0Y2ggKHBbMV0pIHsKKwkJY2FzZSAnMCcgLi4uICc3JzoKKwkJCWxldiA9IHBbMV0gLSAnMCc7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6IC8qIEtFUk5fQ09OVCAqLworCQljYXNlICdkJzogLyogS0VSTl9ERUZBVUxUICovCisJCQlzcCA9IHBbMV07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJCWxlbiA9IDM7CisJfSBlbHNlIHsKKwkJLyogbXVsdGkgZGlnaXQgaW5jbHVkaW5nIHRoZSBsZXZlbCBhbmQgZmFjaWxpdHkgbnVtYmVyICovCisJCWNoYXIgKmVuZHAgPSBOVUxMOworCisJCWxldiA9IChzaW1wbGVfc3RydG91bCgmcFsxXSwgJmVuZHAsIDEwKSAmIDcpOworCQlpZiAoZW5kcCA9PSBOVUxMIHx8IGVuZHBbMF0gIT0gJz4nKQorCQkJcmV0dXJuIDA7CisJCWxlbiA9IChlbmRwICsgMSkgLSBwOworCX0KKworCS8qIGRvIG5vdCBhY2NlcHQgc3BlY2lhbCBjaGFyIGlmIG5vdCBhc2tlZCBmb3IgKi8KKwlpZiAoc3AgJiYgIXNwZWNpYWwpCisJCXJldHVybiAwOworCisJaWYgKHNwZWNpYWwpIHsKKwkJKnNwZWNpYWwgPSBzcDsKKwkJLyogcmV0dXJuIHNwZWNpYWwgY2hhciwgZG8gbm90IHRvdWNoIGxldmVsICovCisJCWlmIChzcCkKKwkJCXJldHVybiBsZW47CisJfQorCisJaWYgKGxldmVsKQorCQkqbGV2ZWwgPSBsZXY7CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIENhbGwgdGhlIGNvbnNvbGUgZHJpdmVycywgYXNraW5nIHRoZW0gdG8gd3JpdGUgb3V0CisgKiBsb2dfYnVmW3N0YXJ0XSB0byBsb2dfYnVmW2VuZCAtIDFdLgorICogVGhlIGNvbnNvbGVfbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGNhbGxfY29uc29sZV9kcml2ZXJzKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisJdW5zaWduZWQgY3VyX2luZGV4LCBzdGFydF9wcmludDsKKwlzdGF0aWMgaW50IG1zZ19sZXZlbCA9IC0xOworCisJQlVHX09OKCgoaW50KShzdGFydCAtIGVuZCkpID4gMCk7CisKKwljdXJfaW5kZXggPSBzdGFydDsKKwlzdGFydF9wcmludCA9IHN0YXJ0OworCXdoaWxlIChjdXJfaW5kZXggIT0gZW5kKSB7CisJCWlmIChtc2dfbGV2ZWwgPCAwICYmICgoZW5kIC0gY3VyX2luZGV4KSA+IDIpKSB7CisJCQkvKgorCQkJICogcHJlcGFyZSBidWZfcHJlZml4LCBhcyBhIGNvbnRpZ3VvdXMgYXJyYXksCisJCQkgKiB0byBiZSBwcm9jZXNzZWQgYnkgbG9nX3ByZWZpeCBmdW5jdGlvbgorCQkJICovCisJCQljaGFyIGJ1Zl9wcmVmaXhbU1lTTE9HX1BSSV9NQVhfTEVOR1RIKzFdOworCQkJdW5zaWduZWQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCAoKGVuZCAtIGN1cl9pbmRleCkpICYmIChpIDwgU1lTTE9HX1BSSV9NQVhfTEVOR1RIKTsgaSsrKSB7CisJCQkJYnVmX3ByZWZpeFtpXSA9IExPR19CVUYoY3VyX2luZGV4ICsgaSk7CisJCQl9CisJCQlidWZfcHJlZml4W2ldID0gJ1wwJzsgLyogZm9yY2UgJ1wwJyBhcyBsYXN0IHN0cmluZyBjaGFyYWN0ZXIgKi8KKworCQkJLyogc3RyaXAgbG9nIHByZWZpeCAqLworCQkJY3VyX2luZGV4ICs9IGxvZ19wcmVmaXgoKGNvbnN0IGNoYXIgKikmYnVmX3ByZWZpeCwgJm1zZ19sZXZlbCwgTlVMTCk7CisJCQlzdGFydF9wcmludCA9IGN1cl9pbmRleDsKKwkJfQorCQl3aGlsZSAoY3VyX2luZGV4ICE9IGVuZCkgeworCQkJY2hhciBjID0gTE9HX0JVRihjdXJfaW5kZXgpOworCisJCQljdXJfaW5kZXgrKzsKKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQlpZiAobXNnX2xldmVsIDwgMCkgeworCQkJCQkvKgorCQkJCQkgKiBwcmludGsoKSBoYXMgYWxyZWFkeSBnaXZlbiB1cyBsb2dsZXZlbCB0YWdzIGluCisJCQkJCSAqIHRoZSBidWZmZXIuICBUaGlzIGNvZGUgaXMgaGVyZSBpbiBjYXNlIHRoZQorCQkJCQkgKiBsb2cgYnVmZmVyIGhhcyB3cmFwcGVkIHJpZ2h0IHJvdW5kIGFuZCBzY3JpYmJsZWQKKwkJCQkJICogb24gdGhvc2UgdGFncworCQkJCQkgKi8KKwkJCQkJbXNnX2xldmVsID0gZGVmYXVsdF9tZXNzYWdlX2xvZ2xldmVsOworCQkJCX0KKwkJCQlfY2FsbF9jb25zb2xlX2RyaXZlcnMoc3RhcnRfcHJpbnQsIGN1cl9pbmRleCwgbXNnX2xldmVsKTsKKwkJCQltc2dfbGV2ZWwgPSAtMTsKKwkJCQlzdGFydF9wcmludCA9IGN1cl9pbmRleDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlfY2FsbF9jb25zb2xlX2RyaXZlcnMoc3RhcnRfcHJpbnQsIGVuZCwgbXNnX2xldmVsKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9sb2dfY2hhcihjaGFyIGMpCit7CisJTE9HX0JVRihsb2dfZW5kKSA9IGM7CisJbG9nX2VuZCsrOworCWlmIChsb2dfZW5kIC0gbG9nX3N0YXJ0ID4gbG9nX2J1Zl9sZW4pCisJCWxvZ19zdGFydCA9IGxvZ19lbmQgLSBsb2dfYnVmX2xlbjsKKwlpZiAobG9nX2VuZCAtIGNvbl9zdGFydCA+IGxvZ19idWZfbGVuKQorCQljb25fc3RhcnQgPSBsb2dfZW5kIC0gbG9nX2J1Zl9sZW47CisJaWYgKGxvZ2dlZF9jaGFycyA8IGxvZ19idWZfbGVuKQorCQlsb2dnZWRfY2hhcnMrKzsKKwkKKwkvKiBBUCBMT0cgQkVHSU4gKi8KKyAgCS8vaWYgKDEgPT0gS0VSTkVMX1NUQVJUX0VORCkKKwkjaWYgMAorCWlmIChLRVJORUxfQlVGRiE9TlVMTCYmZW5hYmxlX2tlcm5lbGxvZyA9PTEpCisgIAl7CisJCVdyaXRlUmluZ0J1ZmZlcihLRVJORUxfQlVGRiwgJmMsIDEpOworCQlyZWFkcmluZ2J1Zl9mb3JfcHJpbnRrKCk7CisgIAl9CisJI2VuZGlmCisJLyogQVAgTE9HIEVORCAqLworCQorI2lmZGVmIENPTkZJR19aQ0FUX0RFVklDRQorI2lmbmRlZiBDT05GSUdfU1lTVEVNX1JFQ09WRVJZCisJI2lmZGVmIFVTRV9DUFBTX0tPCisJaWYoY3Bwc19jYWxsYmFja3MuekNhdEFndF9LZXJuZWxfV3JpdGUpCisJY3Bwc19jYWxsYmFja3MuekNhdEFndF9LZXJuZWxfV3JpdGUoJmMsIDEpOworCSNlbHNlCisJekNhdEFndF9LZXJuZWxfV3JpdGUoJmMsIDEpOworCSNlbmRpZgorI2VuZGlmCisjZW5kaWYKK30KKworLyoKKyAqIFphcCBjb25zb2xlIHJlbGF0ZWQgbG9ja3Mgd2hlbiBvb3BzaW5nLiBPbmx5IHphcCBhdCBtb3N0IG9uY2UKKyAqIGV2ZXJ5IDEwIHNlY29uZHMsIHRvIGxlYXZlIHRpbWUgZm9yIHNsb3cgY29uc29sZXMgdG8gcHJpbnQgYQorICogZnVsbCBvb3BzLgorICovCitzdGF0aWMgdm9pZCB6YXBfbG9ja3Modm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBvb3BzX3RpbWVzdGFtcDsKKworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG9vcHNfdGltZXN0YW1wKSAmJgorCQkJIXRpbWVfYWZ0ZXIoamlmZmllcywgb29wc190aW1lc3RhbXAgKyAzMCAqIEhaKSkKKwkJcmV0dXJuOworCisJb29wc190aW1lc3RhbXAgPSBqaWZmaWVzOworCisJZGVidWdfbG9ja3Nfb2ZmKCk7CisJLyogSWYgYSBjcmFzaCBpcyBvY2N1cnJpbmcsIG1ha2Ugc3VyZSB3ZSBjYW4ndCBkZWFkbG9jayAqLworCXJhd19zcGluX2xvY2tfaW5pdCgmbG9nYnVmX2xvY2spOworCS8qIEFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBwcmludCBpbW1lZGlhdGVseSAqLworCXNlbWFfaW5pdCgmY29uc29sZV9zZW0sIDEpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUFJJTlRLX1RJTUUpCitzdGF0aWMgYm9vbCBwcmludGtfdGltZSA9IDE7CisjZWxzZQorc3RhdGljIGJvb2wgcHJpbnRrX3RpbWUgPSAwOworI2VuZGlmCittb2R1bGVfcGFyYW1fbmFtZWQodGltZSwgcHJpbnRrX3RpbWUsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworc3RhdGljIGJvb2wgYWx3YXlzX2ttc2dfZHVtcDsKK21vZHVsZV9wYXJhbV9uYW1lZChhbHdheXNfa21zZ19kdW1wLCBhbHdheXNfa21zZ19kdW1wLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qIENoZWNrIGlmIHdlIGhhdmUgYW55IGNvbnNvbGUgcmVnaXN0ZXJlZCB0aGF0IGNhbiBiZSBjYWxsZWQgZWFybHkgaW4gYm9vdC4gKi8KK3N0YXRpYyBpbnQgaGF2ZV9jYWxsYWJsZV9jb25zb2xlKHZvaWQpCit7CisJc3RydWN0IGNvbnNvbGUgKmNvbjsKKworCWZvcl9lYWNoX2NvbnNvbGUoY29uKQorCQlpZiAoY29uLT5mbGFncyAmIENPTl9BTllUSU1FKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcmludGsgLSBwcmludCBhIGtlcm5lbCBtZXNzYWdlCisgKiBAZm10OiBmb3JtYXQgc3RyaW5nCisgKgorICogVGhpcyBpcyBwcmludGsoKS4gIEl0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gIFdlIHdhbnQgaXQgdG8gd29yay4KKyAqCisgKiBXZSB0cnkgdG8gZ3JhYiB0aGUgY29uc29sZV9sb2NrLiAgSWYgd2Ugc3VjY2VlZCwgaXQncyBlYXN5IC0gd2UgbG9nIHRoZSBvdXRwdXQgYW5kCisgKiBjYWxsIHRoZSBjb25zb2xlIGRyaXZlcnMuICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgc2VtYXBob3JlIHdlIHBsYWNlIHRoZSBvdXRwdXQKKyAqIGludG8gdGhlIGxvZyBidWZmZXIgYW5kIHJldHVybi4gIFRoZSBjdXJyZW50IGhvbGRlciBvZiB0aGUgY29uc29sZV9zZW0gd2lsbAorICogbm90aWNlIHRoZSBuZXcgb3V0cHV0IGluIGNvbnNvbGVfdW5sb2NrKCk7IGFuZCB3aWxsIHNlbmQgaXQgdG8gdGhlCisgKiBjb25zb2xlcyBiZWZvcmUgcmVsZWFzaW5nIHRoZSBsb2NrLgorICoKKyAqIE9uZSBlZmZlY3Qgb2YgdGhpcyBkZWZlcnJlZCBwcmludGluZyBpcyB0aGF0IGNvZGUgd2hpY2ggY2FsbHMgcHJpbnRrKCkgYW5kCisgKiB0aGVuIGNoYW5nZXMgY29uc29sZV9sb2dsZXZlbCBtYXkgYnJlYWsuIFRoaXMgaXMgYmVjYXVzZSBjb25zb2xlX2xvZ2xldmVsCisgKiBpcyBpbnNwZWN0ZWQgd2hlbiB0aGUgYWN0dWFsIHByaW50aW5nIG9jY3Vycy4KKyAqCisgKiBTZWUgYWxzbzoKKyAqIHByaW50ZigzKQorICoKKyAqIFNlZSB0aGUgdnNucHJpbnRmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0IHN0cmluZyBleHRlbnNpb25zIG92ZXIgQzk5LgorICovCisKK2FzbWxpbmthZ2UgaW50IHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKyNpZmRlZiBDT05GSUdfS0dEQl9LREIKKwlpZiAodW5saWtlbHkoa2RiX3RyYXBfcHJpbnRrKSkgeworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlyID0gdmtkYl9wcmludGYoZm10LCBhcmdzKTsJCQorCQl2YV9lbmQoYXJncyk7CisJCXJldHVybiByOworCX0KKyNlbmRpZgorCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJciA9IHZwcmludGsoZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcjsKK30KKworLyogY3B1IGN1cnJlbnRseSBob2xkaW5nIGxvZ2J1Zl9sb2NrICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IHByaW50a19jcHUgPSBVSU5UX01BWDsKKworLyoKKyAqIENhbiB3ZSBhY3R1YWxseSB1c2UgdGhlIGNvbnNvbGUgYXQgdGhpcyB0aW1lIG9uIHRoaXMgY3B1PworICoKKyAqIENvbnNvbGUgZHJpdmVycyBtYXkgYXNzdW1lIHRoYXQgcGVyLWNwdSByZXNvdXJjZXMgaGF2ZQorICogYmVlbiBhbGxvY2F0ZWQuIFNvIHVubGVzcyB0aGV5J3JlIGV4cGxpY2l0bHkgbWFya2VkIGFzCisgKiBiZWluZyBhYmxlIHRvIGNvcGUgKENPTl9BTllUSU1FKSBkb24ndCBjYWxsIHRoZW0gdW50aWwKKyAqIHRoaXMgQ1BVIGlzIG9mZmljaWFsbHkgdXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNhbl91c2VfY29uc29sZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBjcHVfb25saW5lKGNwdSkgfHwgaGF2ZV9jYWxsYWJsZV9jb25zb2xlKCk7Cit9CisKKy8qCisgKiBUcnkgdG8gZ2V0IGNvbnNvbGUgb3duZXJzaGlwIHRvIGFjdHVhbGx5IHNob3cgdGhlIGtlcm5lbAorICogbWVzc2FnZXMgZnJvbSBhICdwcmludGsnLiBSZXR1cm4gdHJ1ZSAoYW5kIHdpdGggdGhlCisgKiBjb25zb2xlX2xvY2sgaGVsZCwgYW5kICdjb25zb2xlX2xvY2tlZCcgc2V0KSBpZiBpdAorICogaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgd2l0aCB0aGUgJ2xvZ2J1Zl9sb2NrJyBzcGlubG9jayBoZWxkIGFuZAorICogaW50ZXJydXB0cyBkaXNhYmxlZC4gSXQgc2hvdWxkIHJldHVybiB3aXRoICdsb2NrYnVmX2xvY2snCisgKiByZWxlYXNlZCBidXQgaW50ZXJydXB0cyBzdGlsbCBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBjb25zb2xlX3RyeWxvY2tfZm9yX3ByaW50ayh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCV9fcmVsZWFzZXMoJmxvZ2J1Zl9sb2NrKQoreworCWludCByZXR2YWwgPSAwLCB3YWtlID0gMDsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9SVF9GVUxMCisJLyrP37PM08XPyLy2uN/T2tCt0unVu9bY0qrP37PMtcSjqNPrxe3A2rywufrGwsi3yM+jrNTdtqg2MtPFz8i8tqOpo6yyu9TZyrXKsbTy06GjrEVDIDYxNjAwMDU0OTE2OSovCisJaW50IGxvY2sgPSAhZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkICYmICFpcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSAmJgorCQkocHJlZW1wdF9jb3VudCgpIDw9IDEpICYmIChjdXJyZW50LT5wcmlvID4gNjIpOworI2Vsc2UKKwlpbnQgbG9jayA9IDE7CisjZW5kaWYKKworCWlmIChsb2NrICYmIGNvbnNvbGVfdHJ5bG9jaygpKSB7CisJCXJldHZhbCA9IDE7CisKKwkJLyoKKwkJICogSWYgd2UgY2FuJ3QgdXNlIHRoZSBjb25zb2xlLCB3ZSBuZWVkIHRvIHJlbGVhc2UKKwkJICogdGhlIGNvbnNvbGUgc2VtYXBob3JlIGJ5IGhhbmQgdG8gYXZvaWQgZmx1c2hpbmcKKwkJICogdGhlIGJ1ZmZlci4gV2UgbmVlZCB0byBob2xkIHRoZSBjb25zb2xlIHNlbWFwaG9yZQorCQkgKiBpbiBvcmRlciB0byBkbyB0aGlzIHRlc3Qgc2FmZWx5LgorCQkgKi8KKwkJaWYgKCFjYW5fdXNlX2NvbnNvbGUoY3B1KSkgeworCQkJY29uc29sZV9sb2NrZWQgPSAwOworCQkJd2FrZSA9IDE7CisJCQlyZXR2YWwgPSAwOworCQl9CisJfQorCXByaW50a19jcHUgPSBVSU5UX01BWDsKKwlyYXdfc3Bpbl91bmxvY2soJmxvZ2J1Zl9sb2NrKTsKKwlpZiAod2FrZSkKKwkJdXAoJmNvbnNvbGVfc2VtKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIGNvbnN0IGNoYXIgcmVjdXJzaW9uX2J1Z19tc2cgW10gPQorCQlLRVJOX0NSSVQgIkJVRzogcmVjZW50IHByaW50ayByZWN1cnNpb24hXG4iOworc3RhdGljIGludCByZWN1cnNpb25fYnVnOworc3RhdGljIGludCBuZXdfdGV4dF9saW5lID0gMTsKK3N0YXRpYyBjaGFyIHByaW50a19idWZbMTAyNF07CisKK2ludCBwcmludGtfZGVsYXlfbXNlYyBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRrX2RlbGF5KHZvaWQpCit7CisJaWYgKHVubGlrZWx5KHByaW50a19kZWxheV9tc2VjKSkgeworCQlpbnQgbSA9IHByaW50a19kZWxheV9tc2VjOworCisJCXdoaWxlIChtLS0pIHsKKwkJCW1kZWxheSgxKTsKKwkJCXRvdWNoX25taV93YXRjaGRvZygpOworCQl9CisJfQorfQorCithc21saW5rYWdlIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWludCBwcmludGVkX2xlbiA9IDA7CisJaW50IGN1cnJlbnRfbG9nX2xldmVsID0gZGVmYXVsdF9tZXNzYWdlX2xvZ2xldmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRoaXNfY3B1OworCWNoYXIgKnA7CisJc2l6ZV90IHBsZW47CisJY2hhciBzcGVjaWFsOworCisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gZWFybHlfcHJpbnRrIGlmIGEgZGVidWdnaW5nIHN1YnN5c3RlbSBoYXMKKwkgKiBraWxsZWQgcHJpbnRrIG91dHB1dAorCSAqLworCWlmICh1bmxpa2VseShmb3JjZWRfZWFybHlfcHJpbnRrKGZtdCwgYXJncykpKQorCQlyZXR1cm4gMTsKKworCWJvb3RfZGVsYXlfbXNlYygpOworCXByaW50a19kZWxheSgpOworCisJLyogVGhpcyBzdG9wcyB0aGUgaG9sZGVyIG9mIGNvbnNvbGVfc2VtIGp1c3Qgd2hlcmUgd2Ugd2FudCBoaW0gKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKgorCSAqIE91Y2gsIHByaW50ayByZWN1cnNlZCBpbnRvIGl0c2VsZiEKKwkgKi8KKwlpZiAodW5saWtlbHkocHJpbnRrX2NwdSA9PSB0aGlzX2NwdSkpIHsKKwkJLyoKKwkJICogSWYgYSBjcmFzaCBpcyBvY2N1cnJpbmcgZHVyaW5nIHByaW50aygpIG9uIHRoaXMgQ1BVLAorCQkgKiB0aGVuIHRyeSB0byBnZXQgdGhlIGNyYXNoIG1lc3NhZ2Ugb3V0IGJ1dCBtYWtlIHN1cmUKKwkJICogd2UgY2FuJ3QgZGVhZGxvY2suIE90aGVyd2lzZSBqdXN0IHJldHVybiB0byBhdm9pZCB0aGUKKwkJICogcmVjdXJzaW9uIGFuZCByZXR1cm4gLSBidXQgZmxhZyB0aGUgcmVjdXJzaW9uIHNvIHRoYXQKKwkJICogaXQgY2FuIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgYXBwcm9wcmlhdGUgbW9tZW50OgorCQkgKi8KKwkJaWYgKCFvb3BzX2luX3Byb2dyZXNzICYmICFsb2NrZGVwX3JlY3Vyc2luZyhjdXJyZW50KSkgeworCQkJcmVjdXJzaW9uX2J1ZyA9IDE7CisJCQlnb3RvIG91dF9yZXN0b3JlX2lycXM7CisJCX0KKwkJemFwX2xvY2tzKCk7CisJfQorCisJbG9ja2RlcF9vZmYoKTsKKwlyYXdfc3Bpbl9sb2NrKCZsb2didWZfbG9jayk7CisJcHJpbnRrX2NwdSA9IHRoaXNfY3B1OworCisJaWYgKHJlY3Vyc2lvbl9idWcpIHsKKwkJcmVjdXJzaW9uX2J1ZyA9IDA7CisJCXN0cmNweShwcmludGtfYnVmLCByZWN1cnNpb25fYnVnX21zZyk7CisJCXByaW50ZWRfbGVuID0gc3RybGVuKHJlY3Vyc2lvbl9idWdfbXNnKTsKKwl9CisJLyogRW1pdCB0aGUgb3V0cHV0IGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIgKi8KKwlwcmludGVkX2xlbiArPSB2c2NucHJpbnRmKHByaW50a19idWYgKyBwcmludGVkX2xlbiwKKwkJCQkgIHNpemVvZihwcmludGtfYnVmKSAtIHByaW50ZWRfbGVuLCBmbXQsIGFyZ3MpOworCisjaWZkZWYJQ09ORklHX0RFQlVHX0xMCisJcHJpbnRhc2NpaShwcmludGtfYnVmKTsKKyNlbmRpZgorCisJcCA9IHByaW50a19idWY7CisKKwkvKiBSZWFkIGxvZyBsZXZlbCBhbmQgaGFuZGxlIHNwZWNpYWwgcHJpbnRrIHByZWZpeCAqLworCXBsZW4gPSBsb2dfcHJlZml4KHAsICZjdXJyZW50X2xvZ19sZXZlbCwgJnNwZWNpYWwpOworCWlmIChwbGVuKSB7CisJCXAgKz0gcGxlbjsKKworCQlzd2l0Y2ggKHNwZWNpYWwpIHsKKwkJY2FzZSAnYyc6IC8qIFN0cmlwIDxjPiBLRVJOX0NPTlQsIGNvbnRpbnVlIGxpbmUgKi8KKwkJCXBsZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOiAvKiBTdHJpcCA8ZD4gS0VSTl9ERUZBVUxULCBzdGFydCBuZXcgbGluZSAqLworCQkJcGxlbiA9IDA7CisJCWRlZmF1bHQ6CisJCQlpZiAoIW5ld190ZXh0X2xpbmUpIHsKKwkJCQllbWl0X2xvZ19jaGFyKCdcbicpOworCQkJCW5ld190ZXh0X2xpbmUgPSAxOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBvdXRwdXQgaW50byBsb2dfYnVmLiBJZiB0aGUgY2FsbGVyIGRpZG4ndCBwcm92aWRlCisJICogdGhlIGFwcHJvcHJpYXRlIGxvZyBwcmVmaXgsIHdlIGluc2VydCB0aGVtIGhlcmUKKwkgKi8KKwlmb3IgKDsgKnA7IHArKykgeworCQlpZiAobmV3X3RleHRfbGluZSkgeworCQkJbmV3X3RleHRfbGluZSA9IDA7CisKKwkJCWlmIChwbGVuKSB7CisJCQkJLyogQ29weSBvcmlnaW5hbCBsb2cgcHJlZml4ICovCisJCQkJaW50IGk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKQorCQkJCQllbWl0X2xvZ19jaGFyKHByaW50a19idWZbaV0pOworCQkJCXByaW50ZWRfbGVuICs9IHBsZW47CisJCQl9IGVsc2UgeworCQkJCS8qIEFkZCBsb2cgcHJlZml4ICovCisJCQkJZW1pdF9sb2dfY2hhcignPCcpOworCQkJCWVtaXRfbG9nX2NoYXIoY3VycmVudF9sb2dfbGV2ZWwgKyAnMCcpOworCQkJCWVtaXRfbG9nX2NoYXIoJz4nKTsKKwkJCQlwcmludGVkX2xlbiArPSAzOworCQkJfQorCisJCQlpZiAocHJpbnRrX3RpbWUpIHsKKwkJCQkvKiBBZGQgdGhlIGN1cnJlbnQgdGltZSBzdGFtcCAqLworCQkJCWNoYXIgdGJ1Zls1MF0sICp0cDsKKwkJCQl1bnNpZ25lZCB0bGVuOworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB0OworCQkJCXVuc2lnbmVkIGxvbmcgbmFub3NlY19yZW07CisKKwkJCQl0ID0gY3B1X2Nsb2NrKHByaW50a19jcHUpOworCQkJCW5hbm9zZWNfcmVtID0gZG9fZGl2KHQsIDEwMDAwMDAwMDApOworCQkJCXRsZW4gPSBzcHJpbnRmKHRidWYsICJbJTVsdS4lMDZsdV0gIiwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSB0LAorCQkJCQkJbmFub3NlY19yZW0gLyAxMDAwKTsKKworCQkJCWZvciAodHAgPSB0YnVmOyB0cCA8IHRidWYgKyB0bGVuOyB0cCsrKQorCQkJCQllbWl0X2xvZ19jaGFyKCp0cCk7CisJCQkJcHJpbnRlZF9sZW4gKz0gdGxlbjsKKwkJCX0KKworCQkJaWYgKCEqcCkKKwkJCQlicmVhazsKKwkJfQorCisJCWVtaXRfbG9nX2NoYXIoKnApOworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCW5ld190ZXh0X2xpbmUgPSAxOworCX0KKworCS8qCisJICogVHJ5IHRvIGFjcXVpcmUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUKKwkgKiBjb25zb2xlIHNlbWFwaG9yZS4gVGhlIHJlbGVhc2Ugd2lsbCBkbyBhbGwgdGhlCisJICogYWN0dWFsIG1hZ2ljIChwcmludCBvdXQgYnVmZmVycywgd2FrZSB1cCBrbG9nZCwKKwkgKiBldGMpLiAKKwkgKgorCSAqIFRoZSBjb25zb2xlX3RyeWxvY2tfZm9yX3ByaW50aygpIGZ1bmN0aW9uCisJICogd2lsbCByZWxlYXNlICdsb2didWZfbG9jaycgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0CisJICogYWN0dWFsbHkgZ2V0cyB0aGUgc2VtYXBob3JlIG9yIG5vdC4KKwkgKi8KKwlpZiAoY29uc29sZV90cnlsb2NrX2Zvcl9wcmludGsodGhpc19jcHUsIGZsYWdzKSkgeworI2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVF9GVUxMCisJCWNvbnNvbGVfdW5sb2NrKCk7CisjZWxzZQorCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQljb25zb2xlX3VubG9jaygpOworCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2VuZGlmCisJfQorCisJbG9ja2RlcF9vbigpOworb3V0X3Jlc3RvcmVfaXJxczoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcHJpbnRlZF9sZW47Cit9CitFWFBPUlRfU1lNQk9MKHByaW50ayk7CitFWFBPUlRfU1lNQk9MKHZwcmludGspOworCisjZWxzZQorCitzdGF0aWMgdm9pZCBjYWxsX2NvbnNvbGVfZHJpdmVycyh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworfQorCisjZW5kaWYKKworc3RhdGljIGludCBfX2FkZF9wcmVmZXJyZWRfY29uc29sZShjaGFyICpuYW1lLCBpbnQgaWR4LCBjaGFyICpvcHRpb25zLAorCQkJCSAgIGNoYXIgKmJybF9vcHRpb25zKQoreworCXN0cnVjdCBjb25zb2xlX2NtZGxpbmUgKmM7CisJaW50IGk7CisKKwkvKgorCSAqCVNlZSBpZiB0aGlzIHR0eSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGFuZAorCSAqCWlmIHdlIGhhdmUgYSBzbG90IGZyZWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwkJaWYgKHN0cmNtcChjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSwgbmFtZSkgPT0gMCAmJgorCQkJICBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXggPT0gaWR4KSB7CisJCQkJaWYgKCFicmxfb3B0aW9ucykKKwkJCQkJc2VsZWN0ZWRfY29uc29sZSA9IGk7CisJCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoaSA9PSBNQVhfQ01ETElORUNPTlNPTEVTKQorCQlyZXR1cm4gLUUyQklHOworCWlmICghYnJsX29wdGlvbnMpCisJCXNlbGVjdGVkX2NvbnNvbGUgPSBpOworCWMgPSAmY29uc29sZV9jbWRsaW5lW2ldOworCXN0cmxjcHkoYy0+bmFtZSwgbmFtZSwgc2l6ZW9mKGMtPm5hbWUpKTsKKwljLT5vcHRpb25zID0gb3B0aW9uczsKKyNpZmRlZiBDT05GSUdfQTExWV9CUkFJTExFX0NPTlNPTEUKKwljLT5icmxfb3B0aW9ucyA9IGJybF9vcHRpb25zOworI2VuZGlmCisJYy0+aW5kZXggPSBpZHg7CisJcmV0dXJuIDA7Cit9CisvKgorICogU2V0IHVwIGEgbGlzdCBvZiBjb25zb2xlcy4gIENhbGxlZCBmcm9tIGluaXQvbWFpbi5jCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvbnNvbGVfc2V0dXAoY2hhciAqc3RyKQoreworCWNoYXIgYnVmW3NpemVvZihjb25zb2xlX2NtZGxpbmVbMF0ubmFtZSkgKyA0XTsgLyogNCBmb3IgaW5kZXggKi8KKwljaGFyICpzLCAqb3B0aW9ucywgKmJybF9vcHRpb25zID0gTlVMTDsKKwlpbnQgaWR4OworCisjaWZkZWYgQ09ORklHX0ExMVlfQlJBSUxMRV9DT05TT0xFCisJaWYgKCFtZW1jbXAoc3RyLCAiYnJsLCIsIDQpKSB7CisJCWJybF9vcHRpb25zID0gIiI7CisJCXN0ciArPSA0OworCX0gZWxzZSBpZiAoIW1lbWNtcChzdHIsICJicmw9IiwgNCkpIHsKKwkJYnJsX29wdGlvbnMgPSBzdHIgKyA0OworCQlzdHIgPSBzdHJjaHIoYnJsX29wdGlvbnMsICcsJyk7CisJCWlmICghc3RyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm5lZWQgcG9ydCBuYW1lIGFmdGVyIGJybD1cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJKihzdHIrKykgPSAwOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBEZWNvZGUgc3RyIGludG8gbmFtZSwgaW5kZXgsIG9wdGlvbnMuCisJICovCisJaWYgKHN0clswXSA+PSAnMCcgJiYgc3RyWzBdIDw9ICc5JykgeworCQlzdHJjcHkoYnVmLCAidHR5UyIpOworCQlzdHJuY3B5KGJ1ZiArIDQsIHN0ciwgc2l6ZW9mKGJ1ZikgLSA1KTsKKwl9IGVsc2UgeworCQlzdHJuY3B5KGJ1Ziwgc3RyLCBzaXplb2YoYnVmKSAtIDEpOworCX0KKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CisJaWYgKChvcHRpb25zID0gc3RyY2hyKHN0ciwgJywnKSkgIT0gTlVMTCkKKwkJKihvcHRpb25zKyspID0gMDsKKyNpZmRlZiBfX3NwYXJjX18KKwlpZiAoIXN0cmNtcChzdHIsICJ0dHlhIikpCisJCXN0cmNweShidWYsICJ0dHlTMCIpOworCWlmICghc3RyY21wKHN0ciwgInR0eWIiKSkKKwkJc3RyY3B5KGJ1ZiwgInR0eVMxIik7CisjZW5kaWYKKwlmb3IgKHMgPSBidWY7ICpzOyBzKyspCisJCWlmICgoKnMgPj0gJzAnICYmICpzIDw9ICc5JykgfHwgKnMgPT0gJywnKQorCQkJYnJlYWs7CisJaWR4ID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTApOworCSpzID0gMDsKKworCV9fYWRkX3ByZWZlcnJlZF9jb25zb2xlKGJ1ZiwgaWR4LCBvcHRpb25zLCBicmxfb3B0aW9ucyk7CisJY29uc29sZV9zZXRfb25fY21kbGluZSA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJjb25zb2xlPSIsIGNvbnNvbGVfc2V0dXApOworCisvKioKKyAqIGFkZF9wcmVmZXJyZWRfY29uc29sZSAtIGFkZCBhIGRldmljZSB0byB0aGUgbGlzdCBvZiBwcmVmZXJyZWQgY29uc29sZXMuCisgKiBAbmFtZTogZGV2aWNlIG5hbWUKKyAqIEBpZHg6IGRldmljZSBpbmRleAorICogQG9wdGlvbnM6IG9wdGlvbnMgZm9yIHRoaXMgY29uc29sZQorICoKKyAqIFRoZSBsYXN0IHByZWZlcnJlZCBjb25zb2xlIGFkZGVkIHdpbGwgYmUgdXNlZCBmb3Iga2VybmVsIG1lc3NhZ2VzCisgKiBhbmQgc3RkaW4vb3V0L2VyciBmb3IgaW5pdC4gIE5vcm1hbGx5IHRoaXMgaXMgdXNlZCBieSBjb25zb2xlX3NldHVwCisgKiBhYm92ZSB0byBoYW5kbGUgdXNlci1zdXBwbGllZCBjb25zb2xlIGFyZ3VtZW50czsgaG93ZXZlciBpdCBjYW4gYWxzbworICogYmUgdXNlZCBieSBhcmNoLXNwZWNpZmljIGNvZGUgZWl0aGVyIHRvIG92ZXJyaWRlIHRoZSB1c2VyIG9yIG1vcmUKKyAqIGNvbW1vbmx5IHRvIHByb3ZpZGUgYSBkZWZhdWx0IGNvbnNvbGUgKGllIGZyb20gUFJPTSB2YXJpYWJsZXMpIHdoZW4KKyAqIHRoZSB1c2VyIGhhcyBub3Qgc3VwcGxpZWQgb25lLgorICovCitpbnQgYWRkX3ByZWZlcnJlZF9jb25zb2xlKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm9wdGlvbnMpCit7CisJcmV0dXJuIF9fYWRkX3ByZWZlcnJlZF9jb25zb2xlKG5hbWUsIGlkeCwgb3B0aW9ucywgTlVMTCk7Cit9CisKK2ludCB1cGRhdGVfY29uc29sZV9jbWRsaW5lKGNoYXIgKm5hbWUsIGludCBpZHgsIGNoYXIgKm5hbWVfbmV3LCBpbnQgaWR4X25ldywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgY29uc29sZV9jbWRsaW5lICpjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKKwkJaWYgKHN0cmNtcChjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSwgbmFtZSkgPT0gMCAmJgorCQkJICBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXggPT0gaWR4KSB7CisJCQkJYyA9ICZjb25zb2xlX2NtZGxpbmVbaV07CisJCQkJc3RybGNweShjLT5uYW1lLCBuYW1lX25ldywgc2l6ZW9mKGMtPm5hbWUpKTsKKwkJCQljLT5uYW1lW3NpemVvZihjLT5uYW1lKSAtIDFdID0gMDsKKwkJCQljLT5vcHRpb25zID0gb3B0aW9uczsKKwkJCQljLT5pbmRleCA9IGlkeF9uZXc7CisJCQkJcmV0dXJuIGk7CisJCX0KKwkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gLTE7Cit9CisKK2Jvb2wgY29uc29sZV9zdXNwZW5kX2VuYWJsZWQgPSAxOworRVhQT1JUX1NZTUJPTChjb25zb2xlX3N1c3BlbmRfZW5hYmxlZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbnNvbGVfc3VzcGVuZF9kaXNhYmxlKGNoYXIgKnN0cikKK3sKKwljb25zb2xlX3N1c3BlbmRfZW5hYmxlZCA9IDA7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub19jb25zb2xlX3N1c3BlbmQiLCBjb25zb2xlX3N1c3BlbmRfZGlzYWJsZSk7Cittb2R1bGVfcGFyYW1fbmFtZWQoY29uc29sZV9zdXNwZW5kLCBjb25zb2xlX3N1c3BlbmRfZW5hYmxlZCwKKwkJYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlX3N1c3BlbmQsICJzdXNwZW5kIGNvbnNvbGUgZHVyaW5nIHN1c3BlbmQiCisJIiBhbmQgaGliZXJuYXRlIG9wZXJhdGlvbnMiKTsKKworLyoqCisgKiBzdXNwZW5kX2NvbnNvbGUgLSBzdXNwZW5kIHRoZSBjb25zb2xlIHN1YnN5c3RlbQorICoKKyAqIFRoaXMgZGlzYWJsZXMgcHJpbnRrKCkgd2hpbGUgd2UgZ28gaW50byBzdXNwZW5kIHN0YXRlcworICovCit2b2lkIHN1c3BlbmRfY29uc29sZSh2b2lkKQoreworCWlmICghY29uc29sZV9zdXNwZW5kX2VuYWJsZWQpCisJCXJldHVybjsKKwlwcmludGsoIlN1c3BlbmRpbmcgY29uc29sZShzKSAodXNlIG5vX2NvbnNvbGVfc3VzcGVuZCB0byBkZWJ1ZylcbiIpOworCWNvbnNvbGVfbG9jaygpOworCWNvbnNvbGVfc3VzcGVuZGVkID0gMTsKKwl1cCgmY29uc29sZV9zZW0pOworfQorCit2b2lkIHJlc3VtZV9jb25zb2xlKHZvaWQpCit7CisJaWYgKCFjb25zb2xlX3N1c3BlbmRfZW5hYmxlZCkKKwkJcmV0dXJuOworCWRvd24oJmNvbnNvbGVfc2VtKTsKKwljb25zb2xlX3N1c3BlbmRlZCA9IDA7CisJY29uc29sZV91bmxvY2soKTsKK30KKworLyoqCisgKiBjb25zb2xlX2NwdV9ub3RpZnkgLSBwcmludCBkZWZlcnJlZCBjb25zb2xlIG1lc3NhZ2VzIGFmdGVyIENQVSBob3RwbHVnCisgKiBAc2VsZjogbm90aWZpZXIgc3RydWN0CisgKiBAYWN0aW9uOiBDUFUgaG90cGx1ZyBldmVudAorICogQGhjcHU6IHVudXNlZAorICoKKyAqIElmIHByaW50aygpIGlzIGNhbGxlZCBmcm9tIGEgQ1BVIHRoYXQgaXMgbm90IG9ubGluZSB5ZXQsIHRoZSBtZXNzYWdlcworICogd2lsbCBiZSBzcG9vbGVkIGJ1dCB3aWxsIG5vdCBzaG93IHVwIG9uIHRoZSBjb25zb2xlLiAgVGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIHdoZW4gYSBuZXcgQ1BVIGNvbWVzIG9ubGluZSAob3IgZmFpbHMgdG8gY29tZSB1cCksIGFuZCBlbnN1cmVzCisgKiB0aGF0IGFueSBzdWNoIG91dHB1dCBnZXRzIHByaW50ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IGNvbnNvbGVfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVfREVBRDoKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKKwkJY29uc29sZV9sb2NrKCk7CisJCWNvbnNvbGVfdW5sb2NrKCk7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKKy8qKgorICogY29uc29sZV9sb2NrIC0gbG9jayB0aGUgY29uc29sZSBzeXN0ZW0gZm9yIGV4Y2x1c2l2ZSB1c2UuCisgKgorICogQWNxdWlyZXMgYSBsb2NrIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2FsbGVyIGhhcworICogZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgY29uc29sZSBzeXN0ZW0gYW5kIHRoZSBjb25zb2xlX2RyaXZlcnMgbGlzdC4KKyAqCisgKiBDYW4gc2xlZXAsIHJldHVybnMgbm90aGluZy4KKyAqLwordm9pZCBjb25zb2xlX2xvY2sodm9pZCkKK3sKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOworCWRvd24oJmNvbnNvbGVfc2VtKTsKKwlpZiAoY29uc29sZV9zdXNwZW5kZWQpCisJCXJldHVybjsKKwljb25zb2xlX2xvY2tlZCA9IDE7CisJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAxOworfQorRVhQT1JUX1NZTUJPTChjb25zb2xlX2xvY2spOworCisvKioKKyAqIGNvbnNvbGVfdHJ5bG9jayAtIHRyeSB0byBsb2NrIHRoZSBjb25zb2xlIHN5c3RlbSBmb3IgZXhjbHVzaXZlIHVzZS4KKyAqCisgKiBUcmllZCB0byBhY3F1aXJlIGEgbG9jayB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlIGNhbGxlciBoYXMKKyAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGNvbnNvbGUgc3lzdGVtIGFuZCB0aGUgY29uc29sZV9kcml2ZXJzIGxpc3QuCisgKgorICogcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIGFuZCAwIG9uIGZhaWx1cmUgdG8gYWNxdWlyZSB0aGUgbG9jay4KKyAqLworaW50IGNvbnNvbGVfdHJ5bG9jayh2b2lkKQoreworCWlmIChkb3duX3RyeWxvY2soJmNvbnNvbGVfc2VtKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNvbnNvbGVfc3VzcGVuZGVkKSB7CisJCXVwKCZjb25zb2xlX3NlbSk7CisJCXJldHVybiAwOworCX0KKwljb25zb2xlX2xvY2tlZCA9IDE7CisJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAwOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChjb25zb2xlX3RyeWxvY2spOworCitpbnQgaXNfY29uc29sZV9sb2NrZWQodm9pZCkKK3sKKwlyZXR1cm4gY29uc29sZV9sb2NrZWQ7Cit9CisKKy8qCisgKiBEZWxheWVkIHByaW50ayBmYWNpbGl0eSwgZm9yIHNjaGVkdWxlci1pbnRlcm5hbCBtZXNzYWdlczoKKyAqLworI2RlZmluZSBQUklOVEtfQlVGX1NJWkUJCTUxMgorCisjZGVmaW5lIFBSSU5US19QRU5ESU5HX1dBS0VVUAkweDAxCisjZGVmaW5lIFBSSU5US19QRU5ESU5HX1NDSEVECTB4MDIKKworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJpbnRrX3BlbmRpbmcpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXIgW1BSSU5US19CVUZfU0laRV0sIHByaW50a19zY2hlZF9idWYpOworCit2b2lkIHByaW50a190aWNrKHZvaWQpCit7CisJaWYgKF9fdGhpc19jcHVfcmVhZChwcmludGtfcGVuZGluZykpIHsKKwkJaW50IHBlbmRpbmcgPSBfX3RoaXNfY3B1X3hjaGcocHJpbnRrX3BlbmRpbmcsIDApOworCQlpZiAocGVuZGluZyAmIFBSSU5US19QRU5ESU5HX1NDSEVEKSB7CisJCQljaGFyICpidWYgPSBfX2dldF9jcHVfdmFyKHByaW50a19zY2hlZF9idWYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiW3NjaGVkX2RlbGF5ZWRdICVzIiwgYnVmKTsKKwkJfQorCQlpZiAocGVuZGluZyAmIFBSSU5US19QRU5ESU5HX1dBS0VVUCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9nX3dhaXQpOworCX0KK30KKworaW50IHByaW50a19uZWVkc19jcHUoaW50IGNwdSkKK3sKKwlpZiAodW5saWtlbHkoY3B1X2lzX29mZmxpbmUoY3B1KSkpCisJCV9fdGhpc19jcHVfd3JpdGUocHJpbnRrX3BlbmRpbmcsIDApOworCXJldHVybiBfX3RoaXNfY3B1X3JlYWQocHJpbnRrX3BlbmRpbmcpOworfQorCit2b2lkIHdha2VfdXBfa2xvZ2Qodm9pZCkKK3sKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmbG9nX3dhaXQpKQorCQl0aGlzX2NwdV9vcihwcmludGtfcGVuZGluZywgUFJJTlRLX1BFTkRJTkdfV0FLRVVQKTsKK30KKworLyoqCisgKiBjb25zb2xlX3VubG9jayAtIHVubG9jayB0aGUgY29uc29sZSBzeXN0ZW0KKyAqCisgKiBSZWxlYXNlcyB0aGUgY29uc29sZV9sb2NrIHdoaWNoIHRoZSBjYWxsZXIgaG9sZHMgb24gdGhlIGNvbnNvbGUgc3lzdGVtCisgKiBhbmQgdGhlIGNvbnNvbGUgZHJpdmVyIGxpc3QuCisgKgorICogV2hpbGUgdGhlIGNvbnNvbGVfbG9jayB3YXMgaGVsZCwgY29uc29sZSBvdXRwdXQgbWF5IGhhdmUgYmVlbiBidWZmZXJlZAorICogYnkgcHJpbnRrKCkuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBjb25zb2xlX3VubG9jaygpOyBlbWl0cworICogdGhlIG91dHB1dCBwcmlvciB0byByZWxlYXNpbmcgdGhlIGxvY2suCisgKgorICogSWYgdGhlcmUgaXMgb3V0cHV0IHdhaXRpbmcgZm9yIGtsb2dkLCB3ZSB3YWtlIGl0IHVwLgorICoKKyAqIGNvbnNvbGVfdW5sb2NrKCk7IG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLwordm9pZCBjb25zb2xlX3VubG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgX2Nvbl9zdGFydCwgX2xvZ19lbmQ7CisJdW5zaWduZWQgd2FrZV9rbG9nZCA9IDAsIHJldHJ5ID0gMDsKKworCWlmIChjb25zb2xlX3N1c3BlbmRlZCkgeworCQl1cCgmY29uc29sZV9zZW0pOworCQlyZXR1cm47CisJfQorCisJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAwOworCithZ2FpbjoKKwlmb3IgKCA7IDsgKSB7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKwkJd2FrZV9rbG9nZCB8PSBsb2dfc3RhcnQgLSBsb2dfZW5kOworCQlpZiAoY29uX3N0YXJ0ID09IGxvZ19lbmQpCisJCQlicmVhazsJCQkvKiBOb3RoaW5nIHRvIHByaW50ICovCisJCV9jb25fc3RhcnQgPSBjb25fc3RhcnQ7CisJCV9sb2dfZW5kID0gbG9nX2VuZDsKKwkJY29uX3N0YXJ0ID0gbG9nX2VuZDsJCS8qIEZsdXNoICovCisjaWZuZGVmIENPTkZJR19QUkVFTVBUX1JUX0ZVTEwKKwkJcmF3X3NwaW5fdW5sb2NrKCZsb2didWZfbG9jayk7CisJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwkvKiBkb24ndCB0cmFjZSBwcmludCBsYXRlbmN5ICovCisJCWNhbGxfY29uc29sZV9kcml2ZXJzKF9jb25fc3RhcnQsIF9sb2dfZW5kKTsKKwkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZWxzZQorCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKwkJY2FsbF9jb25zb2xlX2RyaXZlcnMoX2Nvbl9zdGFydCwgX2xvZ19lbmQpOworI2VuZGlmCisJfQorCWNvbnNvbGVfbG9ja2VkID0gMDsKKworCS8qIFJlbGVhc2UgdGhlIGV4Y2x1c2l2ZV9jb25zb2xlIG9uY2UgaXQgaXMgdXNlZCAqLworCWlmICh1bmxpa2VseShleGNsdXNpdmVfY29uc29sZSkpCisJCWV4Y2x1c2l2ZV9jb25zb2xlID0gTlVMTDsKKworCXJhd19zcGluX3VubG9jaygmbG9nYnVmX2xvY2spOworCisJdXAoJmNvbnNvbGVfc2VtKTsKKworCS8qCisJICogU29tZW9uZSBjb3VsZCBoYXZlIGZpbGxlZCB1cCB0aGUgYnVmZmVyIGFnYWluLCBzbyByZS1jaGVjayBpZiB0aGVyZSdzCisJICogc29tZXRoaW5nIHRvIGZsdXNoLiBJbiBjYXNlIHdlIGNhbm5vdCB0cnlsb2NrIHRoZSBjb25zb2xlX3NlbSBhZ2FpbiwKKwkgKiB0aGVyZSdzIGEgbmV3IG93bmVyIGFuZCB0aGUgY29uc29sZV91bmxvY2soKSBmcm9tIHRoZW0gd2lsbCBkbyB0aGUKKwkgKiBmbHVzaCwgbm8gd29ycmllcy4KKwkgKi8KKwlyYXdfc3Bpbl9sb2NrKCZsb2didWZfbG9jayk7CisJaWYgKGNvbl9zdGFydCAhPSBsb2dfZW5kKQorCQlyZXRyeSA9IDE7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0cnkgJiYgY29uc29sZV90cnlsb2NrKCkpCisJCWdvdG8gYWdhaW47CisKKwlpZiAod2FrZV9rbG9nZCkKKwkJd2FrZV91cF9rbG9nZCgpOworfQorRVhQT1JUX1NZTUJPTChjb25zb2xlX3VubG9jayk7CisKKy8qKgorICogY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSAtIHlpZWxkIHRoZSBDUFUgaWYgcmVxdWlyZWQKKyAqCisgKiBJZiB0aGUgY29uc29sZSBjb2RlIGlzIGN1cnJlbnRseSBhbGxvd2VkIHRvIHNsZWVwLCBhbmQKKyAqIGlmIHRoaXMgQ1BVIHNob3VsZCB5aWVsZCB0aGUgQ1BVIHRvIGFub3RoZXIgdGFzaywgZG8KKyAqIHNvIGhlcmUuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aGluIGNvbnNvbGVfbG9jaygpOy4KKyAqLwordm9pZCBfX3NjaGVkIGNvbnNvbGVfY29uZGl0aW9uYWxfc2NoZWR1bGUodm9pZCkKK3sKKwlpZiAoY29uc29sZV9tYXlfc2NoZWR1bGUpCisJCWNvbmRfcmVzY2hlZCgpOworfQorRVhQT1JUX1NZTUJPTChjb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKTsKKwordm9pZCBjb25zb2xlX3VuYmxhbmsodm9pZCkKK3sKKwlzdHJ1Y3QgY29uc29sZSAqYzsKKworCS8qCisJICogY29uc29sZV91bmJsYW5rIGNhbiBubyBsb25nZXIgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0IHVubGVzcworCSAqIG9vcHNfaW5fcHJvZ3Jlc3MgaXMgc2V0IHRvIDEuLgorCSAqLworCWlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWlmIChkb3duX3RyeWxvY2soJmNvbnNvbGVfc2VtKSAhPSAwKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQljb25zb2xlX2xvY2soKTsKKworCWNvbnNvbGVfbG9ja2VkID0gMTsKKwljb25zb2xlX21heV9zY2hlZHVsZSA9IDA7CisJZm9yX2VhY2hfY29uc29sZShjKQorCQlpZiAoKGMtPmZsYWdzICYgQ09OX0VOQUJMRUQpICYmIGMtPnVuYmxhbmspCisJCQljLT51bmJsYW5rKCk7CisJY29uc29sZV91bmxvY2soKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY29uc29sZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgaXRzIGFzc29jaWF0ZWQgaW5kZXgKKyAqLworc3RydWN0IHR0eV9kcml2ZXIgKmNvbnNvbGVfZGV2aWNlKGludCAqaW5kZXgpCit7CisJc3RydWN0IGNvbnNvbGUgKmM7CisJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciA9IE5VTEw7CisKKwljb25zb2xlX2xvY2soKTsKKwlmb3JfZWFjaF9jb25zb2xlKGMpIHsKKwkJaWYgKCFjLT5kZXZpY2UpCisJCQljb250aW51ZTsKKwkJZHJpdmVyID0gYy0+ZGV2aWNlKGMsIGluZGV4KTsKKwkJaWYgKGRyaXZlcikKKwkJCWJyZWFrOworCX0KKwljb25zb2xlX3VubG9jaygpOworCXJldHVybiBkcml2ZXI7Cit9CisKKy8qCisgKiBQcmV2ZW50IGZ1cnRoZXIgb3V0cHV0IG9uIHRoZSBwYXNzZWQgY29uc29sZSBkZXZpY2Ugc28gdGhhdCAoZm9yIGV4YW1wbGUpCisgKiBzZXJpYWwgZHJpdmVycyBjYW4gZGlzYWJsZSBjb25zb2xlIG91dHB1dCBiZWZvcmUgc3VzcGVuZGluZyBhIHBvcnQsIGFuZCBjYW4KKyAqIHJlLWVuYWJsZSBvdXRwdXQgYWZ0ZXJ3YXJkcy4KKyAqLwordm9pZCBjb25zb2xlX3N0b3Aoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUpCit7CisJY29uc29sZV9sb2NrKCk7CisJY29uc29sZS0+ZmxhZ3MgJj0gfkNPTl9FTkFCTEVEOworCWNvbnNvbGVfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbnNvbGVfc3RvcCk7CisKK3ZvaWQgY29uc29sZV9zdGFydChzdHJ1Y3QgY29uc29sZSAqY29uc29sZSkKK3sKKwljb25zb2xlX2xvY2soKTsKKwljb25zb2xlLT5mbGFncyB8PSBDT05fRU5BQkxFRDsKKwljb25zb2xlX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTChjb25zb2xlX3N0YXJ0KTsKKworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGtlZXBfYm9vdGNvbjsKKworc3RhdGljIGludCBfX2luaXQga2VlcF9ib290Y29uX3NldHVwKGNoYXIgKnN0cikKK3sKKwlrZWVwX2Jvb3Rjb24gPSAxOworCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBza2lwIGJvb3QgY29uc29sZSBkZS1yZWdpc3RyYXRpb24uXG4iKTsKKworCXJldHVybiAwOworfQorCitlYXJseV9wYXJhbSgia2VlcF9ib290Y29uIiwga2VlcF9ib290Y29uX3NldHVwKTsKKworLyoKKyAqIFRoZSBjb25zb2xlIGRyaXZlciBjYWxscyB0aGlzIHJvdXRpbmUgZHVyaW5nIGtlcm5lbCBpbml0aWFsaXphdGlvbgorICogdG8gcmVnaXN0ZXIgdGhlIGNvbnNvbGUgcHJpbnRpbmcgcHJvY2VkdXJlIHdpdGggcHJpbnRrKCkgYW5kIHRvCisgKiBwcmludCBhbnkgbWVzc2FnZXMgdGhhdCB3ZXJlIHByaW50ZWQgYnkgdGhlIGtlcm5lbCBiZWZvcmUgdGhlCisgKiBjb25zb2xlIGRyaXZlciB3YXMgaW5pdGlhbGl6ZWQuCisgKgorICogVGhpcyBjYW4gaGFwcGVuIHByZXR0eSBlYXJseSBkdXJpbmcgdGhlIGJvb3QgcHJvY2VzcyAoYmVjYXVzZSBvZgorICogZWFybHlfcHJpbnRrKSAtIHNvbWV0aW1lcyBiZWZvcmUgc2V0dXBfYXJjaCgpIGNvbXBsZXRlcyAtIGJlIGNhcmVmdWwKKyAqIG9mIHdoYXQga2VybmVsIGZlYXR1cmVzIGFyZSB1c2VkIC0gdGhleSBtYXkgbm90IGJlIGluaXRpYWxpc2VkIHlldC4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbnNvbGVzIC0gYm9vdGNvbnNvbGVzIChlYXJseV9wcmludGspIGFuZAorICogInJlYWwiIGNvbnNvbGVzIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdCBhIGJvb3Rjb25zb2xlKSB3aGljaCBhcmUKKyAqIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgKiAgLSBBbnkgbnVtYmVyIG9mIGJvb3Rjb25zb2xlcyBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBhbnkgdGltZS4KKyAqICAtIEFzIHNvb24gYXMgYSAicmVhbCIgY29uc29sZSBpcyByZWdpc3RlcmVkLCBhbGwgYm9vdGNvbnNvbGVzCisgKiAgICB3aWxsIGJlIHVucmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LgorICogIC0gT25jZSBhICJyZWFsIiBjb25zb2xlIGlzIHJlZ2lzdGVyZWQsIGFueSBhdHRlbXB0IHRvIHJlZ2lzdGVyIGEKKyAqICAgIGJvb3Rjb25zb2xlcyB3aWxsIGJlIHJlamVjdGVkCisgKi8KK3ZvaWQgcmVnaXN0ZXJfY29uc29sZShzdHJ1Y3QgY29uc29sZSAqbmV3Y29uKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbnNvbGUgKmJjb24gPSBOVUxMOworCisJLyoKKwkgKiBiZWZvcmUgd2UgcmVnaXN0ZXIgYSBuZXcgQ09OX0JPT1QgY29uc29sZSwgbWFrZSBzdXJlIHdlIGRvbid0CisJICogYWxyZWFkeSBoYXZlIGEgdmFsaWQgY29uc29sZQorCSAqLworCWlmIChjb25zb2xlX2RyaXZlcnMgJiYgbmV3Y29uLT5mbGFncyAmIENPTl9CT09UKSB7CisJCS8qIGZpbmQgdGhlIGxhc3Qgb3IgcmVhbCBjb25zb2xlICovCisJCWZvcl9lYWNoX2NvbnNvbGUoYmNvbikgeworCQkJaWYgKCEoYmNvbi0+ZmxhZ3MgJiBDT05fQk9PVCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJUb28gbGF0ZSB0byByZWdpc3RlciBib290Y29uc29sZSAlcyVkXG4iLAorCQkJCQluZXdjb24tPm5hbWUsIG5ld2Nvbi0+aW5kZXgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChjb25zb2xlX2RyaXZlcnMgJiYgY29uc29sZV9kcml2ZXJzLT5mbGFncyAmIENPTl9CT09UKQorCQliY29uID0gY29uc29sZV9kcml2ZXJzOworCisJaWYgKHByZWZlcnJlZF9jb25zb2xlIDwgMCB8fCBiY29uIHx8ICFjb25zb2xlX2RyaXZlcnMpCisJCXByZWZlcnJlZF9jb25zb2xlID0gc2VsZWN0ZWRfY29uc29sZTsKKworCWlmIChuZXdjb24tPmVhcmx5X3NldHVwKQorCQluZXdjb24tPmVhcmx5X3NldHVwKCk7CisKKwkvKgorCSAqCVNlZSBpZiB3ZSB3YW50IHRvIHVzZSB0aGlzIGNvbnNvbGUgZHJpdmVyLiBJZiB3ZQorCSAqCWRpZG4ndCBzZWxlY3QgYSBjb25zb2xlIHdlIHRha2UgdGhlIGZpcnN0IG9uZQorCSAqCXRoYXQgcmVnaXN0ZXJzIGhlcmUuCisJICovCisJaWYgKHByZWZlcnJlZF9jb25zb2xlIDwgMCkgeworCQlpZiAobmV3Y29uLT5pbmRleCA8IDApCisJCQluZXdjb24tPmluZGV4ID0gMDsKKwkJaWYgKG5ld2Nvbi0+c2V0dXAgPT0gTlVMTCB8fAorCQkgICAgbmV3Y29uLT5zZXR1cChuZXdjb24sIE5VTEwpID09IDApIHsKKwkJCW5ld2Nvbi0+ZmxhZ3MgfD0gQ09OX0VOQUJMRUQ7CisJCQlpZiAobmV3Y29uLT5kZXZpY2UpIHsKKwkJCQluZXdjb24tPmZsYWdzIHw9IENPTl9DT05TREVWOworCQkJCXByZWZlcnJlZF9jb25zb2xlID0gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICoJU2VlIGlmIHRoaXMgY29uc29sZSBtYXRjaGVzIG9uZSB3ZSBzZWxlY3RlZCBvbgorCSAqCXRoZSBjb21tYW5kIGxpbmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07CisJCQlpKyspIHsKKwkJQlVJTERfQlVHX09OKHNpemVvZihjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSkgIT0gc2l6ZW9mKG5ld2Nvbi0+bmFtZSkpOworCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuZXdjb24tPm5hbWUpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKG5ld2Nvbi0+aW5kZXggPj0gMCAmJgorCQkgICAgbmV3Y29uLT5pbmRleCAhPSBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXgpCisJCQljb250aW51ZTsKKwkJaWYgKG5ld2Nvbi0+aW5kZXggPCAwKQorCQkJbmV3Y29uLT5pbmRleCA9IGNvbnNvbGVfY21kbGluZVtpXS5pbmRleDsKKyNpZmRlZiBDT05GSUdfQTExWV9CUkFJTExFX0NPTlNPTEUKKwkJaWYgKGNvbnNvbGVfY21kbGluZVtpXS5icmxfb3B0aW9ucykgeworCQkJbmV3Y29uLT5mbGFncyB8PSBDT05fQlJMOworCQkJYnJhaWxsZV9yZWdpc3Rlcl9jb25zb2xlKG5ld2NvbiwKKwkJCQkJY29uc29sZV9jbWRsaW5lW2ldLmluZGV4LAorCQkJCQljb25zb2xlX2NtZGxpbmVbaV0ub3B0aW9ucywKKwkJCQkJY29uc29sZV9jbWRsaW5lW2ldLmJybF9vcHRpb25zKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCWlmIChuZXdjb24tPnNldHVwICYmCisJCSAgICBuZXdjb24tPnNldHVwKG5ld2NvbiwgY29uc29sZV9jbWRsaW5lW2ldLm9wdGlvbnMpICE9IDApCisJCQlicmVhazsKKwkJbmV3Y29uLT5mbGFncyB8PSBDT05fRU5BQkxFRDsKKwkJbmV3Y29uLT5pbmRleCA9IGNvbnNvbGVfY21kbGluZVtpXS5pbmRleDsKKwkJaWYgKGkgPT0gc2VsZWN0ZWRfY29uc29sZSkgeworCQkJbmV3Y29uLT5mbGFncyB8PSBDT05fQ09OU0RFVjsKKwkJCXByZWZlcnJlZF9jb25zb2xlID0gc2VsZWN0ZWRfY29uc29sZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoIShuZXdjb24tPmZsYWdzICYgQ09OX0VOQUJMRUQpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBib290Y29uc29sZSwgYW5kIGFyZSBzd2l0Y2hpbmcgdG8gYSByZWFsIGNvbnNvbGUsCisJICogZG9uJ3QgcHJpbnQgZXZlcnl0aGluZyBvdXQgYWdhaW4sIHNpbmNlIHdoZW4gdGhlIGJvb3QgY29uc29sZSwgYW5kCisJICogdGhlIHJlYWwgY29uc29sZSBhcmUgdGhlIHNhbWUgcGh5c2ljYWwgZGV2aWNlLCBpdCdzIGFubm95aW5nIHRvCisJICogc2VlIHRoZSBiZWdpbm5pbmcgYm9vdCBtZXNzYWdlcyB0d2ljZQorCSAqLworCWlmIChiY29uICYmICgobmV3Y29uLT5mbGFncyAmIChDT05fQ09OU0RFViB8IENPTl9CT09UKSkgPT0gQ09OX0NPTlNERVYpKQorCQluZXdjb24tPmZsYWdzICY9IH5DT05fUFJJTlRCVUZGRVI7CisKKwkvKgorCSAqCVB1dCB0aGlzIGNvbnNvbGUgaW4gdGhlIGxpc3QgLSBrZWVwIHRoZQorCSAqCXByZWZlcnJlZCBkcml2ZXIgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJICovCisJY29uc29sZV9sb2NrKCk7CisJaWYgKChuZXdjb24tPmZsYWdzICYgQ09OX0NPTlNERVYpIHx8IGNvbnNvbGVfZHJpdmVycyA9PSBOVUxMKSB7CisJCW5ld2Nvbi0+bmV4dCA9IGNvbnNvbGVfZHJpdmVyczsKKwkJY29uc29sZV9kcml2ZXJzID0gbmV3Y29uOworCQlpZiAobmV3Y29uLT5uZXh0KQorCQkJbmV3Y29uLT5uZXh0LT5mbGFncyAmPSB+Q09OX0NPTlNERVY7CisJfSBlbHNlIHsKKwkJbmV3Y29uLT5uZXh0ID0gY29uc29sZV9kcml2ZXJzLT5uZXh0OworCQljb25zb2xlX2RyaXZlcnMtPm5leHQgPSBuZXdjb247CisJfQorCWlmIChuZXdjb24tPmZsYWdzICYgQ09OX1BSSU5UQlVGRkVSKSB7CisJCS8qCisJCSAqIGNvbnNvbGVfdW5sb2NrKCk7IHdpbGwgcHJpbnQgb3V0IHRoZSBidWZmZXJlZCBtZXNzYWdlcworCQkgKiBmb3IgdXMuCisJCSAqLworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisJCWNvbl9zdGFydCA9IGxvZ19zdGFydDsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisJCS8qCisJCSAqIFdlJ3JlIGFib3V0IHRvIHJlcGxheSB0aGUgbG9nIGJ1ZmZlci4gIE9ubHkgZG8gdGhpcyB0byB0aGUKKwkJICoganVzdC1yZWdpc3RlcmVkIGNvbnNvbGUgdG8gYXZvaWQgZXhjZXNzaXZlIG1lc3NhZ2Ugc3BhbSB0bworCQkgKiB0aGUgYWxyZWFkeS1yZWdpc3RlcmVkIGNvbnNvbGVzLgorCQkgKi8KKwkJZXhjbHVzaXZlX2NvbnNvbGUgPSBuZXdjb247CisJfQorCWNvbnNvbGVfdW5sb2NrKCk7CisJY29uc29sZV9zeXNmc19ub3RpZnkoKTsKKworCS8qCisJICogQnkgdW5yZWdpc3RlcmluZyB0aGUgYm9vdGNvbnNvbGVzIGFmdGVyIHdlIGVuYWJsZSB0aGUgcmVhbCBjb25zb2xlCisJICogd2UgZ2V0IHRoZSAiY29uc29sZSB4eHggZW5hYmxlZCIgbWVzc2FnZSBvbiBhbGwgdGhlIGNvbnNvbGVzIC0KKwkgKiBib290IGNvbnNvbGVzLCByZWFsIGNvbnNvbGVzLCBldGMgLSB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IGVuZAorCSAqIHVzZXJzIGtub3cgdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIGluIHRoZSBrZXJuZWwncyBsb2cgYnVmZmVyIHRoYXQKKwkgKiB3ZW50IHRvIHRoZSBib290Y29uc29sZSAodGhhdCB0aGV5IGRvIG5vdCBzZWUgb24gdGhlIHJlYWwgY29uc29sZSkKKwkgKi8KKwlpZiAoYmNvbiAmJgorCSAgICAoKG5ld2Nvbi0+ZmxhZ3MgJiAoQ09OX0NPTlNERVYgfCBDT05fQk9PVCkpID09IENPTl9DT05TREVWKSAmJgorCSAgICAha2VlcF9ib290Y29uKSB7CisJCS8qIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHR3aWNlLCB0byBtYWtlIHN1cmUgd2UgcHJpbnQKKwkJICogZXZlcnl0aGluZyBvdXQsIGJlZm9yZSB3ZSB1bnJlZ2lzdGVyIHRoZSBjb25zb2xlKHMpCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICJjb25zb2xlIFslcyVkXSBlbmFibGVkLCBib290Y29uc29sZSBkaXNhYmxlZFxuIiwKKwkJCW5ld2Nvbi0+bmFtZSwgbmV3Y29uLT5pbmRleCk7CisJCWZvcl9lYWNoX2NvbnNvbGUoYmNvbikKKwkJCWlmIChiY29uLT5mbGFncyAmIENPTl9CT09UKQorCQkJCXVucmVnaXN0ZXJfY29uc29sZShiY29uKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlc2NvbnNvbGUgWyVzJWRdIGVuYWJsZWRcbiIsCisJCQkobmV3Y29uLT5mbGFncyAmIENPTl9CT09UKSA/ICJib290IiA6ICIiICwKKwkJCW5ld2Nvbi0+bmFtZSwgbmV3Y29uLT5pbmRleCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9jb25zb2xlKTsKKworaW50IHVucmVnaXN0ZXJfY29uc29sZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSkKK3sKKyAgICAgICAgc3RydWN0IGNvbnNvbGUgKmEsICpiOworCWludCByZXMgPSAxOworCisjaWZkZWYgQ09ORklHX0ExMVlfQlJBSUxMRV9DT05TT0xFCisJaWYgKGNvbnNvbGUtPmZsYWdzICYgQ09OX0JSTCkKKwkJcmV0dXJuIGJyYWlsbGVfdW5yZWdpc3Rlcl9jb25zb2xlKGNvbnNvbGUpOworI2VuZGlmCisKKwljb25zb2xlX2xvY2soKTsKKwlpZiAoY29uc29sZV9kcml2ZXJzID09IGNvbnNvbGUpIHsKKwkJY29uc29sZV9kcml2ZXJzPWNvbnNvbGUtPm5leHQ7CisJCXJlcyA9IDA7CisJfSBlbHNlIGlmIChjb25zb2xlX2RyaXZlcnMpIHsKKwkJZm9yIChhPWNvbnNvbGVfZHJpdmVycy0+bmV4dCwgYj1jb25zb2xlX2RyaXZlcnMgOworCQkgICAgIGE7IGI9YSwgYT1iLT5uZXh0KSB7CisJCQlpZiAoYSA9PSBjb25zb2xlKSB7CisJCQkJYi0+bmV4dCA9IGEtPm5leHQ7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBjb25zb2xlIGFuZCBpdCBoYXMgQ09OX0NPTlNERVYgc2V0LCB3ZQorCSAqIG5lZWQgdG8gc2V0IGl0IG9uIHRoZSBuZXh0IHByZWZlcnJlZCBjb25zb2xlLgorCSAqLworCWlmIChjb25zb2xlX2RyaXZlcnMgIT0gTlVMTCAmJiBjb25zb2xlLT5mbGFncyAmIENPTl9DT05TREVWKQorCQljb25zb2xlX2RyaXZlcnMtPmZsYWdzIHw9IENPTl9DT05TREVWOworCisJY29uc29sZV91bmxvY2soKTsKKwljb25zb2xlX3N5c2ZzX25vdGlmeSgpOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfY29uc29sZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHByaW50a19sYXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY29uc29sZSAqY29uOworCisJZm9yX2VhY2hfY29uc29sZShjb24pIHsKKwkJaWYgKCFrZWVwX2Jvb3Rjb24gJiYgY29uLT5mbGFncyAmIENPTl9CT09UKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJ0dXJuIG9mZiBib290IGNvbnNvbGUgJXMlZFxuIiwKKwkJCQljb24tPm5hbWUsIGNvbi0+aW5kZXgpOworCQkJdW5yZWdpc3Rlcl9jb25zb2xlKGNvbik7CisJCX0KKwl9CisJaG90Y3B1X25vdGlmaWVyKGNvbnNvbGVfY3B1X25vdGlmeSwgMCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHByaW50a19sYXRlX2luaXQpOworCisjaWYgZGVmaW5lZCBDT05GSUdfUFJJTlRLCisKK2ludCBwcmludGtfZGVmZXJyZWQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqYnVmOworCWludCByOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJ1ZiA9IF9fZ2V0X2NwdV92YXIocHJpbnRrX3NjaGVkX2J1Zik7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSB2c25wcmludGYoYnVmLCBQUklOVEtfQlVGX1NJWkUsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJX190aGlzX2NwdV9vcihwcmludGtfcGVuZGluZywgUFJJTlRLX1BFTkRJTkdfU0NIRUQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByOworfQorCisvKgorICogcHJpbnRrIHJhdGUgbGltaXRpbmcsIGxpZnRlZCBmcm9tIHRoZSBuZXR3b3JraW5nIHN1YnN5c3RlbS4KKyAqCisgKiBUaGlzIGVuZm9yY2VzIGEgcmF0ZSBsaW1pdDogbm90IG1vcmUgdGhhbiAxMCBrZXJuZWwgbWVzc2FnZXMKKyAqIGV2ZXJ5IDVzIHRvIG1ha2UgYSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2sgaW1wb3NzaWJsZS4KKyAqLworREVGSU5FX1JBVEVMSU1JVF9TVEFURShwcmludGtfcmF0ZWxpbWl0X3N0YXRlLCA1ICogSFosIDEwKTsKKworaW50IF9fcHJpbnRrX3JhdGVsaW1pdChjb25zdCBjaGFyICpmdW5jKQoreworCXJldHVybiBfX19yYXRlbGltaXQoJnByaW50a19yYXRlbGltaXRfc3RhdGUsIGZ1bmMpOworfQorRVhQT1JUX1NZTUJPTChfX3ByaW50a19yYXRlbGltaXQpOworCisvKioKKyAqIHByaW50a190aW1lZF9yYXRlbGltaXQgLSBjYWxsZXItY29udHJvbGxlZCBwcmludGsgcmF0ZWxpbWl0aW5nCisgKiBAY2FsbGVyX2ppZmZpZXM6IHBvaW50ZXIgdG8gY2FsbGVyJ3Mgc3RhdGUKKyAqIEBpbnRlcnZhbF9tc2VjczogbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHByaW50cworICoKKyAqIHByaW50a190aW1lZF9yYXRlbGltaXQoKSByZXR1cm5zIHRydWUgaWYgbW9yZSB0aGFuIEBpbnRlcnZhbF9tc2VjcworICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHByaW50a190aW1lZF9yYXRlbGltaXQoKQorICogcmV0dXJuZWQgdHJ1ZS4KKyAqLworYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLAorCQkJdW5zaWduZWQgaW50IGludGVydmFsX21zZWNzKQoreworCWlmICgqY2FsbGVyX2ppZmZpZXMgPT0gMAorCQkJfHwgIXRpbWVfaW5fcmFuZ2UoamlmZmllcywgKmNhbGxlcl9qaWZmaWVzLAorCQkJCQkqY2FsbGVyX2ppZmZpZXMKKwkJCQkJKyBtc2Vjc190b19qaWZmaWVzKGludGVydmFsX21zZWNzKSkpIHsKKwkJKmNhbGxlcl9qaWZmaWVzID0gamlmZmllczsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0wocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHVtcF9saXN0X2xvY2spOworc3RhdGljIExJU1RfSEVBRChkdW1wX2xpc3QpOworCisvKioKKyAqIGttc2dfZHVtcF9yZWdpc3RlciAtIHJlZ2lzdGVyIGEga2VybmVsIGxvZyBkdW1wZXIuCisgKiBAZHVtcGVyOiBwb2ludGVyIHRvIHRoZSBrbXNnX2R1bXBlciBzdHJ1Y3R1cmUKKyAqCisgKiBBZGRzIGEga2VybmVsIGxvZyBkdW1wZXIgdG8gdGhlIHN5c3RlbS4gVGhlIGR1bXAgY2FsbGJhY2sgaW4gdGhlCisgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUga2VybmVsIG9vcHNlcyBvciBwYW5pY3MgYW5kIG11c3QgYmUKKyAqIHNldC4gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kICUtRUlOVkFMIG9yICUtRUJVU1kgb3RoZXJ3aXNlLgorICovCitpbnQga21zZ19kdW1wX3JlZ2lzdGVyKHN0cnVjdCBrbXNnX2R1bXBlciAqZHVtcGVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IC1FQlVTWTsKKworCS8qIFRoZSBkdW1wIGNhbGxiYWNrIG5lZWRzIHRvIGJlIHNldCAqLworCWlmICghZHVtcGVyLT5kdW1wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1wX2xpc3RfbG9jaywgZmxhZ3MpOworCS8qIERvbid0IGFsbG93IHJlZ2lzdGVyaW5nIG11bHRpcGxlIHRpbWVzICovCisJaWYgKCFkdW1wZXItPnJlZ2lzdGVyZWQpIHsKKwkJZHVtcGVyLT5yZWdpc3RlcmVkID0gMTsKKwkJbGlzdF9hZGRfdGFpbF9yY3UoJmR1bXBlci0+bGlzdCwgJmR1bXBfbGlzdCk7CisJCWVyciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR1bXBfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa21zZ19kdW1wX3JlZ2lzdGVyKTsKKworLyoqCisgKiBrbXNnX2R1bXBfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYSBrbXNnIGR1bXBlci4KKyAqIEBkdW1wZXI6IHBvaW50ZXIgdG8gdGhlIGttc2dfZHVtcGVyIHN0cnVjdHVyZQorICoKKyAqIFJlbW92ZXMgYSBkdW1wIGRldmljZSBmcm9tIHRoZSBzeXN0ZW0uIFJldHVybnMgemVybyBvbiBzdWNjZXNzIGFuZAorICogJS1FSU5WQUwgb3RoZXJ3aXNlLgorICovCitpbnQga21zZ19kdW1wX3VucmVnaXN0ZXIoc3RydWN0IGttc2dfZHVtcGVyICpkdW1wZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1wX2xpc3RfbG9jaywgZmxhZ3MpOworCWlmIChkdW1wZXItPnJlZ2lzdGVyZWQpIHsKKwkJZHVtcGVyLT5yZWdpc3RlcmVkID0gMDsKKwkJbGlzdF9kZWxfcmN1KCZkdW1wZXItPmxpc3QpOworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdW1wX2xpc3RfbG9jaywgZmxhZ3MpOworCXN5bmNocm9uaXplX3JjdSgpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGttc2dfZHVtcF91bnJlZ2lzdGVyKTsKKworLyoqCisgKiBrbXNnX2R1bXAgLSBkdW1wIGtlcm5lbCBsb2cgdG8ga2VybmVsIG1lc3NhZ2UgZHVtcGVycy4KKyAqIEByZWFzb246IHRoZSByZWFzb24gKG9vcHMsIHBhbmljIGV0YykgZm9yIGR1bXBpbmcKKyAqCisgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgZHVtcCBkZXZpY2VzIGFuZCBjYWxsIHRoZSBvb3BzL3BhbmljCisgKiBjYWxsYmFja3Mgd2l0aCB0aGUgbG9nIGJ1ZmZlci4KKyAqLwordm9pZCBrbXNnX2R1bXAoZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbikKK3sKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBjaGFyczsKKwlzdHJ1Y3Qga21zZ19kdW1wZXIgKmR1bXBlcjsKKwljb25zdCBjaGFyICpzMSwgKnMyOworCXVuc2lnbmVkIGxvbmcgbDEsIGwyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKHJlYXNvbiA+IEtNU0dfRFVNUF9PT1BTKSAmJiAhYWx3YXlzX2ttc2dfZHVtcCkKKwkJcmV0dXJuOworCisJLyogVGhlb3JldGljYWxseSwgdGhlIGxvZyBjb3VsZCBtb3ZlIG9uIGFmdGVyIHdlIGRvIHRoaXMsIGJ1dAorCSAgIHRoZXJlJ3Mgbm90IGEgbG90IHdlIGNhbiBkbyBhYm91dCB0aGF0LiBUaGUgbmV3IG1lc3NhZ2VzCisJICAgd2lsbCBvdmVyd3JpdGUgdGhlIHN0YXJ0IG9mIHdoYXQgd2UgZHVtcC4gKi8KKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisJZW5kID0gbG9nX2VuZCAmIExPR19CVUZfTUFTSzsKKwljaGFycyA9IGxvZ2dlZF9jaGFyczsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCWlmIChjaGFycyA+IGVuZCkgeworCQlzMSA9IGxvZ19idWYgKyBsb2dfYnVmX2xlbiAtIGNoYXJzICsgZW5kOworCQlsMSA9IGNoYXJzIC0gZW5kOworCisJCXMyID0gbG9nX2J1ZjsKKwkJbDIgPSBlbmQ7CisJfSBlbHNlIHsKKwkJczEgPSAiIjsKKwkJbDEgPSAwOworCisJCXMyID0gbG9nX2J1ZiArIGVuZCAtIGNoYXJzOworCQlsMiA9IGNoYXJzOworCX0KKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkdW1wZXIsICZkdW1wX2xpc3QsIGxpc3QpCisJCWR1bXBlci0+ZHVtcChkdW1wZXIsIHJlYXNvbiwgczEsIGwxLCBzMiwgbDIpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCit2b2lkIGdldF9sb2didWZfaW5mbyh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCSphZGRyID0gX19sb2dfYnVmOworCSpzaXplID0gX19MT0dfQlVGX0xFTjsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2xvZ2J1Zl9pbmZvKTsKKworI2VuZGlmCg==